묻따말 바로 index.phps를 보자.
<html> <head> <title>Chellenge 39</title> </head> <body> <? $pw="????"; if($_POST[id]) { $_POST[id]=str_replace("\\","",$_POST[id]); $_POST[id]=str_replace("'","''",$_POST[id]); $_POST[id]=substr($_POST[id],0,15); $q=mysql_fetch_array(mysql_query("select 'good' from zmail_member where id='$_POST[id]")); if($q[0]=="good") @solve(); } ?> <form method=post action=index.php> <input type=text name=id maxlength=15 size=30> <input type=submit> </form> </body> </html>
$_POST 값으로 넘겨줘야 하는데
\는 아예 쓰지도 못하게 해놨고, '는 ''로 치환하고 있다. 그리고 최대 15자리까지밖에 못쓰는것 같다.
풀고나서 한말이지만 문제가 진짜 조온나 불친절하다. 어쨌든 select해야되는 id의 값은 괘념치 않아도 되는것 같다.
처음엔 CHAR같은걸 넣어야 하나 생각을 했는데 애초에 필터링을 회피하기 위한 문제라서 그런건 아니고,
취약점 방어를 위해 자르는걸 역이용하는것이다.
요런것이다.
admin '
입력값이 이렇게 생겨먹으면 필터링을 거친 후엔 이렇게 된다.
admin ''
다만 안타깝게도 필터링은 15자리에서 정확히 끊어준다.
고로 원문과 동일하게 쿼리를 날릴 수 있게 된다. 처음엔 '''''''''''''''''''''''''''''''''''''''' 막 이렇게 해봤는데 어리석었다... 생각좀하자 ㅠㅠ