
1. 문제 정보
- 문제 번호 : old -61
- 문제 점수 : 20점
2. 문제 분석
문제에 들어가면 view-source만 나온다 소스코드를 확인해보자

소스코드눈 PHP로 되어 있으며 id값을 파라미터로 받아서 addslash와 preg_match로 필터링하고 있다. 또한 최대 id값은 15개이다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
$db = dbconnect();
if(!$_GET['id']) $_GET['id']="guest";
echo "<html><head><title>Challenge 61</title></head><body>";
echo "<a href=./?view_source=1>view-source</a><hr>";
$_GET['id'] = addslashes($_GET['id']);
if(preg_match("/\(|\)|select|from|,|by|\./i",$_GET['id'])) exit("Access Denied");
if(strlen($_GET['id'])>15) exit("Access Denied");
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
echo "<b>{$result['id']}</b><br>";
if($result['id'] == "admin") solve(61);
echo "</body></html>";
?>
3. 풀이
$result = mysqli_fetch_array(mysqli_query($db,"select {$_GET['id']} from chall61 order by id desc limit 1"));
select절에 GET['id']값이 들어가 있다.
*을 입력해서 어떤 값이 우선적으로 출력되는 지 확인해보자

test값이 나오고 desc limt 1 때문에 값이 1개와 그리고 id테이블을 조회했을 때 거의 test값이 나오게 된다.
select문에 들어갈 수 있는 것들을 정리하면 아래와 같다.
- 컬럼명 및 와일드카드
- 별칭(Alias)
- 상수 및 리터럴(숫자, 문자열, 16진수)
- 연산식 (산술 연산, 비트 연산)
- 함수 및 시스템 변수 데이터를 변환하거나 DBMS의 정보
- 조건문 (CASE 구문) 프로그래밍 언어의 if-else와 유사한 로직(CASE WHEN id = 1 THEN 'admin' ELSE 'guest' END)
- 서브쿼리 (Subquery) SELECT (SELECT pw FROM admin) FROM board 처럼 다른 테이블의 데이터를 가져올 때 사용. (단, 괄호가 필요하므로 괄호 필터링 시 사용 불가)
여기에서 서브쿼리를 사용하면 필터링에 걸리고 조건문은 사용하면 너무 길다.
따라서 리터럴과 별칭을 사용해서 우회해보자.
별칭은 AS 구문으로 주로 쓰이지만 %20즉 스페이스 바로도 생략 가능하다. 그리고 '와"는 addslash로 필터링 되므로 16진수로
0x61646D696E%20id을 하면 id admin으로 값이 나와 성공한다.

4. 요약
- 이 문제는 사용자 입력값이 SELECT 절의 컬럼 위치에 검증 없이 들어가는 취약점을 이용하여 쿼리 구조를 조작하는 문제이다.
- addslashes와 preg_match로 따옴표와 괄호가 차단된 상황에서, 문자열 'admin'을 16진수 리터럴로 변환하고 AS 키워드를 공백으로 대체하여 필터링을 우회했다.
- 최종적으로 15글자 길이 제한 내에서 결과값의 별칭을 id로 지정함으로써, 반환되는 데이터를 admin으로 조작하여 인증 로직을 통과했다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-56 문제 (0) | 2026.02.02 |
|---|---|
| [webhacking.kr] old-59 문제 (0) | 2026.02.02 |
| [webhacking.kr] old-10 문제 (0) | 2026.01.30 |
| [webhacking.kr] old-12 문제 (0) | 2026.01.30 |
| [webhacking.kr] old-51 문제 (0) | 2026.01.30 |