[WebHacking.kr]Old-07 Write-up
2024. 12. 17. 17:53ㆍ보안/웹
728x90
문제에 들어가면 이런 페이지가 나오고 auth를 누르면 Access Denied!라는 메시지가 나온다.
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>
if(preg_match("/2|-|\\+|from|_|=|\\\\s|\\*|\\//i",$go)) exit("Access Denied!");
여기서 url 필터링 조건을 걸어준다. 해당 조건문에서 필터링 걸어주는 기호는
2
from
_
=
\\s(공백)
//i(대소문자 구분x)
등이 있다.
이 필터링 기호들이 url에 들어가면 Access Denied!라는 문구가 나온다.
SQL Injection을 방지하기 위한 필터링 조건이다.
$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(!$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);
그래서 여길 보면 역시나 필터링되는 2를 넣어야 문제가 해결될 것 같다.
그냥 2를 넣으면 당연히 필터링되어 Access Denied!가 나오고
우회하려 6%4 이런걸 넣어주면 query error라고 나온다.
$result=mysqli_query($db,"select lv from chall7 where lv=($go)") or die("nice try!");
sql문을 보면 괄호가 있는 것을 알 수 있는데 ,
괄호를 사용하는 것을 보고 필터링 되는 띄어쓰기를 쓰지 않고도 select문을 사용하는 방법을 알아냈다.
SQL Injection을 할 때 ‘를 사용하듯이, 괄호를 사용하여
- 정답 : 6)UNION(SELECT(6%4))
이런식으로 해주면(앞에 6은 1이나 2가 아닌 어느 숫자여도 상관없다) 띄어쓰기를 사용하지 않고도 쿼리를 여러 개 사용할 수 있다. 물론 다른 방법도 많겠지만, 괄호를 사용하는 방법으로 해결하였다.
그렇게 넣어준 후 정답이 나올 때까지 동일하게 입력해주면 문제가 해결된다.
'보안 > 웹' 카테고리의 다른 글
[DreamHack] Flying chars Write-up (0) | 2024.12.26 |
---|---|
[DreamHack] phpreq Write-up (0) | 2024.12.26 |
[WebHacking.kr]Old-03 Write-up (1) | 2024.12.18 |
[WebHacking.kr]Old-01 Write-up (1) | 2024.12.17 |
[Dreamhack]php7cmp4re Write-up (0) | 2024.07.18 |