본문 바로가기
Security/Web Hacking

[bWAPP] XSS - Reflected(GET)

by 단월໒꒱ 2022. 2. 19.

1. XSS 취약점이 있는지 알아봅시다. 다음 화면을 띄워보세요.

 

 

 

경고창을 누른 후 화면 (Welcome success 출력)

 

 

 

 

[난이도 low]

 

 

XSS는 스크립트를 삽입하여 공격하는 기법이다.

따라서 alert창을 띄우기 위해서 스크립트 태그를 입력해보기로 했다.

 

 

 

 

위와 같이 입력을 하고 Go 버튼을 눌렀다.

 

 

 

 

원하는 alert 팝업이 제대로 뜨고

 

 

 

 

원하는 문구가 제대로 출력되는 것을 확인할 수 있다.

 

 

 

 

난이도 & 결과 화면 확인

 

 

 

[난이도 medium]

 

 

 

 

이전 low 단계에서 입력했던 값을 그대로 입력해보았다.

 

 

 

 

 

 

하지만 스크립트는 실행되지 않고 success 문구만 제대로 출력되는 것을 확인할 수 있다.

원인을 확인하기 위해 소스코드를 확인해보았다.

 

 

 

 

내용을 입력받을 때 사용되는 게 xss_get 파일이라는 것과 

 

 

 

 

난이도는 medium이므로 value 값으로 1을 갖는 다는 것을 확인했다.

 

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

 

 

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;

}

 

 

위에서 구했던 내용을 바탕으로 보니 케이스 1인 경우 (난이도 medium인 경우)는 xss_check_4 함수를 사용한다는 것을 확인할 수 있다.

 

해당 함수의 자세한 기능을 알아보기 위해 function_external 파일을 열어 살펴보았다.

 

 

function xss_check_4($data)
{
  
    // addslashes - returns a string with backslashes before characters that need to be quoted in database queries etc.
    // These characters are single quote ('), double quote ("), backslash (\) and NUL (the NULL byte).
    // Do NOT use this for XSS or HTML validations!!!
    
    return addslashes($data);
    
}

 

 

xss_check_4 함수는 addslashes 함수를 이용하여 값을 반환하고 있었다.

addslashes 함수는 입력 내용에 작은 따옴표(')나 큰 따옴표(")가 있을 경우 앞에 백슬래쉬(\)를 붙여주는 기능을 한다.

 

addslashes 함수를 우회하기 위하여 구글링한 내용을 바탕으로 백틱(`)을 사용해보기로 했다.

 

const num1 = 10;
const num2 = 20;

console.log(num1 + ' + ' + num2 + ' = ' + (num1+num2) +  " 입니다.");

 

const num1 = 10;
const num2 = 20;

console.log(`${num1} + ${num2} = ${num1+num2} 입니다.`);

 

 

별개의 내용이지만 백틱을 사용하면 첫번째 코드를 두번째 형식의 코드로 변형하여 사용할 수 있다고 한다.

 

 

 

 

난이도 low에서 입력했던 스크립트에서 큰 따옴표(")를 백틱(`)으로 바꿔주고 Go 버튼을 눌렀다.

 

 

 

 

원하는 alert 팝업이 제대로 뜨고

 

 

 

 

원하는 문구가 제대로 출력되는 것을 확인할 수 있다.

 

 

 

 

난이도 & 결과 화면 확인

 

 

 

[난이도 high]

 

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

 

 

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;

}

 

 

이전 단계에서 구했던 내용을 바탕으로 생각해보면 high 난이도이므로 case 2인 경우에 해당하고 따라서 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로 변환한다.

 

htmlspecialchars 함수에 대한 내용은 이전에도 몇 번 다뤘는데 다시 한번 정리하자면, 이 함수를 통해 변환되는 문자는 아래와 같다.

 

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

 

따라서 위의 코드를 해석하자면 

$data로 받은 문자열을 "", '' 둘 다 변환하여 UTF-8 문자셋으로 변환한다는 뜻이다.

 

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

 

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

 

 

 

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

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

댓글