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


SQLi 문제인 거 같습니다.

여기서 문제를 볼 때 id에 넣은 값 중에 싱글쿼터, 역슬레쉬는 str_replace되는 것을 볼 수 있습니다.

그리고 입력하는 값은 length가 14보다 작아야 하며, 어차피 substr으로 잘리게 되네요.


이러한 조건을 우회하고 SQLi를 수행해야 합니다.


그런데 자세히 보면 SQL 문을 보면 맨 뒤에 싱글쿼터가 하나 덜 쓰여져있는 걸 볼 수 있습니다.

그러면 싱글쿼터를 잘 활용하면 될 거 같습니다.


여기서 트릭의 요소로써 활용될 수 있는 게 substr입니다.

0,15라고 하면 15번째까지 짜른다는 의미입니다. 여기서 replace할 때 싱글쿼터는 두 개의 싱글쿼터로 변환되니, 이를 이용하여 16번째에 싱글쿼터가 오도록하면 잘라낼 수 있을 것 같습니다.


혹시 guest가 있을까 하고 값을 입력해봤는데 guest가 있더군요..

MySQL에서는 값에 띄어쓰기가 있으면 띄어쓰기를 제외한 값을 비교합니다.


예를들면 where절에 'guest          ' 라는 값과 'guest'라는 값을 넣었을 때, 같은 값으로 받아들입니다.

guest + 띄어쓰기 9번 + 싱글쿼터 를 하게 되면 문제가 풀리게 됩니다.







'WARGAMES > webhacking.kr - old' 카테고리의 다른 글

Webhacking.kr_No43(250) - old  (0) 2020.01.08
Webhacking.kr_No42(200) - old  (0) 2020.01.08
Webhacking.kr_No41(250) - old  (0) 2020.01.08
Webhacking.kr_No40(500) - old  (0) 2020.01.08
Webhacking.kr_No38(100) - old  (0) 2020.01.07
Webhacking.kr_No37(250) - old  (0) 2020.01.06
Webhacking.kr_No36(200) - old  (0) 2020.01.06
Webhacking.kr_No35(350) - old  (0) 2020.01.06

+ Recent posts