
1. 문제 정보
- 문제 번호 : old -18
- 문제 점수 : 10점
2. 문제 분석
sqli문제이다. view-source로 가서 php코드를 확인해보면

<?php
if($_GET['no']){
$db = dbconnect();
if(preg_match("/ |\/|\(|\)|\||&|select|from|0x/i",$_GET['no'])) exit("no hack");
$result = mysqli_fetch_array(mysqli_query($db,"select id from chall18 where id='guest' and no=$_GET[no]")); // admin's no = 2
if($result['id']=="guest") echo "hi guest";
if($result['id']=="admin"){
solve(18);
echo "hi admin!";
}
}
guest이면 hi guest를 출력하고 admin이면 문제가 풀린다. 하지만 preg_match로 공백, 슬래시, 괄호, 파이프, 퍼센트, select,0x를 필터링한다. 하지만 %09인 tab을 통해 공백처럼 사용가능하다.
3. 풀이
"select id from chall18 where id='guest' and no=$_GET[no]"
이 쿼리문에서 id가 admin을 불러오기 위해서 no에 0을 넣고 or id='admin'을 입력하면 연산자 우선순위 때문에
or이 나중에 되서 admin이 불러와진다.
0%09or%09id=%27admin%27
위처럼 페이로드를 짰고 이걸 제출로 누르지말고 get의 파라미터로 줘야한다.
제출로 누르면 url인코딩을 하는데 서버에서는 디코딩을 안하는 것 같다.
4. 요약
- 소스 코드는 preg_match로 공백과 괄호 등을 필터링하지만, 탭 문자(%09)로 공백을 대체했다.
- 연산자 우선순위(AND > OR)를 이용해 SQL Injection이 가능하다.
- 최종적으로 ?no=0%09or%09id='admin'을 입력하면 필터링을 우회가능하다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-39 문제 (0) | 2026.01.23 |
|---|---|
| [webhacking.kr] old-38문제 (0) | 2026.01.23 |
| [webhacking.kr] old-26문제 (0) | 2026.01.22 |
| [webhacking.kr] old-54 문제 (0) | 2026.01.21 |
| [webhacking.kr] old-24 문제 (0) | 2026.01.20 |