티스토리 뷰


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

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



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




  문제 분석




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

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


  if(preg_match('/\'/i'$_GET[id])) exit("No Hack ~_~"); 

  $_GET[id] = str_replace("admin","",$_GET[id]); 

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


  $query "select id from prob_vampire where id='{$_GET[id]}'"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"

  -- 실행 쿼리 ↑--


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

  -- 해결 포인트 ↑--
?>"



  해결 과정



필터링 

    ' ( 싱글 쿼터 ) → SQL Injection query를 완성할 수 없도록 싱글쿼터를 필터링 

    str_replace를통해 admin이라는 문자를  ""( 공백 )으로 치환하고 있다.


-  실행 쿼리 

   SELECT id FROM prob_vampire WHERE  id='{$_GET[pw]}';

   id를 GET메서드로 넘겨받고 있다.



-  해결 포인트

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

   ㆍid에 admin을 가져오면 troll을 해결할 수 있다.


  troll과 비슷한 문제로 보인다. preg_match를 쓰지않고 str_replace를 쓰는 이유는 str_replace에 키 포인트가 있다고 

  생각할 수 있어야 한다. 


   # str_replace 함수 정의 

     ㆍstr_replace( $search, $replace, $subject ); 

        - 발견한 모든 검색 문자열을 치환 문자열로 교체한다. 

         ( 만약 subject가 배열이면, 검색 및 치환을 subject의 모든 원소에서 수행하고, 배열을 반환한다. )

        - str_replace( 찾을 문자열, 치환할 문자열, 대상 문자열 );

        - 대소문자를 구분한다. 


   즉,$_GET[id] = str_replace("admin","",$_GET[id]);   GET 메서드로 받아온 id에 대하여 admin이라는 문자열을 찾아 공백으로

   치환해준다. id='admin'으로 GET값을 보낼 때 id=' ' ( null 값 )로 치환 된다.

   대소문자를 구분하기 때문에 troll과 마찬가지로 대소문자를 통해 우회할 수 있고, admin이 삭제된다는 점을 이용해서 

   영리하게 우회 할 수 있다. ex) adadminmin  → admin이 삭제 되면서 admin이 완성된다.


 ↑ 어떻게 admin을 id값으로 보낼 수 있는지 생각해보자






  vampire 중요 포인트



  ㆍstr_replace 함수의 취약점

  ㆍ정규 표현식의 취약점을 이용해 우회하는 방법

 


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

los : golem  (0) 2017.06.23
los : skeleton  (0) 2017.06.23
los : troll  (0) 2017.06.22
los : orge  (0) 2017.06.22
los : darkelf  (0) 2017.06.22