webhacking challenge 26

26번의 문제 메인 화면입니다. view-source를 눌러주면

이런 코드를 볼 수 있는데요. 이 코드를
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
"GET으로 입력 받은 변수 id 값이 "/admin/"이라면, "no!"를 외치고 종료"
$_GET['id'] = urldecode($_GET['id']);
"GET으로 입력 받은 id 값에 그 id값을 urldecode하여 넣어준다"
if($_GET['id'] == "admin"){
solve(26);
}
"만약 GET으로 입력 받은 id가 "admin"과 일치하면 문제 해결"
이라고 저는 개인적으로 해석해 보았습니다.
분석 후 제가 첫번째로 해본 것은 주소창에 no가 나오도록 id=/admin/을 해보았습니다.

예상대로 no! 라는 문구가 나왔습니다.
이번엔 제대로, id에 admin을 인코딩하여 넣어주기로 하였습니다.
인코딩 표를 보며 한 결과,
%61%64%6D%69%6E 이렇게 나왔습니다.
이제 이걸 주소창에 치기만 하면 된다는 생각으로 해보았는데
?id=%61%64%6D%69%6E 를 치고 엔터를 누르는 동시에

이와 같이 자동으로 %61%64%6D%69%6E 이 admin으로 바뀌었습니다...
이 원인을 찾기 위해 열심히 구글링 해본 결과,
브라우저는 입력 받은 데이터를 자동으로 인코딩하여 php로 보내면, php는 그 데이터를 자동으로 디코딩한다.
라는 것을 깨달았습니다.
즉, 제가 방금 %61%64%6D%69%6E 이렇게 보낸 데이터가 자동으로 인코딩이 되며 자동으로 admin이 된 것이었죠.
그렇다면 결론적으로 이 %61%64%6D%69%6E 이 데이터를 한 번 더 인코딩 시키면 되겠구나 생각하여 다시 인코딩해보았습니다.
그렇게 한번 더 인코딩하여,
%2561%2564%256D%2569%256E
라는 값이 나왔고 이를 주소창에 ?id=%2561%2564%256D%2569%256E 라고 친 결과.!

문제를 풀 수 있었습니다!