<html>
<head>
<title>Challenge 7</title>
</head>
<body>
<!--
db에는 val=2가 존재하지 않습니다.
union을 이용하세요
-->
<?
$answer = "????";
$go=$_GET[val];
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
$ck=$go;
$ck=str_replace("*","",$ck);
$ck=str_replace("/","",$ck);
echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
if(eregi("--|2|50|\+|substring|from|infor|mation|lv|%20|=|!|<>|sysM|and|or|table|column",$ck)) exit("Access Denied!");
if(eregi(' ',$ck)) { echo('cannot use space'); exit(); }
$rand=rand(1,5);
if($rand==1)
{
$result=@mysql_query("select lv from lv1 where lv=($go)") or die("nice try!");
}
if($rand==2)
{
$result=@mysql_query("select lv from lv1 where lv=(($go))") or die("nice try!");
}
if($rand==3)
{
$result=@mysql_query("select lv from lv1 where lv=((($go)))") or die("nice try!");
}
if($rand==4)
{
$result=@mysql_query("select lv from lv1 where lv=(((($go))))") or die("nice try!");
}
if($rand==5)
{
$result=@mysql_query("select lv from lv1 where lv=((((($go)))))") or die("nice try!");
}
$data=mysql_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]!=1 && $data[0]!=2) { exit(); }
if($data[0]==1)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Access_Denied!')><p>");
echo("<!-- admin mode : val=2 -->");
}
if($data[0]==2)
{
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=
alert('Congratulation')><p>");
@solve();
}
?>
<!--
index.phps
-->
</body>
</html>
코드를 분석하면, $_GET['val'] 값을 받아서 *, / 문자가 있는지 체크하고
eregi 함수로 --, 2, 50, \+, substring, from, infor, mation, lv, %20, =, !, <>, sysM, and, or, table, column, 공백을 필터한다.
1~5 사이 랜덤 값을 rand 함수로 추출한다. 그후 생성된 값을 통해
쿼리문에 괄호개수가 정해진다.
// rand 함수 반환 값이 1일 때
SELECT lv FROM lv1 WHERE lv=($_GET['val'])
쿼리 결과 lv 값이 추출되는데 lv 값이 없으면 exit();
추출된 lv 값이 1 이면서 2이여도 exit();
lv 값이 2이면 성공
주의할 점은 실제 DB에 val=2가 존재하지 않으므로 UNION을 사용하라 명시되어있다.
따라서 $_GET['val'] 값에 0 union select (3-1) 가 되도록 시도한다.
SELECT lv FROM lv1 WHERE lv=( 0) union select (3-1 )
공백은 %0a(\n을 의미)로 우회하면된다.
0)%0aunion%0aselect%0a(3-1
근데 안풀려서 다른 사람이 한거 보니까 최근에 서버오류? 때문에 안된다고함..
괜히 시간버렸다ㅜㅜ
'WEB Hacking > webhacking.kr' 카테고리의 다른 글
[webhacking.kr] 61번 SQL 인젝션 alias (0) | 2018.09.02 |
---|---|
[webhacking.kr] 27번 SQL 인젝션 LIKE, -- (0) | 2018.09.01 |
[webhacking.kr] 46번 SQL 인젝션 CHAR() (0) | 2018.08.29 |
[webhacking.kr] 18번 SQL 인젝션 (0) | 2018.08.29 |
[webhacking.kr] 39번 SQL 인젝션 (0) | 2018.08.28 |