사자자리

[bWAPP] HTML Injection - Reflected (POST) 본문

웹해킹/bWAPP

[bWAPP] HTML Injection - Reflected (POST)

renne 2022. 7. 17. 05:51

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

 

패킷(packet)

 인터넷 소프트웨어에는 4개의 계층(응용 계층, 전송 계층, 네트워크 계층, 링크 계층)이 있다. 각 계층은 소프트웨어 코드들로 이루어진다. 대개 메시지는 응용 계층에서 발생한다. 메시지는 전송을 위해 준비하는 과정에서 응용, 전송, 네트워크 계층으로 전달되며, 최종적으로 링크 계층에 의해 전송된다. 목적지의 링크 계층에서 전송된 메시지를 수신하면, 메시지는 목적지의 응용 계층에 도달할 때까지 계층을 따라 올라간다.

 응용 계층은 인터넷상에서 메시지를 주고받기 위해 전송 계층을 이용한다. 전송 계층은 응용 계층으로부터 메시지를 받아서 긴 메시지를 작은 조각들(패킷)로 분할한 다음, 조각들을 한 개씩 인터넷상에서 전송한다. 수많은 메시지들이 엇갈리는 인터넷 라우터들에서 긴 메시지는 다른 메시지의 흐름을 방해할 수 있으므로 메시지의 분할이 필요하다.

 

프록시 서버(proxy server)

 - 서버의 적대적 행위로부터 클라이언트를 보호하려는 목적으로 클라이언트와 서버 사이의 중개 역할을 수행하는 프로그램

 

버프 스위트(burp suite)

 - 프록시 서버를 사용하여 클라이언트와 서버가 주고받는 패킷을 가로채 위변조가 가능하게 하는 프로그램

 

Burp Suite 다운로드 및 실행

1. https://portswigger.net/burp/communitydownload

 

Download Burp Suite Community Edition - PortSwigger

Burp Suite Community Edition is PortSwigger's essential manual toolkit for learning about web security testing. Free download.

portswigger.net

 

2. Burp Suite 실행 - Proxy - Options

 

3. bee-box의 터미널에서 ifconfig로 알아낸 IP주소를 크롬에 입력, bWAPP 클릭

 

4. 컴퓨터 설정 - 프록시 - 수동 프록시 설정: IP주소와 포트 번호 입력

 

5. Burp Suite - Proxy - Intercept - Intercept is on 상태에서 해킹 시작

 

6. 사이트에서 무언가를 요청할 때마다 Burp Suite에서 패킷을 가로챈다. Burp Suite에서 가로챈 패킷을 수정할 수 있다. Forward를 두 번 누르면 패킷을 다시 보내주고 사이트가 작동한다. Drop을 누르면 패킷을 버리게 되고, 사이트는 에러가 뜬다.

 

[난이도 low]

hint1. GET 방식과 다르게 POST 방식은 전송되는 변수 값이 보이지 않습니다. 하지만 burp suite를 이용한다면 클라이언트에서 서버로 전송되는 값이 모두 보입니다. 이걸 이용하여 값을 조작해봅시다.

First name: <h1>SUCCESS</h1>

Last name: <img src="./images/bee_1.png">

 

[난이도 medium]

난이도 low에서 사용했던 방법은 먹히지 않았다. 가로챈 패킷을 보니, 내가 입력한 것이 인코딩되어 있었다.

//functions_external.php
function xss_check_1($data)
{
    // Converts only "<" and ">" to HTLM entities    
    $input = str_replace("<", "&lt;", $data);
    $input = str_replace(">", "&gt;", $input);
    
    // Failure is an option
    // Bypasses double encoding attacks
    // <script>alert(0)</script>
    // %3Cscript%3Ealert%280%29%3C%2Fscript%3E
    // %253Cscript%253Ealert%25280%2529%253C%252Fscript%253E
    $input = urldecode($input);
    
    return $input;
}

 

더블 인코딩(double encoding)

 - 사용자 요청 매개변수를 16진수 형식으로 두 번 인코딩하는 것

 - 한 번만 디코딩하는 보안 필터를 무시할 수 있다.

 

Char Hex encode Then encoding ‘%’ Double encode
%3C %25 %253C
/ %2F %25 %252F
%3E %25 %253E

 

firstname=%253Ch1%253ESUCCESS%253C%2Fh1%253E&lastname=%253Cimg+src%3D%22.%2Fimages%2Fbee_1.png%22%325E&form=submit

더블 인코딩한 값으로 수정한 패킷을 보내주었다.

 

[난이도 high]

풀 수 없는 이유를 설명하세요.
hint1. 서버에서 변수를 처리할 때 값을 조작하는 것 같습니다. php 파일을 살펴보면서 변수가 전달되는 과정을 지켜보면 답이 나올 듯 합니다.

//functions_external.php
function xss_check_3($data, $encoding = "UTF-8")
{
    // htmlspecialchars - converts special characters to HTML entities    
    // '&' (ampersand) becomes '&amp;' 
    // '"' (double quote) becomes '&quot;' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes '&#039;' (or &apos;) only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'
    
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
}

GET 방식과 마찬가지로, htmlspecialchars 함수를 사용하기 때문에 풀 수 없다.

Comments