본문 바로가기
Security/Web Hacking

[bWAPP] HTML Injection - Reflected(POST)

by 단월໒꒱ 2022. 2. 8.

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

 

 

[난이도 low]

 

 

 

burp suite를 키고 Intercept is on으로 바꿔준 뒤 문제에서 제시한 대로 아무 의미가 없는 값을 입력해주었다.

 

 

 

 

burp suite에서 코드를 확인하니 아래에 firstname과 lastname에 asdf라는 값이 입력된 것을 확인할 수 있었다.

 

 

 

 

여기에서 값을 가로채서 asdf라 입력되어있는 곳에 각각 출력해야할 스크립트를 입력하고 forward 버튼을 눌러 값을 전송해주었다.

 

 

 

 

원하는 화면을 출력할 수 있었다.

 

 

 

 

난이도 & 결과 화면 확인

 

 

 

[난이도 medium]

 

 

 

 

 

이번에도 마찬가지로 의미없는 값을 넣어준 뒤에 burp suite로 가로채서 난이도 low에서 전송한 값을 그대로 입력하고 값을 전송해주었다.

 

 

 

 

그랬더니 이번에는 스크립트가 적용되어서 출력되는 게 아니라 입력된 그대로 화면에 출력된 것을 확인할 수 있었다.

 

원인을 알아내기 위해 페이지 소스코드를 확인해보았다.

 

 

 

 

코드를 확인하니 여기에서 사용된 htmli_post 파일의 자세한 내용을 확인하기 위해 해당 파일을 열어 코드를 살펴보았다.

 

 

function htmli($data)
{
         
    switch($_COOKIE["security_level"])
    {
        
        case "0" : 
            
            $data = no_check($data);            
            break;
        
        case "1" :
            
            $data = xss_check_1($data);
            break;
        
        case "2" :            
                       
            $data = xss_check_3($data);            
            break;
        
        default : 
            
            $data = no_check($data);            
            break;;   

    }       

    return $data;

}

 

 

이전 Reflected(GET) 문제와 마찬가지로 단계별로 입력된 데이터에 적용되는 함수가 다른 것을 확인할 수 있었다.

전에 확인했었던 단계별 value 값을 참고하여 medium 단계에 해당하는 케이스 1 부분을 살펴보았다.

입력된 데이터에 xss_check_1 함수가 적용되어있는 걸 확인할 수 있었는데, 이 함수의 기능을 살펴보기 위해 function_external 파일을 열어 해당 함수를 확인해보았다.

 

 

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;
    
}

 

 

이전 문제에서와 마찬가지로 xss_check_1 함수는 str_replace 함수를 이용해서 <와 >를 태그가 아닌 문자 자체로 바꿔주고 있었다.

이번에도 URL Encoding을 사용해보기로 했다.

 

 

 

 

<는 %3C, >는 %3E이니 low 단계에서 사용했던 코드의 <와 >를 각각 %3C, %3E로 바꿔서 입력하고 값을 전송해주었다.

 

 

 

 

하지만 인코딩을 했어도  %3C와 %3E가 <와 >로 바뀌기만 했을 뿐, 스크립트 태그를 해석해서 원하는 화면을 출력하지 않는 것을 확인할 수 있었다.

한참을 고민해보다가 힌트를 참고하여 더블 인코딩에 대해 찾아보았다.

 

더블 인코딩은 보안 제어를 우회하거나 애플리케이션에서 예기치 않은 동작을 유발하기 위해 사용자가 요청한 매개변수를 16진수 형식으로 두 번 인코딩하는 것을 말한다.

이중 인코딩을 사용하면 사용자 입력을 한 번만 디코딩하는 보안 필터를 우회할 수 있는데, 이중 인코딩된 URL은 내장된 XSS 탐지 모듈을 우회하여 XSS 공격을 수행하는 데 사용할 수 있다고 한다.

 

더블 인코딩 과정은 아래 표를 참고하면 된다.

 

 

Char Hex encode Then encoding '%' Double encode
< %3C %25 %253C
/ %2F %25 %252F
> %3E %25 %253E

 

 

 

 

표를 참고하여 <, /, >를 각각 더블 인코딩한 %253X, %252F, %253E로 바꿔서 값을 입력하여 전송해주었다.

 

 

 

 

원하는 화면을 출력할 수 있었다.

 

 

 

 

난이도 & 결과 화면 확인

 

 

 

[난이도 high] - 풀 수 없는 이유를 설명하시오.

 

 

 

 

 

 

일단 앞선 두 단계와 마찬가지로 무의미한 값을 넣어주고 burp suite로 medium 단계에서 넘겨줬던 값으로 값을 변환해서 넘겨주었다.

 

 

 

 

그랬더니 넘겨준 값 그대로 화면에 출력되는 것을 확인할 수 있었다.

 

저렇게 출력되는 원인을 소스코드를 통해 알아내기 위해 html_stored 파일을 열어 코드를 확인해보았다.

 

case "2" :            
                       
            $data = xss_check_3($data);            
            break;

 

 

medium 단계를 나타내는 2에서 xss_check_3이라는 함수가 입력받은 데이터에 작용하고 있음을 확인할 수 있었다.

 

이번에는 xss_check_3 함수의 기능을 살펴보기 위해 function_external 파일을 열어 확인해보았다.

 

 

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);
       
}

 

 

htmlspecialchars 함수를 사용하였는데, 이 함수는 문자열에서 특정한 특수 문자를 html entity로 변환한다.

자세한 내용은 아래 글에서 설명했다.

https://jini00.tistory.com/130

 

사용자의 입력 값에서 html injection과 관련된 문자들을 UTF-8로 변환시키기 때문에 사용자가 어떤 값을 입력하더라도 브라우저가 html 요소로 해석하지 않아서 xss가 불가능하다.

 

따라서 이번에도 마찬가지로 난이도 high의 문제는 푸는 게 불가능하다.

 

 

 

'Security > Web Hacking' 카테고리의 다른 글

[bWAPP] SQL Injection - GET/search  (0) 2022.02.10
[bWAPP] HTML Injection - Stored(Blog)  (0) 2022.02.08
[bWAPP] HTML Injection - Reflected(GET)  (0) 2022.01.30
[XSS Game] Level 6  (0) 2022.01.23
[XSS Game] Level 5  (0) 2022.01.23

댓글