티스토리 뷰

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

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



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

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


  $query "select id from prob_succubus 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("succubus"); 
  
highlight_file(__FILE__); 

  -- 해결 포인트 ↑--


?>



  해결 과정



필터링 

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

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

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



-  실행 쿼리 

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

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


-  해결 포인트

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

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


  succubus문제를 풀 때 만약 싱글쿼터( ' )를 필터링 하지 않는다면 무난하게 qeury가 항상 참일 수 있게 만들어

 문제를해결할 수 있을 것이다. 하지만 현재 preg_match를 통해 싱글쿼터( ' )를 필터링하고 있기 때문에 접근

 하기가 매우 어려울 수 있다. 

 더블 쿼터( " )를 사용해도 더블쿼터마저 문자열로 취급해 버리기 때문에 효과가 없다.

 이 문제를 해결할때 쿼리를 단편적으로 보기보다는 전체적으로 봐야하는데 이는 현재까지 싱글쿼터( ' )로  

 묶였을 때 우회하기란 불가능하다는 점에서 매우 중요하다.

 ( 더블쿼터의 사용은 싱글쿼터의 우회라고 볼 수 없다. )



 ↑조건 student와 age를 알지 못해도 query가 항상 참이게 만들면 student컬럼의 모든 내용을 가져올 수 있다.

    # 하지만 문제에따르면 $_GET[student], $_GET[age]를 통해서 값을 받는다.


 ↑GET메서드로 값을 받을 때 , query의 동작을 응용해 볼 수 있다. 

   # 이스케이프( \ )는 특수한 기능을 가지고 있는 문자를 일반문자로 해석하는 기능을 가지고 있다. 즉, \' → 싱글 쿼터의 기능을 잃는다.

   #  위 query에 따르면 magic_student=' and age= ' 처럼 and age= 를 문자열로 취급 해버린다. 

   #  그 뒤 조건 or을 통해서 query가 항상 참이게 만들어 준다.


  이와 같은 방식으로 단순히 id값만 존재면 문제를 해결할 수 있는 상황이라면 id값이 존재하기만 하면 된다.

  그렇기 때문에 위 방식을 통해서 query가 항상 참이게 만들어 줄 수 있는 것이다.


 ↑위의 방식을 문제에 적용한다면 문제를 해결할 수 있다.





  succubus 중요 포인트



  ㆍquery의 구조를 파악할 때 각각의 메서드가 쿼리에서 어떻게 작용하는지 파악해야 한다.

  ㆍ다양한 시각에서 query에 접근할 수 있어야 한다. 




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

los : zombie_assassin  (0) 2018.12.05
los : nightmare  (1) 2018.11.11
los : giant  (0) 2017.06.27
los : bugbear  (0) 2017.06.27
los : darkknight  (0) 2017.06.24