이번에는 AJAX 와 JSON 을 사용하는 페이지에서의 XSS 공격에 대해 알아보겠다. Ajax 는 javascript 를 이용하여 비동기식 통신을 한다. 때문에 요청 버튼 없이 즉각적으로 값의 유효성을 검사할 수 있다.
bee-box 환경에서 실습해보자!
Level - low
입력폼에 값을 입력했을 때, 바로 요청 결과를 보여준다. 하지만 script 문은 실행되지 않는다.
소스코드를 통해 입력한 값이 어떻게 처리되는지 확인해보자.
스크립트 태그안의 ajax 소스를 보면 위와 같이 입력값을 GET 방식으로 xss_ajax_2-2.php 에 보내는 것을 확인할 수 있다. 그래서 해당 url 에 title 값으로 스크립트 문을 입력해보았다.
위와 같이 xss_ajax_2-2.php 에서는 스크립트 문이 실행되었다.
또 다른 방법은 <img> 태그를 이용하는 것이다. img 태그의 옵션 중 onerror 는 이미지 에러가 발생하면 실행될 것을 설정하는 옵션이다. 이를 이용하여 이미지 에러를 유도하고 alert 를 실행시킬 수 있다. 코드는 다음과 같다.
<img src=a onerror=alert(1)>
입력폼에 위의 태그값을 입력하면 xss_ajax_2-1.php 에서도 정상적으로 alert 를 띄울 수 있다.
Level - medium
low level 과 동일하게 url 요청을 보냈을 때, medium level 에서는 JSON 문법으로 스크립트 문이 그대로 출력되었다.
하지만 img 태그를 이용하면 alert 를 띄울 수 있었다.
Level - high
high level 에서도 마찬가지로 JSON 문법으로 스크립트 문이 출력되었다. 그리고 추가로 <> 이 변환된 것을 볼 수 있었다.
img 태그 또한 동작하지 않았다.
소스코드 분석
medium level 에서는 header() 함수를 통해 Content-Type 을 json 으로 보내고 있었다. 이를 통해 자바스크립트 코드의 실행을 차단할 수 있었다.
xss_ajax_2-2.php 의 소스코드를 분석해보았다.
high level 도 마찬가지로 header() 함수를 사용하고 있었다.
그리고 xss_check_3() 함수도 수행되고 있었는데, 이 함수는 이전 실습들에도 많이 나왔듯이, htmlspecialchars() 함수가 동작하여 <> 를 필터링하기 때문에 스크립트 문은 물론이고 다른 태그들도 사용이 불가능하다.
대응 방안
htmlspecialchars() 함수 사용
'웹 취약점(bee-box)' 카테고리의 다른 글
XSS - Reflected(Login Form) (0) | 2020.04.10 |
---|---|
XSS - Reflected(AJAX/XML) (0) | 2020.04.06 |
XSS - Reflected(JSON) (0) | 2020.04.06 |
XSS - Reflected (0) | 2020.04.03 |
XML/XPath Injection(Login Form) (0) | 2020.03.26 |