본문 바로가기
Security/Web Hacking

[bWAPP] XSS - Stored(Blog)

by 단월໒꒱ 2022. 2. 24.

[난이도 low]

1. 다음 화면과 같이 경고창을 띄워봅시다.

 

 

 

 

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

지난 번에 Stored(Blog) 문제에서 입력했던 내용이 남아있는 것을 확인할 수 있다.

 

 

 

 

이번에 해야하는 건 success라는 문구를 출력하는 alert창을 띄우는 것이므로 해당 문법을 포함한 스크립트 태그를 입력했다.

 

 

 

 

위와 같이 입력한 후 Submit를 눌렀다.

 

 

 

 

위와 같이 기대했던 팝업이 뜨는 걸 확인할 수 있다.

 

 

 

2. 사용자의 쿠키 값을 경고창에 띄워봅시다.

 

 

 

 

지난번에 사용자의 쿠키 값은 document.cookie를 이용하여 볼 수 있다고 했었다.

해당 내용을 alert 창에 띄워야하는 것이므로 alert 안에 해당 내용을 넣어서 스크립트 태그를 작성한다.

 

 

 

 

위와 같이 입력하고 Submit 버튼을 눌러준다.

 

 

 

 

그러면 이전에 작성했던 success 문구의 alert 창이 뜨고

 

 

 

 

그 후 이번에 작성한 쿠키 값 확인 alert 창도 연달아 뜨는 것을 확인할 수 있다.

 

 

 

3. (게시판에 등록된 내용을 삭제하지 않았다면) XSS 공격을 시도할 때마다 경고창이 여러 개가 뜨는 것을 확인했습니다. 왜 그럴까요? 이유를 작성해주세요.

 

 

 

 

게시판 내용을 확인해보면 이전에 작성했던 글들이 모두 남아있는 것을 확인할 수 있다.

그리고 이전에 Stored 기법에 대해 정리했는데, 공격자가 게시글에 코드를 삽입하여 해당 글을 보는 사용자로 하여금 해당 코드를 실행하도록 하는 것이라고 했었다.

 

 

 

 

페이지의 소스 코드를 확인해보니 이전에 글에 삽입했던 스크립트 태그들이 모두 저장되어 잇는 것을 확인할 수 있다.

이렇게 페이지에 스크립트가 그대로 저장되어 있기 때문에 XSS 공격을 시도할 때마다 경고창이 발생하여 여러개의 경고창이 발생하는 일이 생길 수 있다.

 

 

 

 

[난이도 high]

4. 공격할 수 없습니다. 이유를 적어주세요.

 

 

난이도 high로 진입하니 이전 문제에서 작성했던 코드들이 아래와 같이 문자 그대로 적혀있는 것을 확인할 수 있었다.

 

 

 

 

이유를 알아보기 위해 소스 코드를 확인해보았다.

 

 

 

 

 

 

소스 코드를 확인하니 여기에서는 xss_stored_1 파일이 적용되고 있고 난이도 high이므로 security_level의 value 값은 2를 갖고 있다는 것을 알아낼 수 있었다.

 

이번에는 xss_stored_1 파일을 열어서 코드를 살펴보았다.

 

 

function xss($data)
{
    
    include("connect_i.php");

    switch($_COOKIE["security_level"])
    {

        case "0" : 

            $data = sqli_check_3($link, $data);
            break;

        case "1" :

            $data = sqli_check_3($link, $data);
            // $data = xss_check_4($data);
            break;

        case "2" :

            $data = sqli_check_3($link, $data);
            // $data = xss_check_3($data);
            break;

        default :

            $data = sqli_check_3($link, $data);
            break;

    }

    return $data;

}

 

 

이전에 언급했듯이 high 난이도이므로 value 값은 2를 갖고 입력받은 데이터에 sqli_check_3 함수를 적용한다는 것을 확인할 수 있다.

하지만 코드를 보면 케이스 0, 1, 2, default 경우 모두 해당 함수를 사용하고 있는 것으로 보아 이 함수 때문에 공격이 불가한 상태가 아닌 것 같았다.

따라서 아래에 같이 적혀있는 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 '&' 
    // '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
    // "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
    // '<' (less than) becomes '&lt;'
    // '>' (greater than) becomes '&gt;'  
    
    return htmlspecialchars($data, ENT_QUOTES, $encoding);
       
}

 

 

xss_check_3 함수는 htmlspecialchars 함수를 사용하여 값을 반환하고 있는데, 이 함수는 문자열에서 특정한 특수 문자 (&, ", ', <, >)를 html entity로 변환한다.

 

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

 

따라서 난이도 high의 문제는 공격이 불가능하다.

 

 

 

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

[bWAPP] XSS - Stored(Change Secret)  (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

댓글