티스토리 뷰


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

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



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





  문제 분석




<?php 


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

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


  if(preg_match('/prob|_|\.|\(\)/i'$_GET[no])) exit("No Hack ~_~"); 
  if(
preg_match('/\'/i'$_GET[pw])) exit("HeHe"); 
  if(
preg_match('/\'|substr|ascii|=|or|and| |like|0x/i'$_GET[no])) exit("HeHe"); 

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


  $query "select id from prob_bugbear where id='guest' and pw='{$_GET[pw]}' and no={$_GET[no]}"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if(
$result['id']) echo "<h2>Hello {$result[id]}</h2>"

  -- 실행 쿼리 ↑--


   
  $_GET[pw] = addslashes($_GET[pw]); 
  
$query "select pw from prob_bugbear where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear"); 
  
highlight_file(__FILE__); 

  -- 해결 포인트 ↑--


?>



  해결 과정



필터링 

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

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

   ㆍ ' ( 싱글쿼터 )  싱글 쿼터를 이용한 SQL Injection query를 완성하지 못하게 필터링  

   ㆍ substr, ascii, =, or, and, 공백, like, 0x → Blind SQL Injection의 주요 함수를 필터링 하고 있다. 

         ( 위의 함수를 보고 Blind SQL Injection과의 관련성을 파악 )


-  실행 쿼리 

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

   ㆍ조건 id는 'guest'로 픽스 되어있고, pw와 no를 GET메서드로 넘겨받고 있다.  

   pw는 싱글쿼터가 쳐져있지만, no는 GET 메서드만 받고 있다.


-  해결 포인트

   ㆍ if(($result['pw']) && ($result['pw'] == $_GET['pw'])) solve("bugbear"); 

   ㆍ데이터 베이스에 저장되어 있는 admin의 pw를 입력하면 문제가 해결된다. 


  darkknight와 비슷한 문제이다. 필터링 되고있는 함수들을 우회할 수 있는 같은 기능의 다른 함수를 찾아내면 된다.

  여기서 알아두어야 할 점은 현재 pw는 값을 받아올때 코드상에 싱글쿼터가 쳐져있기 때문에 값이 자동으로 싱글쿼터

  안으로 들어간다. ( ' {$_GET[pw]} ' ) 하지만 no는 값을 받아올때 값이 그대로 들어간다. ( no={$_GET[no]} ) 이 점을 

  이용해서 현재 필터링 되고있는 싱글쿼터를 사용하지 않고 SQL Injection을 시도할 수 있다.


  필터링 되고 있는 함수와 동일한 기능을 하는 함수를 찾아내서 필터링 우회를 시도해 볼 수 있다.



    ↑필터링 되고 있는 함수 및 문자를 우회할 수 있는 함수와 문자들이 여럿 존재한다.


  ↑strcmp 함수는 두 문자열을 비교한다. 

    #SELECT strcmp( a, b ) → a=b return 0, a<b return -1, a>b return 1


  ↑strcmp 함수를 응용해서 사용할 수 있다.

   # SELECT !strcmp( a,b ) → a=b return 1 , a≠b return 0


  ↑!strcmp이용해서 admin 사용자에 접근할 수 있다.


  ↑우회 함수를 이용해 필터링을 우회할 수 있다.


  ↑Blind SQL Injection을 이용해서 문제를 해결할 수 있다.



  bugbear 중요 포인트



  ㆍ필터링되고 있는 함수를 파악하고 우회할 수 있는 함수를 찾아낸다.

  ㆍBlind SQL Injection을 시도할 때 머리속에 데이터 베이스의 구성을 그릴 수 있어야 한다.

  ㆍBlind SQL Injection을 시도할 때 자동화 코드 구성 해보기







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

los : succubus  (1) 2017.10.06
los : giant  (0) 2017.06.27
los : darkknight  (0) 2017.06.24
los : golem  (0) 2017.06.23
los : skeleton  (0) 2017.06.23