본문 바로가기
Wargame Write-Up/Webhacking.kr

[Webhacking.kr] (Web) 7번 풀이 (old-7)

by snwo 2020. 3. 24.

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'];
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>

 

[ 소스분석 ]

  • 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