본문 바로가기
Security/Web Hacking

[bWAPP] XSS - Stored(Change Secret)

by 단월໒꒱ 2022. 2. 24.

[난이도 low]

1. Change Secret 페이지에서 XSS 공격 후 SQL Injection(Login From/users) 페이지에서 확인할 수 있습니다. 다음 화면을 출력해보세요. (bee/bug)

 

 

 

해당 문제의 low 난이도로 진입하면 아래와 같은 화면이 뜬다.

 

 

 

 

시험 삼아 아무 값이나 입력해보았다.

 

 

 

 

 

secret이 바꼈다는 메시지가 뜬 것 외에는 다른 게 없어서 SQL Injection (Login Form/User) 페이지로 넘어가보았다.

 

 

 

 

로그인을 하니 

 

 

 

 

위의 화면처럼 secret이 1이라고 되어있는 것을 확인할 수 있었다.

이를 통해 위에서 secret을 변경해줄 수 있을거라 생각했다.

 

 

 

 

따라서 success라는 문구를 띄우는 alert 스크립트를 입력하고 Change를 눌러 secret을 변경해주었다.

그 후 다시 SQL Injection (Login Form/User) 페이지로 돌아가 로그인을 하니

 

 

 

 

위와 같이 alert 팝업이 뜨고 해당 화면이 출력되는 것을 확인할 수 있었다.

 

 

 

2. secret을 사용자의 쿠키 정보로 바꿔봅시다.

 

 

 

이전에 쿠기 정보를 보려면 document.cookie를 입력해야한다고 했었다.

 

 

 

 

따라서 입력 창에 document.cookie를 alert 안에 넣어서 입력해주었다.

 

 

 

 

secret이 바꼈다는 문구를 확인한 뒤 다시 SQL Injection (Login Form/User) 페이지로 돌아가 로그인을 했다.

 

 

 

 

사용자의 쿠키값이 alert 창으로 출력되는 것을 확인할 수 있다.

 

 

 

[난이도 high]

 

3. 공격할 수 없습니다. Secret은 두 개의 함수를 이용해 방어하고 있습니다. 함수의 이름을 적어주세요.

 

 

 

 

위에서는 success alert 팝업이 발생했던 태그였지만 이번에는 문자 그대로 화면에 출력되는 것을 확인할 수 있다.

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

 

 

 

 

 

xss_stored_3 파일을 사용하고 있고 난이도는 high이므로 security_level에 대한 value 값 2를 갖고 있는 것을 알아낼 수 있었다.

xss_stored_3 파일을 열어 코드를 확인해보았다.

 

 

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

    }       

    return $data;

}

 

 

케이스 2의 경우 xss_check_3 함수를 사용하고 있는 것을 알 수 있다.

하지만 문제에서 원하는 것은 secret에 걸려있는 함수이므로 다른 코드를 살펴보다가 아래의 코드 부분을 찾을 수 있었다.

 

 

// If the security level is MEDIUM or HIGH
                if(!isset($_REQUEST["token"]) or !isset($_SESSION["token"]) or $_REQUEST["token"] != $_SESSION["token"])
                {

                    $message = "<font color=\"red\">Invalid token!</font>";            

                }

                else
                {

                    $secret = mysqli_real_escape_string($link, $secret);
                    $secret = htmlspecialchars($secret, ENT_QUOTES, "UTF-8");

                    $sql = "UPDATE users SET secret = '" . $secret . "' WHERE login = '" . $login . "'";

                    // Debugging
                    // echo $sql;      

                    $recordset = $link->query($sql);

                    if(!$recordset)
                    {

                        die("Connect Error: " . $link->error);

                    }

                    $message = "<font color=\"green\">The secret has been changed!</font>";

                }

 

 

위의 코드에 따르면 난이도가 medium 또는 high일 경우 mysqli_real_escape_stringhtmlspecialchars 함수를 사용하여 입력받은 secret 값에 적용하고 있는 것을 알 수 있다.

 

mysqli_real_escape_string 함수는 SQL 문에서 특수 문자를 이스케이프시킨다.

사용 형식은 mysqli_real_escape_string(connection, escapestring)으로 connection 에는 사용하는 mysql의 연결을 해주고 escapestring에 오는 건 이스케이프 할 문자열이다.

문자를 이스케이프 하면 스크립트나 태그의 기능은 제거되지만 입력한 내용은 그대로 브라우저에서 확인이 가능하다.

 

htmlspecialchars 함수는 문자열에서 특정한 특수 문자를 아래의 표대로 변환한다.

 

특수 문자 변환된 문자
& &amp;
"" &quot;
'' &#039;
< &lt;
> &gt;

 

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

 

 

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

[bWAPP] XSS - Stored(Blog)  (0) 2022.02.24
[bWAPP] XSS - Reflected(POST)  (0) 2022.02.19
[bWAPP] XSS - Reflected(GET)  (0) 2022.02.19
[bWAPP] SQL Injection - POST/search  (0) 2022.02.10
[bWAPP] SQL Injection - GET/search  (0) 2022.02.10

댓글