상세 컨텐츠

본문 제목

[Bee-Box] 반사된 XSS 취약점

해킹공부/웹해킹 실습

by 밍구21 2022. 8. 2. 17:54

본문

반사된 XSS (Reflected Cross-Site Scripting)

: 웹페이지 URL에 존재하는 파라미터악의적인 스크립트 코드를 입력하여 사용자가 URL을 클릭하면 파라미터에 입력한 악성 스크립트 코드가 실행되게 하는 공격

 

시나리오

 : 스크립트 코드가 포함된 URL을 메일로 전송하거나 게시글로 등록하여 사용자가 클릭하도록 유도

 

특징

 : 사용자가 알아채기 쉽다

   일부 브라우저에서 해당 공격에 대한 대응을 하고 있다 -> 저장된 XSS보다 위협이 적다

    BUT 악성서버로 유도되면 저장된 XSS와 위협은 동일 -> 입력 값 검증 필요

 

 

10.1 GET

1) 실습

공격 시나리오를 수행하기 전에 xss_get.php 페이지의 동작을 보고 싶어 First name 칸에 가나, Last name 칸에 다라를 입력하였다. Go 버튼을 누르면 페이지 하단에 'Welcome 가나 다라'라는 문구가 뜬다.

 

 

 

 'xss_get.php' 페이지에 XSS 취약점 존재 유무 확인을 위해 First name 입력란에 스크립트 코드를 입력

 

<script>alert('Succeed')</script>  -> 실행 성공 시, 즉 XSS 취약점 존재 시 'Succeed'라는 경고창을 출력하는 코드 입력. Last name 칸에는 아무 값이나 입력한다.

 

 

 

Go 버튼 클릭 시 Succeed라는 경고창이 떴다. 그러므로 해당 페이지에는 XSS 취약점이 있는 걸 확인할 수 있다.

 

 

 

 

경고창의 확인 버튼을 누르자 페이지 하단에 'Welcome amugeona'라는 문구가 뜨는 걸 볼 수 있다. 아까 봤다시피 Welcome 뒤에 First name, Last name 순으로 와야 하는데 First name에 스크립트를 입력했으므로 Last name 값만 출력함을 알 수 있다.

 

 

 

2) 대응방안

난이도 상에서는 입력값을 문자로 인식하여 XSS 취약점이 존재하지 않는다. 위 사진처럼 스크립트를 입력해도 실행되지 않고 문자열로 받아지는 걸 볼 수 있다.

 

 

페이지 소스코드를 확인해보자. 난이도 상은 security level이 2로 설정되어 있다. xss_check_3함수를 통해 입력 데이터를 우회처리 해준다.

 

 

xss_check_3함수는 htmlspecialchars() 함수를 이용해서 data의 특수문자들을 html 엔티티 코드로 변환하고 UTF-8로 인코딩 해준다. 그러므로 스크립트 코드를 입력해도 브라우저는 문자로 인식한다.

 

htmlspecialchars() : 문자열에서 특정 문자를 html 엔티티 코드로 변환

htmlspecialchars() 함수가 우회하는 특수문자는 &, ", ', <, >

ENT_QUOTES 옵션 : 작은 따옴표와 큰 따옴표 모두 변환

 

 

 

 


10.2 POST

0) 배경

해당 페이지는 POST 메소드를 사용해 HTTP 연경 요청을 하는 페이지이다. 

 

1)

실습_1

 'xss_get.php' 페이지에 XSS 취약점 존재 유무 확인을 위해 First name 입력란에 스크립트 코드를 입력

 

<script>alert('Succeed');</script>  -> 실행 성공 시, 즉 XSS 취약점 존재 시 'Succeed'라는 경고창을 출력하는 코드 입력. Last name 칸에는 아무 값이나 입력한다.

 

Go 버튼 클릭 시 Succeed라는 경고창이 떴다. 그러므로 해당 페이지에는 XSS 취약점이 있는 걸 확인할 수 있다

 

GET 페이지와 마찬가지로 FirstName 칸에는 스크립트 코드가 실행되었기 때문에 LastName 칸에 입력한 내용만 뜨는 걸 볼 수 있다. 

 

 

 

 

실습_2    //난이도 중

난이도 중 페이지는 FIrstName에 'Succeed' 출력 스크립트 코드를 입력하여도 스크립트 코드를 실행하지 않고 LastName에 입력한 값만 출력한다. 특수문자를 우회하는 방법을 사용한 것이지만 이 경우에도 XSS 취약점이 존재한다. 

 

위처럼 쿠키값을 출력하는 메시지 스크립트 코드를 입력한다.

 

그럼 쿠키값 메시지가 출력되는 걸 알 수 있는데 이를 통해 특수문자를 우회하는 방법을 사용한 것임을 알 수 있다. 왜냐하면 alert('Succeed')는 특수문자 작은따옴표가 사용돼 스크립트 코드가 실행되지 않았지만  alert(document.cookie)는 작은따옴표가 사용되지 않아 스크립트 코드가 실행되었기 때문이다.

 

<script>alert(String.fromCharCode(83,117,99,99,101,101,100,33))</script>

-> 작은따옴표를 사용하지 않는 Succeed 출력 스크립트 코드를 입력한다. 

 

Go를 누르면 스크립트 코드가 실행됨을 볼 수 있다. 위 실습들과 마찬가지로 확인 버튼을 누르자 FirstName 칸은 스크립트로 인식돼 문자열이 출력되지 않고 LastName에 입력한 다라만 출력되는 걸 볼 수 있다. 

 

 

난이도 중에서는 addslashes 함수를 사용해 XSS에 사용되는 특수문자 중 ', ", \, NULL 문자 앞에 슬래시를 추가해 스크립트 코드를 실행하지 못하게 한다. 하지만 위 문자들을 사용하지 않는 스크립트 코드는 실행되는 허점이 존재한다.

 

 

2) 대응방안

 htmlspecialchars 함수를 통해 우회한다. 해당 함수의 두번째 인자에 ENT_QUOTES를 추가하여 XSS에 사용되는 특수문자들을 HTML엔티티 코드로 변환시킨다. 그러면 스크립트 코드를 입력해도 웹브라우저는 문자로 인식한다. 해당 함수가 우회하는 특수문자는 &, ", ', <, >이다.

관련글 더보기