[WARGAME] los.rubiya.kr - zombie_assassin

2022. 8. 14. 15:21정보보안/CTFLOG

반응형
<?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__); 
?>

17번 좀비 어세신 문제이다.

 

get으로 요청받는 부분을 보면 id와 pw 모두 addslashes함수로 처리된 후 strrev로 인해 문자열이 뒤집힌다.

https://www.php.net/manual/en/function.addslashes.php << addslashes에 대한 정보는 이곳에서 확인할 수 있다.

  • single quote (')
  • double quote (")
  • backslash (\)
  • NUL (the NUL byte)

이 4가지 앞에 슬래쉬가 붙는다고 생각하면 쉽다..

 

페이로드를 어떻게 구성해야 할지 잠깐 생각해 본다면,

저번 16번 문제인 서큐버스에서 \는 pw의 첫번째 싱글쿼터까지 문자열로 처리되게 하기 때문에

addslashes 함수와 strrev를 잘 사용한다면 풀린다.

id="&pw=%23 1=1 ro

이렇게 보낸다면

where id='"\' and pw='or 1=1 %23'

이렇게 되서 풀린다.

 

근데 왜 저 4가지중 하필 더블쿼터(")를 사용했는지 의문이다.

이유는 바로 '를 사용할지 더블쿼터가 만나서 

where id=''\' and pw='or 1=1 %23'

\'이 밖으로 나가게 되버리면서 실행되지 않는다.

따라서 더블쿼터를 사용해서 해결했다.

반응형