사자자리

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

웹해킹/bWAPP

[bWAPP] HTML Injection - Reflected (GET)

renne 2022. 7. 11. 23:55

Quest 1. HTML Injection

 - 취약한 매개변수에 악성 HTML을 심어서 공격하는 방법

 - 사용자가 연결을 요청한 페이지에 악성 HTML을 심어서 의도치 않은 내용을 보게 하거나, 악성 사이트로 연결되게 하는 방법

 

Quest 2. 아래 화면을 출력하시오.

[난이도 low]

First name에 Regulus, Last name에 Black을 입력하니 Welcome Regulus Black이 아래에 그대로 출력된다. 이를 이용해서 퀘스트를 수행하자.

View Page Source에서 출력할 형식에 맞는 태그들을 찾았다.

First name: <h1>SUCCESS</h1>

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

 

[난이도 medium]

같은 방법으로 입력했더니 위와 같이 나왔다.

 

터미널에서 소스파일이 있는 /var/www/bWAPP로 이동하고, vim htmli_get.php을 실행했다.

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;
}
난이도 low no_check() 함수
난이도 medium xss_check_1() 함수
난이도 high xss_check_3() 함수

:quit를 입력하여 vim에서 나왔다.

 

위의 함수들은 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;
}

URL 인코딩을 해서 입력한다.

First name: %3ch1%3eSUCCESS%3c%2fh1%3e

Last name: %3cimg src=".%2fimages%2fbee_1.png"%3e

 

[난이도: high]

없습니다. 없는 이유를 정리해주세요.

난이도 low, medium에서 시도했던 방법을 입력했으나 막힌다.

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

난이도 high에서 사용하는 함수를 살펴보니, htmlspecialchars 함수가 입력값을 우회한다.

*htmlspecialchar 함수

 - PHP에서 제공하는 기본함수로, HTML서 사용하는 특수문자를 UTF-8로 반환해줌

위 함수는 html injection을 막기 위해, 태그에 사용하는 특수문자들을 인식할 수 없도록 인코딩하므로 난이도 high에서는 퀘스트를 성공할 수 없다.

Comments