이번에는 AJAX 와 XML 을 사용하는 페이지에서의 XSS 공격에 대해 알아보겠다.
bee-box 환경에서 실습해보자!
Level - low
입력폼에 스크립트 문을 입력해도 실행되지 않는다.
img 태그 또한 실행되지 않는다.
이번에는 <> 를 < 와 > 로 바꿔서 입력해보았다.
여전히 script 문은 실행되지 않았다.
치환한 img 태그를 입력해보았다.
img 태그는 성공적으로 실행되었다.
페이지의 소스코드를 보자.
xss_ajax_1.js 파일을 참조하고 있다.
xss_ajax_1.js 를 보면 xss_ajax_1-2.php 로 입력값을 전달하고 있다.
값이 전달되는 과정을 보기 위해 burf suite 를 이용하였다. chrome 에서 자체적으로 XSS 를 필터링하지만 burf suite 의 해당 옵션을 이용하면 필터링 없이 수행할 수 있다.
옵션을 체크한 다음, <img src=a onerror=alert(1)> 요청을 프록시를 통해 보았다.
소스코드에 보았듯이 xss_ajax_1-2.php 로 값이 전달되고 있었고, 해당 url 로 접근해보았다.
필터링 없이 입력한 값이 잘 적용되어 있었다.
Level - medium
medium level 에서도 <img src=a onerror=alert(1)> 를 입력했을 때 정상적으로 동작했다.
Level - high
high level 에서는 입력한 태그가 그대로 출력되었다.
burf suite 의 Repeater 를 이용해서 값이 어떻게 전달되었는지 확인했다.
전달된 값을 보니 < 와 > 의 & 문자가 & 로 치환되고 있었다. 오히려 특수문자로 변환한 것이 필터링되고 있었다. 그래서 기존의 <> 를 이용해서 값을 전달해보았다.
그 결과, alert 가 띄워지는 것을 볼 수 있었다.
소스코드 분석
xss_ajax_1-2.php 를 보면 다음과 같이 단계별로 필터링하고 있다.
medium level 의 xss_check_4() 에서는 addslashes() 함수를 통해 필터링하고 있다. 때문에 입력값에 ', ", \ 를 사용하지 않았기 때문에 영향이 없었다. 만약, 큰따옴표(") 를 사용해야 한다면 " 로 치환하면 우회할 수 있다.
high level 의 xss_check_3() 에서는 htmlspecialchars() 함수를 통해 필터링하고 있다. high level 에서 입력한 <> 는 이 함수를 통해 < 와 > 로 바뀔 것이고, 이것은 다시 HTML 코드로 인식되는 과정에서 <> 로 바뀔 것이다. 때문에 <img> 태그를 그대로 입력했을 때 xss 공격이 가능했던 것이다.
'웹 취약점(bee-box)' 카테고리의 다른 글
XSS - Reflected(Referer) (0) | 2020.04.10 |
---|---|
XSS - Reflected(Login Form) (0) | 2020.04.10 |
XSS - Reflected(AJAX/JSON) (0) | 2020.04.06 |
XSS - Reflected(JSON) (0) | 2020.04.06 |
XSS - Reflected (0) | 2020.04.03 |