반응형
https://webhacking.kr/challenge/bonus-10/
Chellenge 39
webhacking.kr
[문제]
[풀이]
<?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>
소스 코드에서 확인할 수 있는 규칙은 아래와 같다.
1. id에서 "\\"문자열을 ""로 치환한다.
2. id에서 "'" 문자열을 "''"로 치환한다.
3. id에서 15개만 잘라낸다.
쿼리문을 보면 where에 id가 이상하다.
분명 id='에 싱글쿼터가 있는데 뒤에는 싱글쿼터가 없다.
싱글쿼터를 넣으면 문제가 풀리는 것 같다. 싱글쿼터를 넣기 위해서는 규칙 3번을 이용해야한다.
15개만 잘라내기 때문에 16번째부터는 통째로 문자열을 날린다.
15번째에 싱글쿼터를 위치시키면 규칙 2번에 의해 싱글쿼터가 두개가 되는 것을 무시할 수 있다.
a '
공백을 13번 넣었다.
제출하면 문제가 풀린다.
반응형