티스토리 뷰


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

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



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




  문제 분석




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

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


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

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


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

  -- 실행 쿼리 ↑--


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

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



  해결 과정



필터링 

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

    ereg 를 통해 문자 'admin'를 필터링 하고 있다.


-  실행 쿼리 

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

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



-  해결 포인트

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

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


  이전 SQL Injection문제와 동일해 보이지만, ereg을 통해 'admin'을 필터링하고 있다. 'admin'을 가져와야 하는 상황에서

  'admin'을 필터링하고 있다면 말이되지 않는다. 하지만, 중요 포인트는 필터링에서 preg_match가 아닌 ereg를 통해서

  'admin'을 필터링 하고 있다는 점이다.

  왜 굳이 preg_match가 아닌 ereg를 통해서 필터링을 할까? 라는 의문을 품어야 한다.


  - ereg() 함수 정의 

     ㆍint eregi(string pattern, string string, array[regs]); 

        검색 대상 문자열(string)에서 정규 표현식으로 나타낸 패턴(pattern)과 일치하는 문자열이 발견될 경우에 true 를, 

        발견되지 않을 경우에는 false를 반환한다. 이때 대소문자는 구분한다. 


   즉, if(@ereg("admin",$_GET[id])) exit("HeHe");  이는 Admin, aDmin, ADMIN,... ereg가 대소문자를 구분한다는 점을 이용해서

   우회 할 수 있다.


 ↑ egre의 취약점을 이용해 우회 할 수 있다.






  troll 중요 포인트



  ㆍereg 함수의 취약점

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

 


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

los : skeleton  (0) 2017.06.23
los : vampire  (0) 2017.06.23
los : orge  (0) 2017.06.22
los : darkelf  (0) 2017.06.22
los : wolfman  (0) 2017.06.22