반응형
<?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>
<?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);
}
}
?>
POST 방식으로 id 파라미터의 값이 있으면, id 파라미터의 값에서 '\' 문자를 공백으로 필터링하고, 싱글 쿼터는 싱글 쿼터 두 개로 바꾸고, 길이를 15개로 자른다.
그리고 sql 쿼리를 실행하고, 1이 반환되면 문제가 해결된다.
select 1 from member where length(id)<14 and id='{$_POST['id']}
sql 쿼리를 보면 member 테이블에서 id 값의 길이가 14보다 작고 id가 id 파라미터에 담긴 값과 같은 것을 반환하는 것이다.
하지만, and id= 부분을 보면 싱글 쿼터가 열리긴 했지만 닫히지는 않았다.
싱글 쿼터를 닫기 위해서 싱글 쿼터를 입력해줘야 하는데, 싱글 쿼터를 넣으면 싱글 쿼터 두 개로 변환된다.
하지만 substr()를 이용해 문자 15개만 사용하는데, 이때 추가적으로 생기는 싱글쿼터를 무시하게 하면 된다.
즉, 싱글 쿼터 하나를 입력하면 싱글 쿼터 두 개로 변환되는데 이때 싱글 쿼터 두 개 중 두 번째 싱글 쿼터를 무시하게 한다는 것이다.
그렇다면 아래와 같이 입력하면 된다.
admin '
반응형
'전쟁 > Webhacking.kr' 카테고리의 다른 글
[Webhacking.kr] old-59 (0) | 2022.07.19 |
---|---|
[Webhacking.kr] old-5 (0) | 2022.07.14 |
[Webhacking.kr] old-3 (0) | 2022.07.13 |
[Webhacking.kr] old-27 (0) | 2022.07.13 |
[Webhacking.kr] old-18 (0) | 2022.07.13 |