<html>
<head>
<title>Challenge 57</title>
</head>
<body>
<?
$secret_key="????";

if(time()>1309064400) exit("오후 2시에 공개됩니다.");

if($_POST[pw])
{

if($_POST[pw]==$secret_key)
{
mysql_query("delete from challenge57msg");
@solve();
exit();
}

}


if($_GET[msg] && $_GET[se])
{
if(eregi("from|union|select|and|or|not|&|\||benchmark",$_GET[se])) exit("Access Denied");

mysql_query("insert into challenge57msg(id,msg,pw,op) values('$_SESSION[id]','$_GET[msg]','$secret_key',$_GET[se])");
echo("Done<br><br>");
}

?>

<form method=get action=index.php>
<table border=0>
<tr><td>message</td><td><input name=msg size=50 maxlength=50></td></tr>
<tr><td>secret</td><td><input type=radio name=se value=1 checked>yes<br><br><input type=radio name=se value=0>no</td></tr>
<tr><td colspan=2 align=center><input type=submit></td></tr>
</table>
</form>

<form method=post action=index.php>
Secret key : <input name=pw><input type=submit><br><br>
</form>

<br><br><a href=indexbackupfile.phps>phps</a>
<br><br><br>
<center>Thanks to <a href=http://webhacking.kr/index.php?mode=information&id=blueh4g>BlueH4g</a></center>
<br><br><br>

</body>
</html>

msg와 se 파라미터 모두 입력해야하며, se 파라미터만 필터처리한다.
필터 문자로는 from, union, select, and, or, not, &, |, benchmark 이다.
필터를 통과하면 다음과 같은 쿼리를 보낸다.
INSERT INTO tb (id, msg, pw, se) VALUES ('$_SESSION[id], '$_GET[msg]', '$secret_key', '$_GET[se]')
그후, 쿼리 성공/실패 여부와 관계없이 'DONE' 을 출력한다. 

즉, 쿼리에 따라 참/거짓 페이지를 구분할 수 없기 sleep() 함수나 benchmark와 같은 응답시간을 통해 참/거짓을 판단해야한다.
이때 사용할 수 있는 조건문은 IF 또는 CASE WHEN THEN 등을 쓰면된다.
$_GET[se]에 IF(substr(pw,1,1)=? ,sleep(x), 1000)를 입력하면 해당 파라미터 값은 INSERT INTO 구문을 통해 테이블에 삽입된다.
이때, 응답시간을 통해 지연이 되면 참 값이므로 pw 값을 구할 수 있다. 
근데 webhacking.kr 57번 문제는 sleep() 함수 인자로 1초 이상을 주면 NOT ACCEPTABLE? 이라는 에러 페이지를 출력한다...


+ Recent posts