728x90
728x90
728x90
 

itsecgames.com

 

www.itsecgames.com

[사진 1]

AJAX가 적용된 웹페이지이다. 별도로 버튼을 클릭하지 않아도 서버와 통신하여 영화 정보를 출력해준다.

 

[사진 2]

"Iron Man"을 입력하면 위와 같이 자동으로 영화를 가지고 있다는 문구가 출력된다.

 

[사진 3]

그리고 서버에 존재하지 않는 영화 제목을 입력하면 위와 같이 영화를 찾지 못했다는 메시지가 출력된다.

 

low

[사진 4]

low 레벨이다. 쿠키 값을 출력하기 위해 script 태그를 입력하면 아무 내용도 출력되지 않는다.

 

[사진 5]

페이지 소스를 보면 script 태그는 정상적으로 박혔는데, 메시지는 출력되지 않았다.

 

[사진 6]

burp로 프록시를 설정하여 Request 패킷을 보면 웹페이지가 xss_ajax_2-2.php임을 확인할 수 있다.

 

[사진 7]

위와 같이 URL을 복사하여 브라우저에서 입력하면 입력한 script 태그가 xss_ajax_2-2.php 페이지에서 동작하는 것을 확인할 수 있다.

 

[사진 8]

문제 페이지인 xss_ajax_2-1.php에서 동작하지 않는 이유를 살펴보자. xss_ajax_2-1.php 페이지 소스를 보면 위와 같이 body 태그에 onload 옵션을 통해 process() 함수를 실행하고 있다.

 

[사진 9]

process() 함수를 보면 HTML 태그 중 "title" 값을 id로 가지는 태그를 찾아서 해당하는 태그의 값을 title 변수에 저장하고 xss_ajax_2-2.php 페이지에 파라미터로 전달한다. "title" 값을 id로 가지는 태그는 다음과 같다.

 

[사진 10]

즉, 영화 제목으로 입력한 값이 xss_ajax_2-2.php 페이지의 파라미터로 전달된다.

 

[사진 11]

xss_ajax_2-2.php 소스를 보면 low 레벨일 때 위와 같은 과정을 거치게 된다. 특수문자를 필터링하지 않기 때문에 xss_ajax_2-2.php 페이지에서 XSS 공격이 성공하게 된다.

 

medium

[사진 12]

medium 레벨이다. low 레벨과 다르게 쿠키 값이 출력되지 않는다.

 

[사진 13]

medium 레벨일 때 서버에서 HTTP header의 Content-Type을 JSON으로 설정하였기 때문에 자바스크립트가 먹히지 않는다.

 

high

[사진 14]

high 레벨이다. high 레벨도 자바스크립트가 동작하지 않는데, medium 레벨과 비교하여 다른 점은 특수문자들이 다른 필터링되었다는 점이다.

 

[사진 15]
[사진 15]

서버 코드를 보면 medium 레벨과 마찬가지로 HTTP header의 Content-Type을 JSON으로 설정하였다. 또한, xss_check_3() 함수로 title 파라미터로 전달한 값을 필터링하고 있다.

 

[사진 16]

xss_check_3() 함수는 PHP의 htmlspecialchars() 함수를 사용하여 title 값을 필터링한다. 따라서, 특수문자들이 무력화되기 때문에 XSS 공격은 어렵겠다.

 

* PHP htmlspecialchars() Function

 

PHP: htmlspecialchars - Manual

if your goal is just to protect your page from Cross Site Scripting (XSS) attack, or just to show HTML tags on a web page (showing on the page, for example), then using htmlspecialchars() is good enough and better than using htmlentities().  A minor point

www.php.net

728x90
728x90

+ Recent posts