반응형
https://webhacking.kr/challenge/web-07/index.php?val=1
Challenge 7
webhacking.kr
[문제]
[풀이]
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 7</title>
</head>
<body>
<?php
$go=$_GET['val'];
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
echo("<html><head><title>admin page</title></head><body bgcolor='black'><font size=2 color=gray><b><h3>Admin page</h3></b><p>");
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
$db = dbconnect();
$rand=rand(1,5);
if($rand==1){
$result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
}
if($rand==2){
$result=mysqli_query($db,"select lv from chall7 where lv=(($go))") or die("nice try!");
}
if($rand==3){
$result=mysqli_query($db,"select lv from chall7 where lv=((($go)))") or die("nice try!");
}
if($rand==4){
$result=mysqli_query($db,"select lv from chall7 where lv=(((($go))))") or die("nice try!");
}
if($rand==5){
$result=mysqli_query($db,"select lv from chall7 where lv=((((($go)))))") or die("nice try!");
}
$data=mysqli_fetch_array($result);
if(!$data[0]) { echo("query error"); exit(); }
if($data[0]==1){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Access_Denied!')\"><p>");
}
elseif($data[0]==2){
echo("<input type=button style=border:0;bgcolor='gray' value='auth' onclick=\"alert('Hello admin')\"><p>");
solve(7);
}
?>
<a href=./?view_source=1>view-source</a>
</body>
</html>
소스코드이다.
해석하면 val 변수의 값을 go로 받아오고
랜덤으로 sql문을 돌린다.sql문의 lv에 go변수가 들어가며 그 lv값이 2면 문제가 풀린다.
한마디로 lv에 2가 들어가서 data가 2이면 된다.
숫자는 필터링으로 걸러지기 때문에 아스키 코드를 이용해서
char(50)을 넣어봤지만 쿼리 에러가 떴다.
(, ) 괄호의 갯수를 랜덤으로 정해둔걸 보고
이유없이 랜덤으로 돌린 것 같지 않았다.
괄호를 이용해서 sql문을 완성해야 한다고 생각했다.
이 문제는 Union Select를 이용해야한다.
0)union(select(char(50))
이런식으로 Union으로 합쳐서 2값이 나올 수 있도록 해준다.
#랜덤으로 괄호 갯수가 바뀐다는 사실을 까먹고 안되길래 다른 방법을 수많이 해봤다..
1~5까지의 랜덤이 있기 때문에
몇번만 새로고침 해주면 문제가 풀린다.
반응형