bWAPP

A1 - Injection : HTML Injection - Reflected (POST)

은율00 2024. 8. 6. 09:30

HTML Injection - Reflected (POST)란?

HTML Injection - Reflected (POST)는 사용자가 입력한 데이터를 HTML 형식으로 처리하여 페이지에 즉시 반영하는 방식의 취약점을 이용한 공격입니다. 이 때, 데이터 전송 방식이 POST 메서드를 사용합니다. 공격자가 악의적인 HTML 또는 JavaScript 코드를 삽입하여, 서버로 전송된 후 응답 페이지에 반영되도록 합니다. 이로 인해 브라우저에서 의도하지 않은 동작이 발생할 수 있습니다.

어떻게 작동하나?

  1. 사용자 입력 : 사용자는 웹 페이지의 입력 폼에 데이터를 입력합니다. 이 데이터는 POST 메서드를 통해 서버로 전송됩니다.
  2. 서버 처리 : 서버는 입력된 데이터를 받아 이를 HTML 페이지의 일부로 처리합니다.
  3. 페이지 반환 : 서버는 처리된 결과를 포함한 HTML 페이지를 생성하여 사용자에게 반환합니다.
  4. 브라우저 처리 : 브라우저는 반환된 HTML 페이지를 렌더링하며, 이 때 삽입된 악의적인 코드가 실행됩니다.

문제점

  • 보안 취약점: 공격자가 악의적인 코드를 삽입할 수 있어 XSS(크로스 사이트 스크립팅) 공격이 발생할 수 있습니다.
  • 데이터 노출: 공격자가 사용자의 쿠키나 세션 데이터를 탈취할 수 있습니다.
  • 피싱 공격: 공격자가 가짜 로그인 페이지를 삽입하여 사용자 정보를 도용할 수 있습니다.

방어 방법

1.입력 데이터 검증 및 필터링:

  • 사용자 입력 데이터를 서버에서 처리하기 전에 검증하고 필터링합니다.
  • 특수 문자를 HTML 엔티티로 변환하여 HTML 태그로 해석되지 않도록 합니다.
  • PHP의 경우 htmlspecialchars() 함수를 사용합니다.

2.웹 애플리케이션 방화벽 (WAF) : WAF를 사용하여 악의적인 입력을 탐지하고 차단합니다.

3. 콘텐츠 보안 정책 (CSP) : CSP 헤더를 설정하여 스크립트의 실행을 제한합니다.

 

Low 단계

실행화면

 

저번 글에서 다루었던 GET 방식과 비교해봤을 때 어떤 차이가 보이나요?

얼추보면 GET 방식과 다를 게 하나도 없어 보이지만, URL을 보시면 GET에선 내가 입력했던 HTML 태그가 POST 방식에선 URL에 표시가 안되고 있는 것을 확인할 수 있습니다. 제가 맨 처음 작성했던 Burp Suite라는 웹 프록시 툴을 이용해 패킷을 확인해보도록 하겠습니다.

준비화면

 

이제 여기서 Intercept is off 버튼을 클릭하여 Intercept is on으로 바꿔준 후에 bWAPP 페이지 go 버튼을 누르면 패킷을 분석 및 변조를 할 수가 있다.

Intercept is off 모드 클릭후 bwapp Go 버튼 클릭

 

16번째 줄을 보면 firsname 과 lastname이 보일 텐데 이쪽에 HTML 코드를 넣어주면 정상적으로 실행될 것입니다.

Burf Suite, Intercept is on이 되었을 때는 인터넷이 안되는 게 정상이니 너무 당황 안하셔도 됩니다.

코드 실행화면

firstname= 부분과 lastname= 부분에 HTMl 코드를 넣고 Intercept is on -> Intercept is off로 변경해주면 정상적으로 HTML 코드가 실행되는 것을 확인할 수 있습니다. ( Intercept is off로 바꾸면 코드가 보이지 않아 코드가 보이는 상태를 캡처했습니다.)

 

Medium 단계

Medium 실행화면

Medium 레벨로 바꾸고 나서는 전 글과 똑같이 HTML 코드가 실행되지 않고 본문에 그대로 문자가 나오는 것을 확인할 수 있습니다.

전에 글 [ HTML Injection - Reflected (GET) ] 과 같은 방식으로 HTML 코드를 URL로 인코딩 후 실행해 보겠습니다.

사진1

인코딩 후 실행하기에 앞서서   [ HTML Injection - Reflected (GET) ] 에서는 인코딩 후 실행하면 됐지만, POST 방식에서는Burp Suite를 보면 아시다시피 <h1>바보</h1> 이 firstname = %3Ch153E%EB%BO%94%EB%BE%B4%3C%2Fh1%3E 로 되어있는 것을 보실 수 있으실텐데 이미 인코딩이 한번 되어서 전달이 되는 것을 확인할 수 있습니다.

 

이럴 때는 '더블 인코딩' 이라는 방식을 사용하시면 됩니다.

Q : '더블 인코딩' 이 무엇인가요?
A : 문자열의 특수 문자를 두 번 인코딩하여 보안 필터를 우회하는 기법입니다. 예를 들어, <를 %3C로 인코딩한 후 다시 %253C로 인코딩하는 방식입니다.

<h1>바보</h1> 더블 인코딩
<a href = "https://google.com" target = _black>click</a> 더블 인코딩

 

더블 인코딩 후 실행 결과

더블 인코딩한 값을 firstname과 lastname 변수에 넣어주었더니 정상적으로 공격이 성공한 것을 볼 수 있습니다.

 

High 단계

High 단계 실행화면

 

High 단게에서는 더블 인코딩을 통한 공격도 실행이 안되는 것을 확인할 수 있습니다.

 

코드 분석

bee-box File System -> /var/www/bWAPP->htmli_post.php로 이동
난이도 별 보안함수

Low단계 case "0" 에서는 보안함수가 아무것도 적용이 안되어 있는 것을 확인할 수 있고

Medium단계 case "1" 에서는 xss_check_1
High 단계 case "2"에서는 xss_check_3 라는 보안함수가 적용된 것을 확인할 수 있습니다.

case "1" Medium 단계

functions_external.php

xss_check_1 함수는 입력된 데이터를 HTML 인젝션 공격으로부터 보호하기 위해 특정 HTML 특수 문자를 이스케이프 처리하는 기능을 수행합니다.

 

$input = str_replace("<", "&lt;", $data);
$input = str_replace(">", "&gt;", $input);

HTML 인젝션 공격을 방어하기 위해 입력된 문자열에서 <와 > 문자를 각각 &lt;와 &gt;로 변환합니다.

 

$input = urldecode($input);

URL 인코딩된 문자열을 디코딩하여, 더블 인코딩(예: %3C가 %253C로 변환된 경우)을 처리합니다.

 

case "2" High 단계

xss_check_3 함수는 주어진 문자열에서 HTML 특수 문자를 HTML 엔티티로 변환하여 XSS 공격을 방지하는 역할을 합니다. 함수는 PHP의 htmlspecialchars 함수를 사용하여 문자열을 안전하게 처리합니다.

 

htmlspecialchars 함수:

  • 이 함수는 문자열에서 특수 문자를 HTML 엔티티로 변환합니다.
  • 변환되는 특수 문자:
    • & (앰퍼샌드) → &amp;
    • " (큰따옴표) → &quot;
    • ' (작은따옴표) → &#039;
    • < (작은따옴표) → &lt;
    • > (큰따옴표) → &gt

xss_check_1 함수와 비교 했을 때 xss_check_3 함수는 더 광범위한 특수 문자를 변환하여 더 강력한 XSS 방어를 제공합니다.