auth버튼이 있다. 눌러보자
Access 가 Denied 되었다고 한다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
|
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 7</title>
</head>
<body>
<?php
$go=$_GET['val'];
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>
|
[ 소스분석 ]
- get 으로 val 변수의 값을 가져온 후, /2, -, \+, from, _, =, \\s, \*, \//i 을 필터링한다.
- 1에서 5까지의 랜덤값을 만들어 소괄호 '(' 의 개수를 정한다.
- 쿼리를 구성해 값을가져와서, 값이 없으면 (잘못된쿼리구성) 'query error 출력',
- 1이면 눌렀을때 Access_Denied! 가 나오는 버튼출력
- 2이면 눌렀을때 Hello admin 이 나오는 버튼출력
우리는 2라는 데이터를 뽑아내야한다.
-1) union select 2-- 라는 구문을 통해 2라는 데이터를 뽑아낼 수 있다.
union 은, 앞부분쿼리값과, 뒷부분 쿼리값을 합치는 역할을 한다.
값이 2가되야하므로, 앞부분쿼리는 -1을 넣어 거짓으로만들고,
뒷부분쿼리만 select 2 구문으로 2라는 데이터를 뽑아낼 수 있다.
-1 다음에 오는 소괄호의 개수는 랜덤값이다.
소괄호가 한개가될 확률은 20%이니, 새로고침으로
rand 가 1이될때까지 값을 날려주면된다.
[ -1) union select 2 ]
\\s, -, 2 가 필터링된다.
\\s 는 white space (공백) 으로, 괄호 () 로 우회가능.
-1 대신 다른값을써 거짓으로 만들면됨. 999로 정했다.
2 는 char(50) 으로 우회가능.
[ 999)union(select(char(50)) ]
F5 !
helo admin