티스토리 뷰


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

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



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






  문제 분석




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

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


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

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


  $query "select id from prob_golem 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>"

  -- 실행 쿼리 ↑--

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

  -- 해결 포인트 ↑--


?>



  해결 과정



필터링 

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

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

   or, and, substr, = → or, and, substr, = 문자를 필터링, SQL Injectrion query 완성을 막고 있다.


-  실행 쿼리 

   SELECT id FROM prob_golem WHERE id='guest' and pw='{$_GET[pw]}';

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


-  해결 포인트

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

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


  이전 문제와 비슷하게 Blind SQl Injection을 시도하는 문제이다. 단, 이전 blind sql injectrion에서 주로 사용했던

   or , and , substr , = 을 필터링 하고 있다.


   or 과 and 조건 연산자는 각각 || 와 %26%26( && )로 우회 할 수 있다. substr함수와 =도 우회 할 수 있는 문자가
   존재한다


 ↑substr과 같은 기능을 하는 함수로 mid함수가 존재한다.

  # mid ( a,b,c ) : 문자열 a의 b번째에서 c개의 문자열 조회


 ↑=을 필터링할 때 부등호를 이용해서 a의 아스키 값을 구할 수 있다.


 ↑ascii의 부등호를 특징을 이용해서 위처럼 문제를 해결해 갈 수 있다.

   # id를 추측하기 때문에 정확도가 떨어질 수 있다. id컬럼에 a로 시작하는 다른 id가 존재할 수 도 있기 때문





 ↑id='admin'을 지정할 때 ascii를 이용한 불완전한 추측방식 보다 instr을 이용해서 정화하게 id를 admin으로 지정할 수 있다.

   #  instr( a, b ) : a에서 b가 가리키는 위치를 반환하고, 일치하는 정보가 없다면 0을 반환한다.


 ↑instr을 이용해서 1을 리턴해준다면 위의 쿼리를 항상 이게 만들어 줄 수 있다.


ㆍSELECT id FROM prob_golem WHERE in='guest' and pw='' || instr(id,'admin') && ascii(mid(pw,1,1)) < 100 #'

                                                                    ↓

ㆍSELECT id FROM prob_golem WHERE in='guest' and pw='' || 1 && ascii(mid(pw,1,1)) < 100 #'

                                                             ( 0이 아닌 모든 숫자에 대해서 참이다. )


 ↑현재 난이도에서 진행되는 필터링을 다음 함수로 우회 할 수 있다.


 ↑admin의 비밀번호를 알아내서 정확히 입력하면 현재 난이도를 해결할 수 있다.

  




  golem 중요 포인트



  ㆍand, or 연산자과 substr, = 를 우회할 수 있는 문자

  ㆍBlind SQL Injection을 시도할 때 데이터 베이스의 구성을 그릴 줄 알아야 한다.

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




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

los : bugbear  (0) 2017.06.27
los : darkknight  (0) 2017.06.24
los : skeleton  (0) 2017.06.23
los : vampire  (0) 2017.06.23
los : troll  (0) 2017.06.22