문제

웹페이지

문제파일
<!-- index.php -->
<html>
<head>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
<title>PHParse</title>
</head>
<body>
<!-- php code -->
<?php
$url = $_SERVER['REQUEST_URI'];
$host = parse_url($url,PHP_URL_HOST);
$path = parse_url($url,PHP_URL_PATH);
$query = parse_url($url,PHP_URL_QUERY);
echo "<div><h1> host: $host <br> path: $path <br> query: $query<br></h1></div>";
if(preg_match("/flag.php/i", $path)){
echo "<div><h1>NO....</h1></div>";
}
else echo "<div><h1>Cannot access flag.php: $path </h1></div> ";
?>
<style type="text/css">
body {
margin: 1em;
}
div {
margin: 0 5px 0 0;
padding: 0.1em;
border: 2px solid silver;
border-radius: 7px;
}
</style>
</body>
</html>
설명
- flag.php에 접속하면 flag가 나올 것이라고 추측할 수 있다.
- 하지만 필터링 되고 있기 때문에 우회해야한다.
- $url은 url의 path 이후에 데이터이다. ex) http://localhost:8080/”flag.php?content=hello”
- parse_url함수는 문자열을 url로 해석하고 그 에 맞게 배열을 생성해준다. 또한 url이 유효한지 검사를 하지 않는다.
- parse_url은 //로 시작하면 host로 인식하기 때문에 //flag.php로 path를 지정하면 path검증을 우회 할 수 있다.
- http://host//flag.php 을 입력한다.
- 여기서 //flag.php를 입력해도 정상적으로 작동하는게 궁금해서 찾아봤는데 기본적을 아무 설정을 안건들이면 중복슬래시는 자동으로 하나로 변환된다고 한다.
결과
