티스토리 뷰


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

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



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





  문제 분석




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

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


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

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


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

  -- 실행 쿼리 ↑--


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

  -- 해결 포인트 ↑--

?>


  해결 과정



필터링 

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


-  실행 쿼리 

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

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

   ㆍand 연산자를 이용해 query가 항상 거짓이게 만들고 있다.  


-  해결 포인트

   ㆍ if($result['id'] == 'admin'solve("skeleton"); 

   ㆍid에 admin값을 불러올 수 있으면 된다.


  현재 쿼리를 보면 and연사자를 이용해 쿼리가 항상 거짓이게 만들고 있다. 이는 이전 난이도에서 많이 접했던 

  SQL Injection을 이용한 문제임을 알 수 있다. 별다른 필터링이 없기 때문에 우리가 필요한 쿼리만 얻고 나머지 

  쿼리는 주석처리를 통해 무효화 시킬 수 있다.


 ↑ 현재 skeleton과 마찬가지로, 조건 연산자 and 때문에 쿼리가 완성되지 않는다.

   # and 연산자는 앞뒤가 모두 참일 때 참이다.

   # 주석( # ) 처리를 통해 and 1=2 연산을 무효화 시킬 수 있다.


 ↑ 학생 harry를 조회할 때 no를 알지 못해도, or 연산을 통해 참인 결과를 완성할 수 있다.

   # 주석( # )을 통해 and 1=2 연산을 무효화 시켜준다.

 

 ↑ 같은 방법으로 이번 난이도를 해결할 수 있다.








  skeleton 중요 포인트



  ㆍquery가 데이터 베이스에서 어떻게 동작 하는지 파악하고 주석을 활용해 이를 조정할 수 있다.

  

 



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

los : darkknight  (0) 2017.06.24
los : golem  (0) 2017.06.23
los : vampire  (0) 2017.06.23
los : troll  (0) 2017.06.22
los : orge  (0) 2017.06.22