반응형

<?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

+ Recent posts