LOS 포스트는 이해한 내용과 복습을 위한 목적으로 작성되었습니다.

이번 포스트는 troll에 이어 vampire 문제에 대한 이해와 풀이를 진행해보도록 하겠습니다.

vampire는 단순 필터링 우회문제입니다.



 

 문제 이해


문제 소스코드는 다음과 같이 PHP 소스를 그대로 보여주는 것을 알 수 있습니다.

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/\'/i', $_GET[id])) exit("No Hack ~_~");
  $_GET[id] = strtolower($_GET[id]);
  $_GET[id] = str_replace("admin","",$_GET[id]); 
  $query = "select id from prob_vampire where id='{$_GET[id]}'"; 
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id'] == 'admin') solve("vampire"); 
  highlight_file(__FILE__); 
?>


위의 문제에서 6번 라인에서는 문자열을 모두 소문자로 바꿔주는 함수입니다.

또한 7번 라인에서는 admin이 발견되면 문자열을 한 번 삭제해주는 함수입니다.

이외의 조건은 없어보이며, 우리는 id='admin'이 되도록 열심히 필터링을 우회해주면 됩니다.





 

 문제 풀이(쿼리)


GET 형태이기 때문에 다음과 같이 쿼리를 짜주었습니다.



 

 id 쪽에 값 삽입(admin 한번 삭제를 우회)


이 문제에서는 admin을 한 번 발견하면, 딱 한 번 지워준다는 취약점을 가지고 있습니다.

따라서 admin이라는 문자열 안에 admin을 한 번 더 넣어주게 되면 안에 있는 admin은 사라지고 완전한 admin이 남게 되지요.

뭔가 랩 같이 글을 쓰게 됐는데 설명은 아래에서 더 자세히 하겠습니다.

https://los.rubiya.kr/chall/vampire_e3f1ef853da067db37f342f3a1881156.php?id=admadminin


위의 쿼리는 id=admadminin 이라고 작성해주었습니다.

여기서 admadminin 이라고 작성된 부분에서 admin은 삭제되고 admin만 남게 된다는 겁니다.


 query : select id from prob_vampire where id='admadminin'


이렇게 되면 id에는 완전한 admin만 남게 됩니다.


+ Recent posts