728x90
728x90
728x90
 

itsecgames.com

 

www.itsecgames.com

[사진 1]

직전 문제와 동일하게 AJAX가 적용된 웹페이지이다. 문제 제목을 보면 XML을 이용하여 데이터를 관리하는 것 같다.

 

[사진 2]

"Iron Man"을 입력하면 영화 검색 성공 시 메시지가 출력된다.

 

[사진 3]

서버에 존재하지 않는 영화를 검색하면 미안하다고 한다.

 

low

[사진 4]

low 레벨이다. script 태그를 이용하여 쿠키 값을 출력해보면 위와 같이 "undefined" 메시지가 출력된다. 아마도 XML 파일에서 데이터를 찾지 못해 "undefined" 메시지를 반환한 것 같다(추측임).

 

[사진 5]

꺽쇄를 HTML 엔티티로 변환하여 입력하면 위와 같이 error가 발생한다.

 

[사진 6]

burp로 프록시를 잡아서 보면 원본 웹페이지가 아닌 xss_ajax_1-2.php 페이지에 입력 값을 전달한다.

 

[사진 7]

[사진 6]의 URI 값을 복사하여 URL에 붙여넣어도 위와 같이 script 태그가 정상적으로 동작하지 않는다. script 태그가 먹히지 않기 때문에 img 태그를 이용하여 쿠키값을 출력해보자.

 

[사진 8]

img 태그를 이용하여 자바스크립트 함수를 실행할 수 있다.

<img src"#" onerror="document.write(document.cookie)">

 

[사진 9]

AJAX가 적용되었기 때문에 [사진 8]처럼 값을 입력하면 위와 같이 자동으로 웹페이지에 쿠키값이 출력된다.

 

[사진 10]

서버 코드를 보면 HTTP header의 Content-Type을 XML로 설정하고 있다. script 태그와 꺽쇄가 먹히지 않았던 것은 아마도 이 설정때문이지 않을까 싶다(혹시, 아니라면 댓글로 알려주시면 감사하겠습니다.).

 

medium

[사진 11]

medium 레벨이다. low 레벨에서 사용한 값을 입력하면 이미지 아이콘이 출력되고 쿠키값은 출력되지 않는다.

 

[사진 12]

double quote를 HTML 엔티티로 변환하여 입력한다.

<img src="#" onerror="document.write(document.cookie)">

 

[사진 13]

그럼 위와 같이 쿠키 값이 웹페이지에 출력된다.

 

[사진 14]
[사진 15]

서버 코드를 보면 medium 레벨일 때 xss_check_4() 함수로 파라미터 값을 필터링한다. 그리고 xss_check_4() 함수는 addslashes() 함수를 사용하는데, addslashes() 함수는 single quote, double quote, backslash, NULL 값을 무력화시킨다.

즉, [사진 8]의 입력 값중 double quote가 있기 때문에 medium 레벨에서 공격이 먹히지 않은 것이다. double quote를 HTML 엔티티인 "로 변환하여 입력하면 XSS 공격이 먹히게 된다.

 

high

[사진 16]

high 레벨이다. 모든 특수문자를 HTML 엔티티로 변환하고 img 태그를 이용하여 쿠키 값을 출력하려 했지만 일반 문자열로 출력되는 것을 확인할 수 있다.

 

[사진 17]
[사진 18]

그런데, high 레벨에서 HTML 엔티티로 변환하지 않고 img 태그를 이용하면 위와 같이 쿠키 값이 출력된다.

 

[사진 19]
[사진 20]

서버 코드를 보면 high 레벨일 때 htmlspecialchars() 함수로 입력값을 HTML 엔티티로 변환한다. 즉, low, medium 레벨에서는 입력값을 HTML 엔티티로 변환하였지만 high 레벨에서는 서버에서 HTML 엔티티 변환 작업이 이뤄지기 때문에 특수문자를 전달해도 XSS 공격이 먹히게 된다.

728x90
728x90

+ Recent posts