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