<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? 이라는 에러 페이지를 출력한다...
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 22번 SQL 인젝션 (0) | 2018.09.12 |
---|---|
[webhacking.kr] 3번 :: 작성중 (0) | 2018.09.11 |
[webhacking.kr] 45번 /**/ 주석 SQL 인젝션 (0) | 2018.09.11 |
[webhacking.kr] 50번 :: /**/ SQL 인젝션 ㅡㅡ (0) | 2018.09.11 |
[webhacking.kr] 07번 :: ㅡㅡ (0) | 2018.09.10 |