티스토리 뷰


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

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



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_darkelf 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>"
  if(
$result['id'] == 'admin'solve("darkelf"); 
  
highlight_file(__FILE__); 

  -- 해결 포인트 ↑--


?>


  해결 과정



필터링 

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

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


-  실행 쿼리 

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

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


-  해결 포인트

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

   ㆍ해결 포인트는 wolfman과 유사하다. 현재는 id가 guest로 고정 되어있지만, id값에 admin을 가져오면 해결 된다.


  or과 and 문자를 필터링 하고 있어서 조건 연산을 사용할 수 없다. 하지만 and와 or문자 필터링을 우회할 수 있는

  같은 기능을 하는 대체 문자가 존재한다.


 ↑ 이처럼 조건의 no값을 null값으로 정하면 아무런 결과도 조회 되지 않지만, or 연산자를 이용해 쿼리를 항상 참으로 만든다면

     Hogwarts 테이블의 student컬럼의 모든 값이 조회 된다. 

   # or 연산 → A or B : A와 B 둘 중 하나라도 참이면 결과는 참이다.

   # and 연산 → A and B : A와 B 모두 참이면 결과이다. 


 ↑ and 연산으로 student를 지정해서 원하는 학생을 뽑을 수 있다. 


이렇게 SQL Injection query를 완성할 때 or, and 연산자는 매우 중요한 역활을 한다. 이때 and와 or을 필터링한다면

같은 기능의 다른 문자를 이용해서 필터링을 우회 할 수 있다. 

  - or, and 필터링을 우회 할 수 있는 문자

    ㆍor → || ( 더블 파이프 )

    ㆍand → && ( 엠퍼센트 )  = %26%26 ( URL 표기법 ), &는 URL상에서 변수 구분자로 사용되기 때문

     

 ↑ and연산과, or연산을 | |와 &&로 대체할 수 있다.


 ↑ 같은 방법으로 and문자, or문자 필터링을 우회해서 문제를 해결할 수 있다.





  darkelf 중요 포인트



  ㆍSQL Injection에서 and와 or을 우회 할 수 있는 문자

 


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

los : troll  (0) 2017.06.22
los : orge  (0) 2017.06.22
los : wolfman  (0) 2017.06.22
los : orc  (0) 2017.06.21
los : goblin  (1) 2017.06.19