혜랑's STORY

[2020-2학기 웹] : HTML Injection - Reflected(POST) 본문

2020 SISS 21기 활동/2학기 WEB

[2020-2학기 웹] : HTML Injection - Reflected(POST)

hyerang0125 2020. 9. 16. 14:56

1. Burp Suite 이용방법

- Burp Suite란?

 버프 스위트는 프록시를 사용하여 네트워크에서 통신하는 HTTP request를 가로채 분석 및 수정할 수 있으며, 그 외에도 다양한 기능을 이용하여 웹 애플이케이션의 취약점을 테스트하거나 해킹공격을 수행할 수 있는 점검 도구이다.

- 설정 방법

 내가 진행하려하는 실습은 bee box - HTML Injection - Reflected(POST)이다. POST 방식은 GET 방식처럼 URL에 key 값과 value 값을 보내지 않고 데이터를 body에 담아 요청하기 떄문에 사용자가 어떤 데이터를 요청하는지 URL에 표시가 되지 않는다. 즉, GET 방식처럼 key와 value 값이 직접 노출되는 환경은 아니라는 것에 차이가 있다. 

 그러나 버프 스위트를 이용하여 HTTP request를 가로채 개발자가 의도한 방식과 다른 값을 전달하도록 할 수 있다. 이 툴을 이용하기 위해서는 ①프록시(proxy)를 설정해 주어야 한다.

①프록시 설정 방법

 프록시 설정을 했다면, 버프스위트를 실행하여 [Proxy] 탭의 하위 탭인 [Options]에서 ②Proxy Listners 옵션에 설정되어 있는 아이피와 포트가 브라우저에서 프록시 설정한 것과 동일한지 확인한다. 일반적을 아이피 : 127.0.0.1 / 포트 : 8080 으로 설정되어 있을 것이다. (만약 다르다면 수정하기) 

②번 실행화면

  마지막 설정으로 ③요청(Request) 패킷과 응답(Response) 패킷을 가로채기 위한 설정으로 Intercept Client Requests과 Intercept Server Response 바로 아래의 체크박스를 모두 선택해준다.

③번 실행화면

 모든 설정을 완료했따면 [Proxy] 카테고리의 [Intercept] 메뉴에서 ④Intercept is on으로 지정하면 실습할 준비를 모두 마친 것이다.

④번 실행화면

- 예시 : firstname과 lastname 패킷 탈취하기 

예시 실행화면

 

2. 실습 : 검색창에 아무 의미도 없는 값을 입력한 뒤, 유의미한 결과 출력하기

- low level

low level 실습(1) - 무의미한 값 입력하기

 버프 스위트로 무의미한 key와 value 값에 변환하고 싶은 값을 넣은 뒤, [Forward]를 누르면 처음에 입력한 무의미한 값이 아닌 변환하고자 한 유의미한 값으로 변환되어 서버로 전달하게 된다. 즉, 무의미한 값을 입력하고도 유의미한 값을 출력할 수 있는 이유는 버프 스위트의 설정에서 요청 패킷과 응답 패킷을 모두 가로채왔기 때문이다.

버프스위트 실습(1) 영상

 low level의 실습 결과는 이렇다.

low level 실습(2) - 유의미한 값 출력하기

 

- medium level

 low level처럼 무의미한 값을 입력하고 버프 스위트를 이용하여 값을 가로채 변환하였더니 low level의 실행 결과와는 다르게 그냥 문자로 인식하여 출력한다는 것을 알 수 있다.

medium level 실습(1) - 문자로 인식하여 실패

 문자로 인식한 결과를 찾기 위하여 웹 페이지의 소스코드를 확인해보면, form의 정보가 htmli_post.php로 전달됨을 알 수 있다.

웹 페이지 소스코드 확인

 htmli_post.php 코드를 살펴보니 function_external.php에 있는 함수를 사용했다는 사실을 알 수 있다. 

htmli_post.php 코드 중 일부

low level에서 실행되는 함수

functions_external.php 코드 중 일부(1)

medium level에서 실행되는 함수

functions_external.php 코드 중 일부(2)

high level에서 실행되는 함수

functions_external.php 코드 중 일부(3)

medium level에서 사용되는 함수를 살펴보니 '<'과 '>'가 인코딩 된다는 사실을 알 수 있었다. 지난 GET 실습 때와 같이 인코딩 한 값을 사용해보도록 한다.

버프 스위트 실습(2) 영상

결과는 실패다.

medium level 실습(3) - URL Encoding 실패

 실패한 이유를 알아보기 위하여 URL Encoding에 대하여 찾아보니, Double Encoding에 대한 설명을 함께 찾을 수 있었다. 더블 인코딩이란 보안 컨트롤을 우회하거나 응용 프로그램에서 예기치 않은 동작을 일으키기 위해 사용자 요청 매개변수를 16진수의 현식으로 두 번 인코딩하는 방법이다. 이를 사용하면 사용자 입력을 한 번만 디코딩하는 보안 필터를 무시할 수 있다. 즉, medium level을 해결하기 위해서는 이중 인코딩을 삽입하여 보안 필터를 우회해야 한다.

cf> 더블 인코딩 우회 방법"<"는 "%253c", ">" "%253e", "/"는 "%252f"로 바꾸어 입력

버프 스위트 실습(3) 영상

 버프 스위트에 더블인코딩을 우회하여 전달해주니, 정상적으로 잘 출력된다는 것을 알 수 있다.

medium level 실습(2) - 더블 인코딩 우회로 유의미한 값 출력하기

 

- high level

high level은 더블 인코딩을 사용하여도 성공하지 못하였다.

high level 실습 실패 - 더블 인코딩

 이유를 찾아보기 위하여 high level에서 사용된 함수를 찾아보니 UTF-8을 사용하여 인코딩한다는 것을 알 수 있다.

functions_external.php 코드 중 일부(3)

즉, htmlspecialchars()함수를 통하여 특수 문자를 UTF-8로 반환하기 때문에 문제를 해결할 수 없다.