지난번에 이어 이번에는 HTML Injection - Stored 취약점에 대해 알아보겠다.
Reflected 방식은 서버에 저장되지는 않는다. 그와 반대로 Stored 방식은 공격자가 서버에 HTML 태그를 저장시키고, 이후에 사용자가 해당 태그가 저장된 페이지를 열람할 경우 공격자의 태그가 실행되는 방식이다. Reflected 방식때와 마찬가지로 XSS 공격은 배제하고 진행하겠다.
bee-box 환경에서 실습해보자!
Level - low
위와 같이 특정 게시판에서 <h1> 태그를 이용하여 글을 작성해보았다.
아무런 필터링이 되어 있지 않아 <h1> 태그가 그대로 반영되어 글이 작성되었다.
HTML 태그가 필터링되지 않기 때문에 원하는 형식으로 글을 작석한 뒤, 사용자가 링크로 이동하게끔 유도할 수 있다.
Level - medium, high
medium level 과 high level 에서는 동일하게 HTML 태그가 문자열 그대로 출력된다. 우회할 방법을 찾지 못했다.
소스코드 분석
해당 페이지의 php 파일을 분석해보자! 경로는 /var/www/bWAPP/htmli_stored.php 이다.
위와 같이 모든 level 에서 입력값들을 sqli_check_3() 이라는 함수에서 검증하고 있다.
sqli_check_3() 함수가 정의된 functions_external.php 에서 내용을 확인해보았다.
sqli_check_3() 함수를 보면 mysqli_real_escape_string() 함수가 실행되고 있다.
이 함수는 보통 SQL Injection 을 차단할 때 많이 사용되는데, ₩(역슬래시) 를 이용하여 메타문자를 막는 기능을 하는 함수이다.
이 문제에서는 해당 함수로 인해 submit 을 누를 때 바로 스크립트가 실행되는 것을 방지할 수 있다.
sqli_stored.php 에 있는 또 다른 조건문을 보면 level 이 1 일 때와 2 일 때에는 xss_check_3() 함수를 실행하는 것을 볼 수 있다.
그리고 low level 일 때는 그대로 entry 를 출력해주고 있다.
xss_check_3() 를 보면 htmlspecialchars() 함수를 이용하여 필터링하고 있기 때문에 html 태그 사용이 불가능했던 것이다.
대응 방안
htmlspecialchars() 함수 사용
'웹 취약점(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 - Reflected (0) | 2020.03.23 |