보안개구리
[A-1 Injection]HTML Injection - Reflected(GET) 본문
HTML Injection - Reflected(GET)
HTML Injection이란 웹 보안 취약점 중 하나로, 공격자가 웹 애플리케이션에 악성 HTML 코드를 삽입할 수 있는 취약점을 악용하는 공격 기법입니다.
[Low Level]
1) First name에 'Hong'을 Last name에 'Gildong'을 입력한 후 Go 버튼을 클릭합니다.

2) 입력했던 First name과 Last name이 Go 버튼 아래 Welcome이라는 문구와 함께 출력되었습니다. 해당 과정을 Burp Suite를 통해 확인해보겠습니다.

3) 응답값을 확인해보면 현재 우리가 입력했던 이름 값이 <div> 태그내 삽입되어 있는 것을 확인하였습니다.

4) 이번에는 First name 값에 Hong 대신 <h1>Hong</h1>이라는 값을 입력 시 <h1>태그가 정상적으로 동작함을 확인하였습니다.


5) 이번에는 Last name에 <iframe src="http://192.168.0.45/bWAPP/iframei.php"> 구문을 입력해보도록 하겠습니다. (해당 URL은 비박스 실습 URL 중 하나이지만 악성 URL이라 가정)

6) iframe 태그를 이용하여 페이지 내 URL 삽입에 성공하였습니다.

7) 위 방식처럼 이름을 입력하는 칸에 html 태그를 삽입하여 공격할수도 있지만 해당 페이지는 GET 방식이기 때문에 http://192.168.0.45/bWAPP/htmli_get.php?firstname=%3Ch1%3EHong%3C%2Fh1%3E&lastname=%3Ciframe+src%3D%22http%3A%2F%2F192.168.0.45%2FbWAPP%2Fiframei.php%22%3E&form=submit 이처럼 URL 내 파라미터값에 html 태그를 입력하여 공격을 실행할 수도 있습니다.
[Medium Level]
이번에는 Medium Level에서 실습을 해보겠다.
Low level에서 실습을 했던 것처럼 바로 h태그를 사용하여 이름을 입력해보겠다.

Low lever과는 다르게 welcom 이후 'h'태그가 사용되지 않고 텍스트 형식으로 표시되는 것을 확인할 수 있다.

이 때 페이지 소스를 확인하면 low level 때와는 다르게 입력했던 '<', '>'가 안 보이고 입력하지도 않았던 '<', '>' 이런 문자들이 보인다.
Medium level의 경우는 case1즉 xss_check_1 함수를 사용한다고 했는데 해당 함수 내용에 대하여 살펴보겠다.

xss_check_1 함수 부분인데 해석하면 다음과 같다
function xss_check_1($data){ //데이터를 입력 받음
$input = str_replace("<", "<", $data); // 입력받은 데이터에 "<"가 있으면 "<"로 치환
$input = str_replace(">", ">", $input); // 입력 받은 데이터에 ">"가 있으면 ">"로 치환
$input = urldecode($input); // 위 과정을 마친 데이터를 디코딩
return $input; // 위모든 과정을 마친 데이터를 반환
}
한마디로 입력된 데이터를 가지고 <, >가 있다면 다른 문구('<', '>')로 필터링한 후 디코딩까지 하여 다시 클라이언트에 보내준다는 내용인데 여기서 str_replace이 부분 때문에 우리가 기존에 사용하단 <h1>이 사용되지 않는 것이다.
여기서 해결 방안은 '<'를 사용하지 않고 보내는 것인데 다행히 함수 내에서 자체적으로 디코딩을 해주기 때문에 우리는 인코딩을 한 데이터를 보내어 str_replace를 우회하면서 디코딩된 값을 받을 수 있다.
기존에 작성했던 데이터 부분은 인코딩을 해서 보내보겠다.


우회에 성공한 것을 확인했다.
[High Level]
실습에 앞서 위에서 언급한 것처럼 high level의 경우 xss_check_3 함수를 사용한다.

주석 부분을 제거하고 살펴보면
function xss_check_3($data, $encoding = "UTF-8"){
return htmlspecialchars($data, ENT_QUOTES, $encoding);
}
UTF-8 방식으로 인코딩을 진행하며 입력받은 데이터에 대하여 htmlspecialchars 함수를 적용시키겠다는 건데 htmlspecialchars의 경우 문자열에서 지정된 특수문자를 HTML로 변환시키는 함수이다.
quote_style로 지정할 수 있는 게 다음 3가지이다.
ENT_COMPAT : 기본 모드. 겹 따옴표(")만 변환
ENT_QUOTES : 홀 따옴표('), 겹 따옴표(") 변환
ENT_NOQUOTES : 모든 따옴표 변환 X
그리고 주석을 보면 알 수 있듯이 &, ", ', <, > 이 기호에 대하여 변환이 된다고 나와있다.
medium level에서 실습한 것처럼 인코딩 된 데이터를 보내보겠다.

인코딩한 데이터가 그대로 보인다는 것을 확인할 수 있다.
[정리]
[Low Level]
- 대응 방법 : 입력값에 대한 검증이 따로 없음
- 공격 방법 : 입력값에 대한 검증이 따로 없었기 때문에 단순한 HTML 태그를 가지고도 Injection 공격에 성공할 수 있었다.
[Medium Level]
- 대응 방법 : str_replace() 함수를 사용하여 일부 특수 문자('<', '>')에 대하여 다른 값('<', '>')으로 치환함
- 공격 방법 : 특수 문자('<', '>')를 사용할 수는 없으나 함수 내 자체적으로 디코딩을 해준다는 취약점을 존재하여 인코딩된 값을 입력하여 str_replace() 함수를 우회
[High Level]
- 대응 방법 : htmlspecialchars() 함수를 사용하여 입력받는 값 중 지정된 특수문자들에 대하여 HTML로 변환시킴
- 공격 방법 : X
- HTML Injection 공격에 대해서는 htmlspecialchars() 함수를 사용하여 대응할 수 있다.
'웹 진단 > bWAPP 실습' 카테고리의 다른 글
[A-1 Injection]LDAP Connection Settings - 풀이중 (0) | 2024.06.14 |
---|---|
[A-1 Injection]iFrame Injection (0) | 2024.06.14 |
[A-1 Injection]HTML Injection - Stored (Blog) (0) | 2024.06.14 |
[A-1 Injection]HTML Injection - Reflected (URL) (0) | 2024.06.14 |
[A-1 Injection]HTML Injection - Reflected(POST) (0) | 2024.06.14 |