
1. 문제 정보
- 문제 번호 : old -39
- 문제 점수 : 10점
- 분야 : sql
2. 문제 분석

제출하라는 폼만 나오고 view-source가 나온다.
<?php
include "../../config.php";
if($_GET['view_source']) view_source();
?><html>
<head>
<title>Chellenge 39</title>
</head>
<body>
<?php
$db = dbconnect();
if($_POST['id']){
$_POST['id'] = str_replace("\\","",$_POST['id']);
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id'] = substr($_POST['id'],0,15);
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
if($result[0] == 1){
solve(39);
}
}
?>
<form method=post action=index.php>
<input type=text name=id maxlength=15 size=30>
<input type=submit>
</form>
<a href=?view_source=1>view-source</a>
</body>
</html>
소스는 위처럼 생겼고 \\즉 \를 필터링하고 '를 ''로 만든다.
일단 str.replace("\\")에서 처음 막혔는데 \\를 필터링하는줄 알았느데 \를 필터링하는 거였다.
그리고 두번째로 막힌건 length(id)<14 and id='{$_POST['id']}"에서 length에서 id값이 어디서 나오는 건지 몰랐다.
length에서 id값은 sql에서 DB가 튜플을 조회할 때 그 튜플의 id값의 길이이다.
3. 풀이
데이터베이스에서 where에서 %20즉 엔터는 무시된다. 그러므로 admin하고 공백으로 14글자를 채운 뒤에 '를하면 15, 16번째에 '가 들어간다 하지만 substr로 15번째부터 잘린다. 따라서 where 절에서 burp suite로 id값에 admin '으로 하면 문제가 풀린다.


4. 요약
- PHP의 str_replace로 길이가 늘어난 문자열이 substr로 잘리면서 마지막 문자가 변조되는 취약점을 이용한다.
- length(id)는 DB 테이블에 저장된 값을 검사하며, MySQL은 문자열 비교 시 끝 공백ㅜ을 무시하는 특성이 있다.
- admin 뒤에 공백 9개와 '를 입력해, ''가 '로 잘리게 만들고 공백 무시 특성을 통해 admin 계정으로 로그인에 성공했다.
'워게임 > webhacking.kr' 카테고리의 다른 글
| [webhacking.kr] old-27 문제 (0) | 2026.01.26 |
|---|---|
| [webhacking.kr] old-31 문제 (0) | 2026.01.23 |
| [webhacking.kr] old-38문제 (0) | 2026.01.23 |
| [webhacking.kr] old-18문제 (0) | 2026.01.22 |
| [webhacking.kr] old-26문제 (0) | 2026.01.22 |