SSI 는 apache.org 에 다음과 같이 설명되어 있다.
다시 말해 방문자 수, 조회 수 등의 동적인 내용을 추가할 때 사용한다고 보면 된다. SSI 를 사용하는 웹 사이트는 .shtml 파일이 존재한다. 때문에 .shtml 파일이 보인다면 SSI 를 사용하고 있다는 것을 알 수 있다.
공격자는 SSI 를 사용하는 웹 사이트에 SSI 지시어를 인젝션하여 원하는 명령어를 실행시켜 악의적인 행위를 할 수 있다.
bee-box 환경에서 실습해보자!
Level - low
ip 를 조회하는 페이지에서 name 을 입력해보았다.
그 결과, name 과 ip 가 출력되었고 위의 url 에서 .shtml 이 존재하는 것을 보니 SSI 를 사용하는 사이트인 것을 알 수 있었다. 때문에 별 다른 필터링이 되어 있지 않다면 html 에서는 SSI 지시어를 결과값으로 바꿔 줄 것이다. SSI 지시어의 element 중에 exec 를 사용하면 명령어를 수행할 수 있다. 기본적인 사용법은 다음과 같다.
<pre>
<!--#exec cmd="ls" -->
</pre>
이를 이용하여 Injection 을 수행해보자!
name 입력창에 <!--#exec cmd="cat /etc/passwd" --> 를 입력하고 Lookup 버튼을 눌러보았다.
명령이 잘 실행된 것을 볼 수 있다.
Level - medium, high
SSI 지시어가 동작하지 않는다. 우회 방법을 찾아내지 못했다.
소스코드 분석
medium 과 high level 에서 각각의 함수로 입력값을 검증하고 있다.
medium level 의 xss_check_4() 를 보면 addslashes() 함수로 필터링을 하고 있다. 이 함수는 SQL Injection 필터링으로 많이 보이는 함수인데 ', '', \, NULL 앞에 \ 를 붙여 문자 그대로 인식하게 하는 함수이다.
high level 의 xss_check_3() 에서는 htmlspecialchars() 함수로 필터링하고 있다.
대응 방안
1. htmlspecialchars() 함수 사용
2. addslashes() 함수 사용
'웹 취약점(bee-box)' 카테고리의 다른 글
XSS - Reflected (0) | 2020.04.03 |
---|---|
XML/XPath Injection(Login Form) (0) | 2020.03.26 |
PHP Code Injection (0) | 2020.03.25 |
OS Command Injection (0) | 2020.03.25 |
iFrame Injection (0) | 2020.03.24 |