HTML Injection - Reflected (POST) 방식은 지난 실습에서 했던 GET방식과는 달리 URL에 key값과 value값을 전달하지 않고, body에 담아 요청한다. 따라서 사용자가 어떤 데이터를 요청하는지 URL에 표시되지 않기 때문에 GET방식보다는 안전하다.

그러나 burp suite 도구를 사용하면 POST방식이라도 서버로 전송되는 요청/응답 패킷을 중간에 가로채 변조할 수 있다.

Burp Suite 설정 방법

Proxy Listeners

Proxy -> Options에서 프록시 서버로 사용될 곳의 ip와 포트를 정해준다.

 

프록시 설정

인터넷 설정에서 Burp Suite에서 설정한 프록시 주소와 포트를 입력해준다. (둘이 일치해야 함)

 

Intercept Client Requests & Intercept Server Responses

Request / Response 요청에 대한 인터셉트 여부에 체크한다.


Quest. 분명 당신은 검색 창에 아무 의미도 없는 값을 입력했습니다. 하지만 burp suite라는 취약점 분석 도구를 통해 아래의 유의미한 결과를 출력할 수 있게 되었습니다. 이 도구를 통해 아무 값을 입력하여 아래 두 번째 사진과 같이 출력하세요.

Quest 1

 

  ① level low

POST방식에서는 URL에서 변수값을 확인할 수 없다. 입력 창에 아무 의미도 없는 문자를 입력하고, 변수값이 어떻게 전달되는지 확인하기 위해 burp suite를 사용했다. 

 

burp suite에서 확인한 htmli_post.php

burp suite으로 htmli_post.php를 보니 맨 마지막 줄에 firstname과 lastname 변수값을 확인할 수 있었다.

 

htmli_post.php 변경

여기서 firstname 변수값을 <h1>Success</h1>, lastname 변수값을 <img+src="http://192.168.0.16/bWAPP/images/bee_1.png">로 바꿨다.

 

level low 실행결과

그 결과 맨처음의 두번째 사진과 똑같은 결과를 얻을 수 있었다.

 

  ② level medium

패킷 변조 실패

level low와 동일한 방법으로 burp suite로 요청 패킷을 가로채 firstname과 lastname 값을 바꿨지만 html코드를 인식하지 않고 위 사진처럼 문자열로 출력됐다.

 

html 코드

문제 확인을 위해 해당 페이지의 소스를 보니 form의 정보가 htmli_post.php로 전달되는 것을 알 수 있었다.

 

htmli_post.php 파일에서 htmli 함수

htmli_post.php 파일에서 level medium일 때 전달 받은 정보를 xss_check_1 함수가 처리하는 것을 알 수 있었다.

 

xss_check_1 함수

htmli_post.php 파일의 include("function_external.php"); 코드를 보고 function_external.php 파일을 열어서 xss_check_1가 <와 >를 &lt&gt로 변환하고, urldecode하는 함수임을 확인했다. 따라서 지난 실습 때처럼 url encoding을 사용해서 우회하려고 한다.

 

burp suite - url encoding
url encoding 우회 실패

하지만 결과는 실패다.

 

url encoding

이번에는 burp suite말고 입력창에 url encoding한 문자열을 입력해봤다.

 

burp suite proxy

burp suite로 확인해보니 url encoding한 문자열이 한 번더 url encoding된 것을 확인할 수 있었다. (% → %25)

 

실행결과

실행결과도 제대로 나온 것을 확인할 수 있다.

 

이처럼 url encoding을 두 번 하는 것을 double encoding이라고 한다. 보통 XSS 등의 공격을 할 때, 서버에서 필터링 루틴이 존재하면 이를 우회하기 위해 사용한다. double encoding은 단순히 url encoding을 두 번 하는 것이 아니라 먼저 hex로 변환 후 url encoding 순서로 진행한다.

 

이제 double encoding을 이용해서 중간에 패킷을 변경해보겠다.

아무 값이나 입력
double encoding - 패킷값 변조
level medium 실행결과

성공!

 

  ③ level high

double encoding 우회 실패

level medium과 동일한 방법으로 double encoding을 사용했지만 우회에 실패했다.

 

htmli_post.php - htmli 함수
xss_check_3 함수

htmli_post.php에서 level high일 때 xss_check_3 함수가 동작한다. xss_check_3 함수를 외부 파일 functions_external.php에서 확인할 수 있다. 위 사진처럼 htmlspecialchars함수 때문에 $data가 UTF-8로 반환되고, HTML 코드가 특수문자가 아닌 일반문자로 인식된다. 따라서 HTML 코드를 삽입하여 실습화면을 출력할 수 없다.

복사했습니다!