[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