소스를보자.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
a { color:lightgreen; }
</style>
</head>
<body>
<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>
get으로 id를 가져와 admin 이면 no! 를 출력하고 종료한다.
admin 이 아니면 id 를 urldecode하고 admin 이면 문제가 풀린다.
우리가 get 으로 요청을할때, 데이터는 웹브라우저가 자동으로 url 인코딩을한다.
그리고 받는쪽에서는 url 디코딩되어 받게된다.
그렇다면, url인코딩을 한번 더 하면 되겠다.
특수문자는 자동으로 url인코딩이 된다.
하지만 admin 은 특수문자가 아니기때문에, 수동으로 url인코딩해줘야한다.
%61%64%6d%69%6e==admin 으로 전달이 돼서 no! 라고 뜬다.
%61%64%6d%69%6e 를 한번더 인코딩하면
%2561%2564%256d%2569%256e 이 된다. 이 값을 전달하면 되겠다.
데이터가전달이되면 자동으로 url디코딩되어
%61%64%6d%69%6e 로 바뀌는데, admin 과 다르므로 조건문 통과,
urldecode 함수로 id 가 admin 이 되어 문제가풀리게된다.