김승현

[Lord Of SQLInjection] vampire 9번 문제 write up 본문

Web/Lord Of Sql

[Lord Of SQLInjection] vampire 9번 문제 write up

kshind 2023. 3. 18. 19:37

문제는 이렇게 생겼다. 한  줄 한 줄씩 분석해보자.

  include "./config.php"; 
  login_chk(); 
  $db = dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  $_GET[id] = strtolower($_GET[id]);

첫 번째 줄은 ./config.php를 포함한다는 내용입니다.

두 번째 줄은 로그인을 했는지 체크하는 내용입니다.

세 번째 줄은 db를 연결합니다.

네 번째 줄은 id에서 대소문자 구분 없이'(작은 따옴표)를 필터링하는 내용입니다.

그러난 후 id의 내용들을 소문자로 바꿉니다.

  $_GET[id] = str_replace("admin","",$_GET[id]); 
  $query = "select id from prob_vampire where id='{$_GET[id]}'";

첫 번째 줄은 id의 내용에 admin이 포함된다면 공백으로 치환하는 내용입니다.

두 번째 줄은 $query에 select id from prob_vampire where id='{$_GET[id]}' 내용을 저장하는 내용입니다.

  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysqli_fetch_array(mysqli_query($db,$query)); 
  if($result['id'] == 'admin') solve("vampire"); 
  highlight_file(__FILE__);

query : {$query}의 내용을 강조해서 출력합니다.

$result에 db를 연겨랗고 query의 내용을 저장합니다.

만약 $result['id']의 내용이 admin이면 vampire 문제가 solve 됩니다.

 

id를 admin으로 입력해서 쿼리문을 작성하면 되지만 

  $_GET[id] = str_replace("admin","",$_GET[id]);

아래의 코드에서 admin을 지워버립니다. 그러나 이렇게 공백치환으로 admin 입력을 막는 경우

admadminin과 같이 작성하면 admadminin처럼 중간의 admin이 사라지면서 admin이 저장됩니다.

(aadmindmin이나 adadminmin이나 admiadminm도 가능합니다!)

<입력한 내용>

?pw=adadminmin