wargame/Lord Of SQL Injection

[LOS] blue_dragon

LimeLee 2018. 7. 24. 18:54

$password = md5('blue_drag0n_limelee');공개



소스코드 분석



<?php
  include "./config.php";
  
login_chk();
  
dbconnect();
  if(
preg_match('/prob|_|\./i'$_GET[id])) exit("No Hack ~_~");
  if(
preg_match('/prob|_|\./i'$_GET[pw])) exit("No Hack ~_~");
  
$query "select id from prob_blue_dragon where id='{$_GET[id]}' and pw='{$_GET[pw]}'";
  echo 
"<hr>query : <strong>{$query}</strong><hr><br>";
  
$result = @mysql_fetch_array(mysql_query($query));
  if(
preg_match('/\'|\\\/i'$_GET[id])) exit("No Hack ~_~");
  if(
preg_match('/\'|\\\/i'$_GET[pw])) exit("No Hack ~_~");
  if(
$result['id']) echo "<h2>Hello {$result[id]}</h2>";

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

?> 

query를 요청하고 반환하는 데까지는 서버 공격을 위한 필터링 외에는 별 다른 필터링이 안되어 있다.

문제는 쿼리 반환값을 출력시켜주기 전에 싱글쿼터를 필터링하고 심지어 싱글쿼터 우회를 위한 \마저도 필터링한다.

아이디, 패스워드를 알고있지 않는 한은 사실상 결과 반환값을 보여주지 않는다는 것과 같다.

결과 리턴값 대한 구분도 불가능하고, 에러도 출력해주지 않는다. 결과 페이지가 구분할수 없을 경우 사용하는 공격 기법이 있다. 

이 기법에서 대체적으로 사용하는 기본적인 함수를 필터링하거나 하는 것도 없어 기법의 기본 개념만 숙지하고 있다면 오히려 전 문제들보다 쉽게 풀수 있다.


문제 풀이



싱글쿼터를 쓰면 no hack이 출력되면서 쿼리에 대한 리턴값을 보여주지 않는다. 

쿼리에 대한 리턴값을 보지 않고 같은 리턴페이지를 보여주어도 값을 탈취하는 방법이 있다. 문제에서 사용될 기법은 Time based SQL Injection이다.

Time based SQL에서는 sleep 함수나 benchmark 함수를 사용하면 된다. 어느 것도 필터링 하지 않으므로 ?id='admin' and if(length(pw)>0,sleep(5),0)-- - 를 요청한다. 그렇게 되면 아래와 같은 쿼리를 요청한다.


query : select id from prob_blue_dragon where id='admin' and if(length(pw)>0,sleep(5),0)-- -' and pw=''

싱글 쿼터를 사용해서 No Hack ~_~ 과 함께 페이지는 종료하지만 pw의 길이가 0보다 크다면 sleep(5)이 실행되어 약 5초 뒤에 No Hack ~_~을 출력하고, 아니라면 즉각적으로 No Hack ~_~을 출력할 것이다.


소스코드를 이해하고 어떻게 접근하는가에 대한 의도가 큰건지  관련 기법에 사용되는 함수 어느것도 필터링 하고 있지 않기 때문에, Time based SQLI라는 것만 알면 별 다른 풀이도 없다. 



'wargame > Lord Of SQL Injection' 카테고리의 다른 글

[LOS] ouroboros  (0) 2018.08.09
[LOS] phantom  (0) 2018.08.09
[LOS] frankenstein  (0) 2018.08.09
[LOS] red_dragon  (0) 2018.07.22
[LOS] green_dragon  (2) 2018.07.22