
1. 문제 정보
- 문제 번호 : old -26
- 문제 점수 : 10점
2. 문제 분석
들어가면 까만 화면과 view-source가 나온다.

소스는 아래와 같다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Challenge 26</title>
<style type="text/css">
body { background:black; color:white; font-size:10pt; }
a { color:lightgreen; }
</style>
</head>
<body>
<?php
if(preg_match("/admin/",$_GET['id'])) { echo"no!"; exit(); }
$_GET['id'] = urldecode($_GET['id']);
if($_GET['id'] == "admin"){
solve(26);
}
?>
<br><br>
<a href=?view_source=1>view-source</a>
</body>
</html>
소스에서는 preg_match를 통해 /admin/과 get['id']값을 비교해 같으면 no를 반환하고 종료한다.
그리고 urldecode를 하고 admin과 같으면 solve(26)이 반환된다.
그러면 preg_match할때는 인코딩 되어 있으면서 if문에서는 디코딩한 값이 admin이면 문제가 풀린다.
3. 풀이
아래와 같이 get의 id인자값에 %2561dmin값을 입력하면 첫 번째에서는 %61dmin이 첫 번째 비교이며 두번째에는 admin이 되서 통과한다.

4. 요약
- 소스 코드는 preg_match로 "admin"을 먼저 필터링하지만, 이후 urldecode를 추가로 수행하여 필터링을 무시하는 취약점이 있다.
- PHP 서버가 $_GET 입력값을 받을 때 자동으로 한 번 디코딩한다는 점을 고려하여, 필터링은 피하고 최종 비교 값은 "admin"이 되도록 만들어야 한다.
- 이중 URL 인코딩(Double URL Encoding) 값인 %2561dmin을 입력하면, 필터링 단계는 %61dmin으로 통과하고 이후 코드 내의 디코딩을 통해 admin으로 변환되어 문제가 해결된다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-38문제 (0) | 2026.01.23 |
|---|---|
| [webhacking.kr] old-18문제 (0) | 2026.01.22 |
| [webhacking.kr] old-54 문제 (0) | 2026.01.21 |
| [webhacking.kr] old-24 문제 (0) | 2026.01.20 |
| [webhacking.kr] old-32 문제 (0) | 2026.01.20 |