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("<", "<", $data);
$input = str_replace(">", ">", $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 '&'
// '"' (double quote) becomes '"' when ENT_NOQUOTES is not set
// "'" (single quote) becomes ''' (or ') only when ENT_QUOTES is set
// '<' (less than) becomes '<'
// '>' (greater than) becomes '>'
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 |
댓글