없다.
문제에 들어가면 소스코드 링크만 주어지는데 소스코드는 이렇게 되어 있다.
php부분만 보면 먼저 get
으로 요청받은 id
가 admin
이면 프로그램이 no!
라고 출력한 뒤에 죽는다.
그리고 요청받은 id
를 urldecode
를 한 뒤에 id
에 다시 넣는다.
그 다음 그 id
가 admin
이면 문제가 풀린다.
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
일단은 admin
을 잘 우회해서 admin
을 넣어야 한다. ad%00min
이것도 생각해 봤지만 urldecode
에 걸린다. 하지만 urldecode
를 이용하여 쉽게 우회할 수 있다. urldecode
는 ascii
코드으로 이루어진 값을 char
형으로 바꿔준다.
admin
을 urlencode
방식으로 보내면 필터링부분에서 걸리지 않고 값을 보낼 수 있다.
admin
의 urlencode
값은 %61%64%6d%69%6e
이다. 하지만 이대로 주소창을 이용해서 보내게 되면 주소창에서 한 번 urldecode
를 해 주기 때문에, 값이 admin
으로 변하면서 걸리게 된다. 그렇기 때문에 urlencode
를 이중으로 사용한다. %61%64%6d%69%6e
의 urlencode
값은 %25%36%31%25%36%34%25%36%64%25%36%39%25%36%65
이다. 이 값을 보내면 주소창에서는 %61%64%6d%69%6e
로 변하게 되고, 이 값이 id값으로 들어가서 urldecode
가 실행되면 admin
으로 변하게 되면서 문제가 풀리게 된다.
?id=%25%36%31%25%36%34%25%36%64%25%36%39%25%36%65