web/LOS

[LOS] zombie_assassin

Tyojong 2025. 8. 14. 08:45
<?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__); 
?>

 

문제 목표

if($result['id']) solve("zombie_assassin"); 

id가 출력되면 문제가 해결된다.

 

$_GET['id'] = strrev(addslashes($_GET['id']));
$_GET['pw'] = strrev(addslashes($_GET['pw']));

id와 pw에서 입력받은 문자열은 addslashes함수와 strrev함수를 거친다.

addslashes함수는 ' " \ null 앞에 \를 붙여 문자열로 처리되도록 하는 함수이고

strrev함수는 문자열의 순서를 거꾸로 만드는 함수이다.

 

문제 해결

\나 '를 사용하려고 하면 문법에 맞지 않아 문제가 해결되지 않는다.

하지만 " 나 null(%00)를 사용하게 되면

"나 null 앞에 \가 붙게 되어 \" 가 되고 strrev함수로 인해 "\로 바뀌게 되어 기존에 있던 '가 문자열로 바뀌게 되어 "\' and pw= 라는 문자열을 만들 수 있어 우회가 가능하다.

 

이후 pw에 or 1=1 -- 을 거꾸로 만든 -- 1=1 ro 를 입력하게 되면