티스토리 뷰



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

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



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






  문제 분석




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

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


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

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


  $query "select id from prob_goblin where id='guest' and no={$_GET[no]}"
  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("goblin");

  -- 해결 포인트↑ --
  
highlight_file(__FILE__); 
?>



  해결 과정



  필터링 : 현재 preg_match를통해 ( ' )쿼터,( " ) 더블 쿼터, ( ` ) 백 쿼터를 필터링 하고 있다. 

  ( 테이블 접근 방지를 위한 prob_, . , ( , ) 는 기본적으로 필터링하고 있다. )

  해결 포인트 : 쿼리를통해 id에 admin을 불러오면 된다. 


  goblin을 해결하기 위한 방법으로 2가지 방법으로 생각해 볼 수 있다. 쿼리가 항상 참일 때 limit를 통한 접근과 

  쿼터나 더블쿼터를 사용하지 않고 id값에 admin을 넣어주는 것이다.


   【 limit를 통한 접근 】


  limit를 이용한 문제해결은 어디까지나 prob_goblin테이블- id컬럼에 guest와 admin이 존재한다는 guessing 기법을 이용

  하기 때문에 해결 방법으로 확신할 수 는 없지만 충분히 시도해볼 가치가 있다.


 ↑ limit를 이용해 Hogwart테이블에 모든 컬럼의 첫번째 데이터를 가져왔다.

  # limit 0,1 → 첫번째 값( 0 ) , 한 개만( 1 ) 가져온다는 의미 

  # limit를 이용할때 인덱스의 시작은 0번이다.


 ↑ 특정 컬럼의 값을 하나씩 불러올 수 있다.


  이같은 방법을 통해 prob_goblin테이블-id컬럼을 추측해본다.( guessing ) 테이블을 구성 id나 패스워드는 각각 분리해 

  놓기 힘들다. 즉, 프로그래머가 데이터베이스를 구성할 때 연관된 데이터들은 같은 테이에 구성해놓기 십상이다. 

  이러한 점을 이용해 guest와 admin이 같은 컬럼에 존재한다고 가정하고 limit를 시도하는 것이다.

  쿼리 문법상 쿼리가 항상 참 일때 컬럼의 모든 값을 가져온다는 점을 명심해야한다.


 ↑ limit를 이용해 id컬럼의 첫번째 값이 guest임을 알았다.

   # 현재 쿼리가 항상 참이기 때문에 id테이블 내부에 모든 결과를 가져온다. 

   # 2번째, 3번째, 4번째, 값도 추측해보자

   # 이러한 시도는 데이터베이스의 구성을 이해하고 시도하는게 좋다.


 ↑ 이렇게 limit를 이용해 손쉽게 정답에 접근할 수 있다.



   【 쿼터를 이용하지 않고 id값 입력하기 】


 ↑ 쿼리가 항상 참일 때 id에 admin 입력을 시도했지만, 쿼터가 필터링 되고 있기때문에 사용할 수 없다.

  # 더블쿼터( " )와 백쿼터( ` )도 현재 필터링하고 있다.

  # 이때 헥스코드를 입력해서 쿼터를 사용하지 않고 값을 입력할 수 있다. ex) 0x61646d696e


 ↑ no값은 1이 아닌 임의 숫자를 넣어주면된다.

   # id='guest' and no=1 이 참이되버려서, Hello guest가 출력된다.





  los -goblin 중점



  ㆍmysql에서 limit의 사용법 및 활용

  ㆍ헥스코드










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

los : wolfman  (0) 2017.06.22
los : orc  (0) 2017.06.21
los : cobolt  (1) 2017.06.12
los : gremlin  (0) 2017.06.12
los : Start  (0) 2017.06.12