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

[비박스를 활용한 웹 취약점 진단] 1-1. 인젝션 [HTML 인젝션(GET)]

by Robert8478 2023. 12. 11.

인젝션이란? - 공격자가 악의적으로 데이터를 주입하고 웹 애플리케이션에서 이를 데이터베이스의 정상적인 쿼리의 일부로 인식해서 정상쿼리와 함께 악의적인 쿼리를 수행함으로써 발생하는 취약점으로, 데이터를 입력받거나 DB정보를 요청하는 곳에 공격한다.
유형으로는 SQL인젝션, LDAP 인젝션, HTML 인젝션, OS 커맨드 인젝션 등이 있다.
대표적인 SQL 인젝션은 데이터베이스에 악의적인 쿼리로 요청하여 DB의 내용이 노출될 수 있다.

HTML인젝션은 취약한 매개변수에 악의적인 HTML 코드를 삽입하는 공격이다. 
보통 HTML 태그를 삽입해서 사용자가 요청한 연결 페이지에 의도치 않은 내용을 보게하거나 악성 사이트로 이동시킨다.

Reflected 반사 기법은 URL에 악의적인 HTML 태그를 삽입해서  사용자가 링크를 클릭하면 사용자 pc에서 html 태그가 실행되게 한다.
GET 방식으로 데이터 전송 시 URL에 변수명과 입력값을 노출한다.

Stored 저장 기법은 HTML 태그를 DB에 저장하고 저장된 태그를 확인한 사용자 PC에 html 태그가 실행되게 한다.
게시판에 stored로 올리는 방식으로 사용한다.


[난이도 하]

이제 비박스 BWAPP에서 HTML Injection - Reflected(GET)을 선택하자.
그러면 htmli_get.php가 나온다.
텍스트 필드에 악성 html 태그를 입력해보자.
src로 이미지를 불러올건데 bWAPP의 images 디렉터리에 이미지 파일들이 있다.

(이미지 파일들) 여기 owasp.png를 써보겠다.

예제)
<h1>HelloWorld</h1> - 헤딩 태그 , 제목 표기할때 사용
<img src=http://192.168.56.102/bWAPP/images/owasp.png> - 이미지 태그, src 속성으로 입력한 경로의 owasp.png 이미지 출력

위 예제를 First name과 last name에 순서대로 넣어주고 Go를 누르면 아래처럼 나온다. 이를 사용자에게 유도하려면

URL 주소인 http://192.168.56.102/bWAPP/htmli_get.php?firstname=<h1>HelloWorld</h1>&lastname=<img src=http://192.168.56.102/bWAPP/images/owasp.png>&form=submit 를 보내주면 될것이다.

위처럼 GET 메서드로 보내기 때문에 위쪽 URL 입력 부분에 저렇게 변수가 노출되는 것이다.


[난이도 중]

우측 드롭다운 메뉴에서 medium으로 난이도를 중으로 한 후 Set을 눌러주자.
그리고 위와 동일한 구문을 넣어보자.

그랬더니 이번엔 태그가 활성화는 안되는것 같다. 대신 URL은 여전히 노출되는 상황이다.
아무래도 <> 문자열을 필터링해서 태그를 필터링시켜 버리는것 같다.
이럴때는 <> 문자열을 URL 인코딩해서 넣어보자.
URL 인코딩은 아스키코드 Hex 값 앞에 %를 붙인것이다.
< 는 %3C, >는 %3E가 된다. <>만 인코딩 구문으로 바꿔서 넣어보자.

그러면 %3Ch1%3EHelloWorld%3C/h1%3E 와 %3Cimg src=http://192.168.56.102/bWAPP/images/owasp.png%3E 가 될것이다.

그랬더니 정상적으로 태그가 처리된 것을 볼 수 있다.

[난이도 상]

난이도를 상으로 변경하니 중에서 먹히던 구문도 먹히지 않는다.
아무래도 받는 값을 전부 문자열로 출력하는듯 싶다.
공격을 시도하기 전에 보안 코드를 살펴보자. htmli_get.php를 보면 될것같다.
찾아보니 /var/www/bWAPP 경로 안에 있었다.

보아하니 xss_check_3 라는 함수에서 필터링을 하는 듯 하다. include를 보면 functions_external.php가 있는데 여기서 관리할것 같다.

htmlspecialchars 함수로 입력값을 우회하는 것을 볼 수 있다. 이는 기본제공 함수로써, html에서 사용하는 특수문자를 UTF-8로 변경하는 함수이다. 유니코드 한 문자를 4바이트까지 인코딩하고 아스키코드도 호환되며 & ' " < > 와 같은 특수문자를 변환한다.

즉, 입력값에 htmlspecialchars 함수를 사용해주어야 어느정도 안전성을 보장할 수 있다는 것이다.
htmlspecialchars 함수가 적용된 이상 high 레벨을 클리어하는 것은 어렵다고 봐야 한다.
하지만, 그렇다 해도 완벽하게 html 인젝션을 막을 수 있는것은 아니다.
htmli_get.php?firstname=data:text/html;base64,PHNjcmlwdD5hbGVydCgiWFNTIik8L3NjcmlwdD4=
위처럼 인코딩한 구문을 넣는다면 인식을 하지 못해 쿼리가 넘어갈 수도 있다.

<h1>HelloWorld</h1> 는 77u/PGgxPkhlbGxvV29ybGQ8L2gxPg==
<img src=http://192.168.56.102/bWAPP/images/owasp.png> 는 77u/PGltZyBzcmM9aHR0cDovLzE5Mi4xNjguNTYuMTAyL2JXQVBQL2ltYWdlcy9vd2FzcC5wbmc+

를 넣어주면

http://192.168.56.102/bWAPP/htmli_get.php?firstname=data:text/html;base64,%EF%BB%BF77u/PGgxPkhlbGxvV29ybGQ8L2gxPg==&lastname=data:text/html;base64,%EF%BB%BF77u/PGltZyBzcmM9aHR0cDovLzE5Mi4xNjguNTYuMTAyL2JXQVBQL2ltYWdlcy9vd2FzcC5wbmc+==&form=submit

하지만 값을 넣어도 정상적으로 되지 않았다. 그러므로 html reflected 인젝션을 막는 좋은 방법은 htmlspecilachars 함수를 사용하는 것이다.