티스토리 뷰


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

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



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




  분석 




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


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


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


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


  $query "select id from prob_cobolt where id='{$_GET[id]}' and pw=md5('{$_GET[pw]}')"
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>"


  -- 실행 쿼리 ↑ --


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

  elseif($result['id']) echo "<h2>Hello {$result['id']}<br>You are not admin :(</h2>"


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



  해결 과정



  해결 포인트를 보면 쿼리를통한 결과값이 'admin'이어야 한다.  gremlin과 마찬가지로 입력가능한 파라미터는 id 와 pw이다.

  md5는 암호화 해시함수로 사실상 게싱방법으로 추측해서 맞추기는 불가능하다.


  point! 싱글 쿼터를 이용해 id에 admin값을 넘겨 주고, 항상 참이게 만듦과 동시에 주석처리를 통해 변수 파라미터 pw의

            md5는 무시할 수 있다.


 ↑ 싱글쿼터( ' )의 위치를 조정해서 admin 값을 id파라미터에 넣어줄 수 있다.

   # here이 위치한곳의 조작해 pw파라미터를 무시한채 쿼리가 항상 참일 수 있게 만들어주자


 ↑ 간단하게 풀릴 줄 알았는데 함정이 있었다.



  이러한 결과가 나오는 이유는 where id='admin' 조건문이 존재하지만, or 1=1 # 때문에 그냥 참인 값만 반환

  하게 된다. 이는 id가 admin인 값을 반환하는것이 아니라 테이블에 들어간 순서대로 뽑아냈기 때문이다.

  아마도 rubiya가 테이블 맨 위에 있지 않을까 싶다.


 ↑ mysql에 직접 쿼리를 작성하면서 문제를 해결하면 이해하기 쉽다.

   # magic_student = woo를 뽑아내는게 아니라 no컬럼의 모든 값을 뽑아냈다.



  이때 and를 이용해 뽑고자하는 id를 확실히 해준다면 정확하게 admin을 뽑아올 수 있다.



 ↑ and를 이용해 magic_student='woo'를 정확히 지정해줬다.


 ↑cobolt 퇴치










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

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