1. 문제
<?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>
2. 풀이
2.1 서버 동작
- 먼저 사용자에게 id 변수를 입력 받는다.
- 최대 글자는 → 15
- \\\\ → 공백 문자로 치환
- ‘ → ‘ ‘ 로 치환
2.2 해결 과정
id='{$_POST['id']}
- 코드를 보면 닫는 따옴표가 없다.
- 닫는 따옴표를 달고 id 값에 1이 되도록 해보자
$_POST['id'] = substr($_POST['id'],0,15);
$_POST['id'] = str_replace("'","''",$_POST['id']);
- 이 2개의 코드에서 14글자를 만들 수 있는 상황을 보면
- substr에서 0~15까지 문자 갯수를 넣을 수 있다.
- 그렇다면 1 + 공백 13개+ ‘ 를 해주면
- 14자리가 완성되고 ‘’ 이 붙지만 최대 15개 이므로 ‘ 한개가 없지면서 SQL 구문이 완성된다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-54 (1) | 2025.02.07 |
---|---|
[Webhacking.kr] old-38 (1) | 2025.02.07 |
[Webhacking.kr] old-15 (0) | 2025.02.02 |
[Webhacking.kr] old-10 (0) | 2025.02.01 |
[Webhacking.kr] old-03 (2) | 2025.02.01 |