<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


근데 안풀려서 다른 사람이 한거 보니까 최근에 서버오류? 때문에 안된다고함..

괜히 시간버렸다ㅜㅜ


+ Recent posts