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

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

dragon은 단순 필터링 우회문제이지만, 주석을 어떻게 우회할지 고민이 필요합니다.


근데 드래곤 그림 넘나 귀여운 것...



 

 문제 이해


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

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect(); 
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  $query = "select id from prob_dragon where id='guest'# and pw='{$_GET[pw]}'";
  echo "<hr>query : <strong>{$query}</strong><hr><br>"; 
  $result = @mysql_fetch_array(mysql_query($query)); 
  if($result['id']) echo "<h2>Hello {$result[id]}</h2>"; 
  if($result['id'] == 'admin') solve("dragon");
  highlight_file(__FILE__); 
?>


위의 문제에서 6번에서는 이미 조건문에 주석이 작성되어 있는 것을 볼 수 있습니다.

즉, id='admin' 뒤에는 모두 주석처리고 되어버리고 맙니다.

또한 여기서는 주석 뒤에 있는 영역에만 값을 입력할 수 있게 되기 때문에 이를 어떻게 우회할지 고민해야합니다.





 

 문제 풀이(쿼리)


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



 

 pw쪽에 값 삽입


이 문제에서는 개행문자를 이용해야 합니다.

개행문자를 사용하게 되면 다음과 같은 효과를 받을 수 있습니다.


개행문자와 인자값 삽입 :

 select id from prob_dragon where id='admin'# and pw=''%0a

 and pw='' or id='admin'


그렇게 되면 위와 같이 쿼리가 수행되게 됩니다.

노랑색 박스로 된 부분은 주석처리가 되어 실행되지 않게 되지만, 개행문자 다음에 입력된 쿼리는 위의 주석처리되지 않은 쿼리와 함께 동작하게 됩니다. 마치 다음과 같이 됩니다.


 select id from prob_dragon where id='admin' and pw='' or id='admin'




+ Recent posts