[LOS] 17번 zombie_assassin 풀이
2019. 8. 8. 13:53ㆍ문제풀이/los.rubiya.kr
<?php
include "./config.php";
login_chk();
$db = dbconnect();
$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));
if(preg_match('/prob|_|\.|\(\)/i', $_GET[id])) exit("No Hack ~_~");
if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~");
$query = "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
echo "<hr>query : <strong>{$query}</strong><hr><br>";
$result = @mysqli_fetch_array(mysqli_query($db,$query));
if($result['id']) solve("zombie_assassin");
highlight_file(__FILE__);
?>
금지단어는 prob _ . ()이고, 언뜻보면 전 문제인 succubus와 비슷해보이지만 이 부분이 다르다.
$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));
strrev는 문자열을 거꾸로 반환하는 함수이며,
addslashes는 ' 나 " , \, NULL(%00)의 앞에 \를 넣어 문자열로 인식하게 해주는 함수다.
만약 id로 ' 를 입력하게되면 \'가 입력된다.
하지만
strrev 함수로 인해 id에는 '\가 입력된다.
바로 이 점을 이용하여 NULL(%00)을 입력해주면
위 그림과 같이 id를 입력받는 두 싱글쿼터 중 뒤의 싱글쿼터가 문자열 처리가 되고, succubus 문제와 같은 상태를 만들 수 있다.
따라서 pw는 succubus와 같이 ||1=1--+, ||True# 등 참이 되게 하는 값을 넣어주면 되는데 pw도 strrev 함수가 먹히므로 거꾸로 적어주면 된다.
거꾸로 적어야하니까 당연히 #을 주석으로 쓸 수는 없다.
'문제풀이 > los.rubiya.kr' 카테고리의 다른 글
[LOS] 18번 nightmare 풀이 (0) | 2019.08.08 |
---|---|
[LOS] 16번 succubus 풀이 (0) | 2019.08.07 |
[LOS] 15번 assassin 풀이 (0) | 2019.08.07 |
[LOS] 14번 giant 풀이 (0) | 2019.08.07 |
[LOS] 13번 bugbear 풀이 (0) | 2019.08.07 |