티스토리 뷰


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

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



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/i'$_GET[pw])) exit("HeHe"); 

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


  $query "select id from prob_orge 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_orge where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orge"); 
  
highlight_file(__FILE__); 

  -- 해결 포인트 ↑--

?>



  해결 과정



필터링 

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

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


-  실행 쿼리 

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

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

   ㆍ쿼리가 제대로 실행되면 if( $result['id']) 실행


-  해결 포인트

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

   ㆍ해결 포인트는orc와 유사하다. admin의 비밀번호를 입력하면 해결할 수 있다.


  orc와 비슷하게 Blind SQl Injection을 시도하는 문제이다. 다만 or,and 연산을 사용할 수 없기 때문에 이를 우회하는

  문자를 사용하면서 Blind SQL Injection을 시도 해야한다.


 ↑ 현재 orge와 같은 환경을 구성해 보았다.

   # 알고 싶은 학생이 harry지만 현재 조건은 student='potter' 로 고정 되어있다. 이때 or( | | )연산자를 이용해서 쿼리가 항상 참이게

      만들어 student 컬럼의 모든 값을 조회할 수 있다.

   # orge문제에서는 결과가 존재하면 Hello Guest 혹은 Hello admin을 통해 참,거짓을 판단해 볼 수 있다.





 ↑ and( && ) 연산자를 이용해 student를 지정해 줄 수 있다. 

   # and( && )를 사용하지 않아도, harry라는 학생이 존재한다면 쿼리를 참이게 만들 수 있다.


 ↑ harry의 no를 알고 싶다면 and ( && ) 연산자와 ascii, substr 함수를 이용해서 알아낼 수 있다.

   # substr( no, 1, 1 ) 여기서 no는 문자열이 아닌 컬럼을 의미한다. 즉, student의 no를 의미한다.

   # 2를 아스키 변환하면 49가 되기때문에 harry의 no 1번째 글자는 2라는것을 알 수 있다.


 ↑ 같은 방식으로 admin의 pw를 알아낼 수 있다. 

   # 결과 참이기 때문에 Hello admin이라는 문구가 나온다.

   # Blind SQL Injection을 통해 admin의 pw가 6으로 시작하고 있음을 알 수 있다.


 ↑ 현재 테이블 prob_orge이 위와 같이 구성되어있음을 추측해 볼 수 있다.

   # guest와 admin의 순서가 다를 수 있다.

   # 데이터 베이스의 구성을 머리속으로 생각하면서 인젝션을 시도해야 한다.


 ↑ Blind SQL Injection을 시도 함으로서 orge를 해결할 수 있다.





  orge 중요 포인트



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

  ㆍBlind SQL Injection을 시도할 때 데이터 베이스의 구성을 추측해 볼 수 있어야 한다.

 




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

los : vampire  (0) 2017.06.23
los : troll  (0) 2017.06.22
los : darkelf  (0) 2017.06.22
los : wolfman  (0) 2017.06.22
los : orc  (0) 2017.06.21