티스토리 뷰


※ 던전을 클리어하는 과정에서 얻은 힌트를 공유하려고 합니다.

※ 정확한 답을 알려드리지 않습니다. 스스로 해결하시길 권장합니다.



http://los.eagle-jump.org/(클릭)







  문제 분석




<?php 


  
include "./config.php"
  
login_chk(); 
  
dbconnect(); 

  -- DB연결을 위한 코드 ↑--


  if(preg_match('/\\\|prob|_|\.|\(\)/i'$_GET[id])) exit("No Hack ~_~"); 
  if(
preg_match('/\\\|prob|_|\.|\(\)/i'$_GET[pw])) exit("No Hack ~_~"); 
  if(@
ereg("'",$_GET[id])) exit("HeHe"); 
  if(@
ereg("'",$_GET[pw])) exit("HeHe"); 

  -- preg_match, ereg를 통한 필터링 ↑--


  $query "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"

  -- 실행 쿼리 ↑--


  $result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) solve("zombie_assassin"); 
  
highlight_file(__FILE__); 

  -- 해결 포인트 ↑--


?>




  해결 과정



필터링 

    prob_ , . , ( , ) → 이는 테이블에 직접 접근을 막고, 추가적으로 information_schema에 접근 방지 

       () → 붙은 괄호만 필터링 하고 있다. ( ) 안에 공백이나 문자가 있다면 우회가능

   ㆍ 싱글쿼터 ( ' ) → 싱글쿼터를 필터링 

       


-  실행 쿼리 

   $query "select id from prob_zombie_assassin where id='{$_GET[id]}' and pw='{$_GET[pw]}'"

   ㆍ조건 id와 pw를 GET메서드로 넘겨받고 있다.  


-  해결 포인트

   ㆍ   if($result['id']) solve("zombie_assassin");

   ㆍ현재 쿼리에서 id값이 존재만 한다면 문제를 클리어할 수 있다.


 현재 ereg를 통해서 싱글쿼터( ' )를 필터링 하고 있다. ereg를 통해 문자열 비교를 하는데 ereg는 문자열을 비교할 때

 앞 널문자( %00 )가 존재하면 문자열을 비교하지 않는다. 


  ※ 5.3버전에서만 발견되는 취약점


 ↑널바이트( %00 )을 이용해 ereg을 우회 할 수 있고, 이를 통해 SQL Injection을 시도할 수 있다.

   # id값이 존재하기만 하면 문제를 해결 할 수 있다.






  zombie_assassin 중요 포인트



  ㆍ정규표현식의 특징과 발견되 취약점



'War Game > [ los ] Lord of the SQL' 카테고리의 다른 글

los : nightmare  (1) 2018.11.11
los : succubus  (1) 2017.10.06
los : giant  (0) 2017.06.27
los : bugbear  (0) 2017.06.27
los : darkknight  (0) 2017.06.24