<?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);
}
}
?>
코드를 보니, 첫번째 replace인 str_replace(“\\”,””,$_POST[‘id’])은 입력값에서 ::\::이 있는 경우 제거한다. 두번째 replace인 str_replace(“’”,”’’”,$_POST[‘id’])은 입력값에서 ::’::을 ::’’::으로 변환한다.
이 2가지를 통과한 후, Substr 함수에 0, 15을 줘서 입력값의 0번째부터 14번째 인덱스까지 추출하여 쿼리문에 삽입한다.
쿼리는 length(id)<14 and id=‘{$_POST[‘id’]}이 True면 1를 출력한다.
결과가 1이 나와야 조건문이 실행이 되면서 Flag를 얻을 수 있다.
일단 쿼리에서 from이 member인 것을 보아서 지금까지 나온 admin, guest를 이용하면 될 것으로 판단이 된다.
문제는 id=‘{$_POST[‘id’]}가 쿼리문으로 될려면 뒤에 ’이 있어야 하는데, 두번째 replace 때문에 ’’으로 변환이 된다는 것이다. 그래서 될지 모르겠지만, 인덱스 0부터 14까지만 반영된다는 것을 이용하여 admin '을 입력하였다.
이유는 admin '가 두번째 replace에 의해 admin ''으로 변환되고, 인덱스 0 ~ 14까지는 admin ‘임으로 ’의 문제는 해결이 되기 때문이다.