티스토리 뷰
26번 문제 : URL Encoder/Decoder
<?
if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); }
$_GET[id]=urldecode($_GET[id]);
if($_GET[id]=="admin")
{
@solve();
}
?>
<br><br>
<a href=index.phps>index.phps</a>
문제를 들어가고 index.phps 를 클릭하면 위와 같은 소스가 나온다.
get방식으로 데이터 id가 admin이면 문제를 해결하는 소스!!
옛날에 풀었을 때 admin 을 인코딩 해서 안되길래 관리자분께 물어봤던 기억이 난다.
위에 소스를 보면 $_GET[id]=urldecode($_GET[id]); 에서 소스 자체에서 한번 디코드를 한다.
php에는 url 인코드 디코드 기능이 있나보다.
admin을 한번 인코딩 하면
%61%64%6d%69%6e 다음과 같이 된다.
인코딩을 한 번만 하는 것은 웹 브라우져에서 %61%64%6d%69%6e = admin 이랑 똑같이 인식이 된다.
그래서 %61%64%6d%69%6e를 데이터로 보내면
위의 소스 if(eregi("admin",$_GET[id])) { echo("<p>no!"); exit(); } 에 의해 정답이 아니게 된다.
그럼 다시 생각해보자
%61%64%6d%69%6e 를 한 번더 인코딩하면
%2561%2564%256d%2569%256e 이런 값이 나온다. 즉 % -> %25 로 인코딩이 되었다.
%2561%2564%256d%2569%256e 이 코드는 처음 웹브라우져로 데이터를 보내면
if(eregi) 문에 의해 필터가 되지 않는다.
$_GET[id]=urldecode($_GET[id]);
%61%64%6d%69%6e = urldecode (%2561%2564%256d%2569%256e);
가 되므로 admin 이 인식된다!
http://webhacking.kr/challenge/web/web-11/index.php?id=%2561%2564%256d%2569%256e