iFrame Injection 은 HTML Injection 중 하나로 iframe 태그를 삽입하는 취약점이다. iframe 태그는 HTML 내용 안에 또 다른 HTML 내용을 출력할 수 있는 태그이다. iframe 은 위치, 높이, 너비를 마음대로 설정할 수 있기 때문에 사용자를 속여 공격을 수행할 수 있다.
bee-box 환경에서 실습해보자!
Level - low
해당 페이지의 url 을 보면 ParamUrl, Paramwidth, Paramheight 이 있는 것을 볼 수 있다. 즉, 페이지에 출력된 내용은 iframe 을 이용하여 robots.txt 파일의 내용을 보여주고 있다. robots.txt 파일은 검색을 제어할 때 사용하는 파일인데 해당 문제에서는 연관이 없기 때문에 내용은 넘어가겠다. 페이지 소스를 보면 다음과 같다.
그럼 이제 robots.txt 파일 내용을 출력해 준 것처럼, 해당 페이지에 또 다른 파일 내용을 출력해보자. 먼저 스크립트를 실행하는 파일을 만들어보자!
해당 페이지가 있는 디렉토리에 다음과 같이 쿠키 값을 가져오는 스크립트 문을 입력하여 cookie.html 이라는 파일을 만들었다.
그리고 나서 다음과 같이 url 을 변조하였다.
http://localhost/bWAPP/iframei.php?ParamUrl=robots.txt" height="250" width="250"></iframe><iframe src=cookie.html></iframe>&ParamWidth=250&ParamHeight=250
빨간 부분이 기존의 url 에 삽입한 내용이며 </iframe> 으로 태그를 끝내주고, 새로운 iframe 태그로 cookie.html 내용을 출력해준다. ParamUrl 부분을 변조했는데 ParamWidth 나 ParamHeight 을 변조해도 상관없다. 요청을 보내면 다음과 같이 쿠키값을 가져오는 것을 확인할 수 있다.
소스코드를 보면 아래와 같이 삽입한 iframe 태그가 잘 들어가 있는 것을 알 수 있다.
Level - medium
low level 에서의 url 을 입력하여도 새로운 iframe 태그가 실행되지 않았다. 필터링이 존재하는 듯 하다. 그래서 ParamUrl 이 아닌 ParamWidth 부분을 수정해보았다. 수정한 url 은 다음과 같다.
http://localhost/bWAPP/iframei.php?ParamUrl=robots.txt&ParamWidth=250"></iframe><iframe src=cookie.html>&ParamHeight=250
수정한 url 을 요청하니 아래와 같이 성공적으로 새로운 iframe 문이 동작하였다.
삽입한 iframe 태그가 어떻게 들어가 있는지 확인하기 위해 소스코드를 보았다.
자세히 보니, width="250 다음에 입력했던 " 앞에 /(역슬래쉬) 가 생긴것을 볼 수 있다. addslashes() 함수가 쓰인 것으로 예상이 된다. 그건 그렇다 치고 ParamUrl 에서는 동작하지 않았는데 ParamWidth 에서는 동작하는 것을 보니 ParamUrl 에 어떤 필터링이 설정되어 있는 것 같다. 확인해보기 위해 url 에서 각각의 입력값을 변경해보았다.
결과를 보면 width 와 height 은 입력값대로 변경되었지만 url 은 cookie.html 이 아닌 기존의 robots.txt 의 내용을 출력하고 있다. 예상했던 대로 ParamUrl 만 어떤 필터링을 하고 있으며, 그 내용은 소스코드를 확인해봐야 알 수 있을 것 같다.
Level - high
어떤 변수의 값을 바꿔도 삽입한 iframe 이 실행되지 않았다. 우회할 방법을 모르겠다.
소스코드 분석
해당 페이지의 php 파일을 분석해보자! 경로는 /var/www/bWAPP/iframe.php 이다.
첫 번째 조건을 보니 low level 에서는 입력값 체크를 하지 않았기 때문에 iframe Injection 이 가능했다는 것을 알 수 있다. 그리고 medium, high level 에서는 각각의 체크 함수로 값을 검증하고 있다. xss_check() 함수가 정의된 functions_external.php 에서 내용을 확인해보았다.
medium level 의 입력값을 검증하는 xss_check_4() 함수에서는 예상했던 대로 addslashes() 함수를 사용하고 있다. 그 외에 다른 내용은 없다.
high level 의 입력값을 검증하는 xss_check_3() 함수에서는 htmlspecialchars() 함수를 사용하고 있다. 이 함수를 우회하지 않는 이상 iframe 태그를 사용하기에는 불가능해 보인다.
두 번째 조건을 보면 medium level 에서 ParamUrl 을 수정할 수 없었던 이유를 알 수 있다. level 이 medium 과 high 일 때는 src 가robots.txt 가 되도록 고정되어 있다. 그리고 나머지 변수는 입력값을 그대로 받도록 되어 있기 때문에 injection 이 가능했던 것이다.
대응 방안
1. htmlspecialchars() 함수 사용 (우회 가능하다면 X)
2. iframe 변수를 모두 고정값으로 받는다.
'웹 취약점(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 |
HTML Injection - Stored (0) | 2020.03.23 |
HTML Injection - Reflected (0) | 2020.03.23 |