-
<Webhacking.kr> old-39Wargame/Webhacking.kr 2021. 12. 27. 15:54
view-source를 통해 페이지 소스 코드를 살펴보면
<?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>
$_POST['id'] = str_replace("\\","",$_POST['id']);
POST로 전달받은 id에서 "\\"를 ""로 변환한다.
$_POST['id'] = str_replace("'","''",$_POST['id']);
$_POST['id']에서 "'"를 "''"로 변환한다.
$_POST['id'] = substr($_POST['id'],0,15);
$_POST['id']의 0부터 15개의 문자만 가져온다.
$result = mysqli_fetch_array(mysqli_query($db,"select 1 from member where length(id)<14 and id='{$_POST['id']}"));
$_POST['id']를 이용해 쿼리를 수행한다.
if($result[0] == 1){ solve(39); }
위 쿼리를 수행한 결과가 1이면 문제가 풀린다.
쿼리의 결과가 1이면 되고, 쿼리문을 살펴보면 싱글 쿼터의 짝이 맞지 않는다.
따라서, 1 + 13개의 공백 + 싱글쿼터(')를 입력하면
$_POST['id']가 "1 ''"로 싱글쿼터가 2개가 되지만 substr()이 0번째 부터 15개이므로 자동으로 걸러준다.
즉, "1 '"을 입력하면
"select 1 from member where length(id)<14 and id='{$_POST['id']}"에서
"select 1 from member where length(id)<14 and id='1'"을 입력하면 두 조건 모두 참이 되어 결과값으로 1을 가진다.
'Wargame > Webhacking.kr' 카테고리의 다른 글
<Webhacking.kr> old-59 (0) 2021.12.28 <Webhacking.kr> old-54 (0) 2021.12.27 <Webhacking.kr> old-28 (0) 2021.12.25 <Webhacking.kr> old-29 (0) 2021.12.21 <Webhacking.kr> old-25 (0) 2021.12.19