HTML Injection - Reflected 는 매개변수 입력값을 검증하지 않는 페이지에서 공격자가 GET / POST 방식으로 악의적인 HTML 태그를 입력하여, 웹 브라우저가 공격자가 입력한 HTML 태그를 해석하여 결과로 돌려주는 취약점이다. 만약 <script> 태그를 삽입한다면 우리가 아는 XSS 공격이 되는 것이다. 여기서는 XSS 공격은 배제하고 진행하겠다.
이 취약점을 이용하여 공격자는 특정 페이지에 악의적인 URL 을 삽입하고 이후에 사용자가 해당 페이지를 사용할 경우, 해당 URL 로 접근하게 할 수 있다.
bee-box 환경에서 실습해보자!
※ GET 방식과 POST 방식의 차이는 url 에 매개변수 값이 노출되냐 안 되냐의 차이기 때문에 이번 실습은 GET 방식만 진행하도록 하겠다. POST 방식의 경우는 웹 프록시를 이용하면 된다.
Level - low
위와 같이 GET 방식으로 값을 입력하는 페이지가 있을 때, url 에서 입력한 값들이 매개변수로 전달되는 것을 볼 수 있다.
이제 특정 링크를 클릭할 수 있도록 값을 넣어보자!
<a> 태그로 입력한 값이 필터링없이 그대로 화면에 돌려준 것을 볼 수 있다.
Level - medium
이번에는 입력한 HTML 태그를 문자열 그대로 출력해주고 있다. HTML 태그가 필터링되어 있는 듯 하다.
보통 <> 를 필터링하기 때문에 이를 우회하기 위해 태그를 URL 인코딩하여 입력해보았다. 인코딩한 문자는 다음과 같다.
< --> %3c
> --> %3e
/ --> %2f
결과는 의도했던 대로 a 태그를 화면에 돌려주고 있다. 위의 url 을 보면 < 를 두번 url 인코딩한 %253c 라는 값을 볼 수 있다. 때문에 입력값을 검증하는 단계에서 url 디코딩을 한번 수행한다해도 %3c 라는 값으로 남아있기 때문에 태그로 인식될 수 있던 것이다.
Level - high
high level 에서는 medium level 에서 사용했던 url 인코딩이 통하지 않는다.
딱히 이 경우에는 우회할 수 있는 방법이 생각나지 않는다.
소스코드 분석
해당 페이지의 php 파일을 분석해보자! 경로는 /var/www/bWAPP/htmli_get.php 이다.
먼저 switch 문을 통해 각 level 에 따라 다른 함수로 입력값을 넘겨주고 있다.
low(0) 의 경우에는 체크하지 않으므로 따로 보지 않겠다.
medium(1) 일 때 어떻게 체크하고 있는지 보자.
xss_check_1() 함수가 정의된 파일은 funtions_extenal.php 이다.
함수를 보면 < 와 > 를 각각 <, > 로 변환하고 있다.
문제풀이에서 보았듯이, 입력값을 url 인코딩하여 전송하면 더블 인코딩된 값으로 넘어가기 때문에 이 함수를 우회할 수 있던 것이다.
다음은 high(2) 의 xss_check_3() 함수를 보자. 마찬가지로 functions_external.php 에 정의되어 있다.
함수를 보면 예상대로 htmlspecialchars() 함수를 이용하여 필터링하고 있는 것을 볼 수 있다.
이 함수를 쓰는 이상 HTML 태그를 입력하는 것은 불가능한 것으로 알고 있다.
대응 방안
htmlspecialchars() 함수 사용 (우회 가능하다면 X)
'웹 취약점(bee-box)' 카테고리의 다른 글
SSI (Server Side Includes) Injection (0) | 2020.03.25 |
---|---|
PHP Code Injection (0) | 2020.03.25 |
OS Command Injection (0) | 2020.03.25 |
iFrame Injection (0) | 2020.03.24 |
HTML Injection - Stored (0) | 2020.03.23 |