Post

Webhacking.kr - web07

web07

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
<?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);
}
?>

Solution

online mysql : https://paiza.io/en/languages/mysql

1
2
3
4
5
6
7
8
9
10
11
12
13
14
코드로 보아 lv은 int형이며 lv에서 2 값을 뽑아야 admin으로 인증됨.

rand 값에 따라 $go에 쌓여진 괄호 개수가 달라지는 점과 필터링을 우회하면서 lv값을 2를 뽑아내면 될 듯 함.

필터링에는 (+, - , *, /) 사칙연산, 2, from, _, =, \s(공백)이 있음.

공백은 괄호로 우회하고 2값은 char(50)으로 우회하면 가능함.

처음에는 0)or(lv)like(char(50) 으로 했으나 query error가 뜨는 것으로 보아 아예 vl 값은 1밖에 없는 듯함.
따라서 union select로 2 값을 가져와야 함.

val=0)union(select(char(50)) 이라고 입력하면 다음과 같이 되서 정상적으로 쿼리가 들어갈 것임.

select lv from chall7 where lv=(0)union(select(char(50)))
This post is licensed under CC BY 4.0 by the author.