
1. 문제 정보
- 문제 번호 : old -7
- 문제 점수 : 30점
2. 문제 분석
문제에 들어가면 admin page라고 나오고 아무것도 없다.

auth를 누르면 access_denied가 뜬다.

소스코드를 확인해보자
val을 받아서 정규식과 매치한 다음에 rand값에 맞춰 query를 가져온 다음 data [0] 값이 2이면 문제가 풀린다.
<?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>
3. 풀이
문제에서 go값은 쿼리문에 들어가니까 query문에 2를 넣으면 lv값을 결국 가져오므로 2를 넣으면 될 것 같다.
그냥 숫자형으로 들어가므로 함수가 실행되므로 MOD(5,3)를 넣어 2를 만들었다.

에러가 나온다. MOD(5,4)를 넣어서 1을 넣으면 잘 작동하는 걸 보아 lv값에 2가 없다는 것을 알 수 있다.

다시 쿼리문을 살펴보자
"select lv from chall7 where lv=($go)"
이러면 lv에 없는 값을 추가해야하는데 union을 통해서 추가 가능하다. 하지만 \s로 공백은 못쓰므로 괄호를 이용해서 공백을 대체했다. val=3)union(select(5%3)이렇게 입력하고 보니

rand때문에 괄호가 하나 있을 때까지 해야한다. 계속 새로 고침해보면 성공한다.

4. 요약
- 정규표현식으로 숫자 2와 공백 등이 차단되고 DB에 목표 데이터가 없으므로 UNION SELECT를 사용해 가상의 결과값을 만들어야 한다.
- 공백은 괄호로, 숫자 2는 MOD 연산(5%3 등)으로 우회하여 )union(select(mod(5,3)) 형태의 페이로드를 구성한다.
- 서버가 쿼리의 괄호 개수를 무작위로 지정하므로 주입한 괄호와 서버의 괄호 짝이 맞아 떨어질 때까지 새로고침을 반복해야 한다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-5 문제 (0) | 2026.02.05 |
|---|---|
| [webhacking.kr] old-3 문제 (0) | 2026.02.05 |
| [webhacking.kr] old-11 문제 (0) | 2026.02.02 |
| [webhacking.kr] old-4 문제 (0) | 2026.02.02 |
| [webhacking.kr] old-56 문제 (0) | 2026.02.02 |