티스토리 뷰


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

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



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






  문제 분석





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

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


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

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


  $query "select id from prob_orc where id='admin' 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 admin</h2>"

  -- 실행 쿼리 ↑--


  $_GET[pw] = addslashes($_GET[pw]); 

  -- addslashes를 사용중↑--


  $query "select pw from prob_orc where id='admin' and pw='{$_GET[pw]}'"
  
$result = @mysql_fetch_array(mysql_query($query)); 
  if((
$result['pw']) && ($result['pw'] == $_GET['pw'])) solve("orc"); 
  
highlight_file(__FILE__); 

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



  해결 과정


  현재 orc레벨에서는 단순히 if($result['id'] == 'admin'solve("goblin"); 같이 id값에 admin을 넣는것이 아닌, 해결 포인트에

  나와 있듯이 입력한 pw와 데이터 베이스에 저장된 admin의 pw가 같아야 한다. 

  즉, 블라인드 인젝션을 통해서 데이터 베이스에 저장된 admin의 비밀번호를 알아야 한다

  addslashes를 사용 중이기 때문에 pw를 우회할 방법도 없다. 이는 블라인드 인젝션을 이용해서 비밀번호를 알야 내야

  만 한다는 것을 보여준다.

  블라인드 인젝션을 할 때 기본적인 방법으로 ascii와 substr mysql함수를 사용한다.


 ↑ ascii를 이용해 원하는 문자를 10진수로 변환할 수 있다.

  # 아스키 변환에 대한 결과가 같다면 1이 나온다. ( 여기서 1은 참을 의미하고 0은 거짓을 의미한다. )


 ↑ substr 함수를 이용해 원하는 문자열의 원하는위치의 원하는 갯수를 가져올 수 있다.

   # substr ( 문자열, 시작 인덱스, 가져오고싶은 갯수 )

   # select substr( 'abcd', 1, 2 ) → 문자열 'abcd'에서 인덱스 1번( a )부터 2개의 문자열을 가져온다. → ab


 ↑ ascii와 substr을 이용해 다음과같이 참인 결과를 이끌어 낼 수 있다.

   #1. SELECT student FROM Hogwarts WHERE student='hoon' → 결과에서 hoon이 조회된다.

   #2. substr( 'hoon', 1, 1 ) → 결과에서 문자 'h'가 뽑힌다.

   #3. ascii( 'h' ) → 결과에서 104라는 값이 나오므로 전체 쿼리가 참이된다.


  이처럼 MySQL ascii함수와 substr 함수를 이용해 해당 컬럼의 데이터를 뽑아낼 수 있다. 해당 아스키 값을 넣었을 때

  결과가 참이 나온다면 그 값은 해당 컬럼 데이터의 값이된다. 이는 Blind SQL Injetion의 기본방식으로 사용된다.


 ↑ Blind SQL Injection은 이와같은 방법으로 사용될 수 있다.

   #1. student=seung 의 age값을 알고자할 때 SELECT student FROM Hogwarts where student='seung' and age='' or 1 을 통해 쿼리가 항상 

       참일 수 있게 만들어 준다. 다음 결과 같으로 student 컬럼의 모든 값이 나오게 된다. ( or 연산자는 둘중하나만 참이면 참이된다. )

   #2. 이때 and 연산자를 이용하여 조건 age의 인덱스1번이 아스키 50인 값을 조회하게 된다. 

   #3. 결과적으로 seung의 age의 첫번째 글자가 '2'인것을 확인할 수 있다.


 ↑ 부등호를 이용해 데이터에 수월하게 접근할 수 있다





이러한 방식을 이번 orc문제에서 사용할 수 있다.


 ↑ 같은 방식으로 쿼리가 항상 참일 수 있게 만들어준다.


 ↑ blind sql injection을 이용해 admin의 비밀번호 1번째 값이 2라는걸 알 수 있다. * 부등호( >, <, = ) 이용


 ↑ 이와 같은 방식으로 비밀번호를 알아내서 올바른 비밀번호를 입력하면 문제를 해결할 수 있다.






  los-orc의 중점



  ㆍBlind Sql Injection의 기본적인 개념과 활용

  ㆍBlind Sql Injection을 사용하는데 자동화툴을 이용해 직접 코드를 작성

 



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

los : darkelf  (0) 2017.06.22
los : wolfman  (0) 2017.06.22
los : goblin  (1) 2017.06.19
los : cobolt  (1) 2017.06.12
los : gremlin  (0) 2017.06.12