보안개구리

[A-1 Injection]HTML Injection - Reflected(GET) 본문

웹 진단/bWAPP 실습

[A-1 Injection]HTML Injection - Reflected(GET)

보안개구리 2024. 6. 14. 11:33

 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 때와는 다르게 입력했던 '<', '>'가 안 보이고 입력하지도 않았던 '&lt', '&gt' 이런 문자들이 보인다.

 Medium level의 경우는 case1즉 xss_check_1 함수를 사용한다고 했는데 해당 함수 내용에 대하여 살펴보겠다.

 

 xss_check_1 함수 부분인데  해석하면 다음과 같다

function xss_check_1($data){                     //데이터를 입력 받음
  $input = str_replace("<", "&lt;", $data);      // 입력받은 데이터에 "<"가 있으면 "&lt"로 치환
  $input = str_replace(">", "&gt;", $input);    // 입력 받은 데이터에 ">"가 있으면 "&gt"로 치환
  $input = urldecode($input);                        // 위 과정을 마친 데이터를 디코딩
  return $input;                                             // 위모든 과정을 마친 데이터를 반환
}

 한마디로 입력된 데이터를 가지고 <, >가 있다면 다른 문구('&lt', '&gt')로 필터링한 후  디코딩까지 하여 다시 클라이언트에 보내준다는 내용인데 여기서 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() 함수를 사용하여 일부 특수 문자('<', '>')에 대하여 다른 값('&lt', '&gt')으로 치환함

 - 공격 방법 : 특수 문자('<', '>')를 사용할 수는 없으나 함수 내 자체적으로 디코딩을 해준다는 취약점을 존재하여 인코딩된 값을 입력하여 str_replace() 함수를 우회

 

 [High Level]

 - 대응 방법 : htmlspecialchars() 함수를 사용하여 입력받는 값 중 지정된 특수문자들에 대하여 HTML로 변환시킴

 - 공격 방법 : X

 

 - HTML Injection 공격에 대해서는 htmlspecialchars() 함수를 사용하여 대응할 수 있다.