wargame/Lord Of SQL Injection

[LOS] frankenstein

LimeLee 2018. 8. 9. 00:57

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



 

소스코드 분석


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

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



union과 '(', ')' 가 필터링 되어 있다. addslashes($_GET[pw])를 보아 pw에 대한 데이터는 존재한다. union을 통해 값을 우회하는 것은 아니다.

이번 문제는 쿼리를 요청하지만 결과를 페이지에 출력해주지 않는다. 다만 에러가 발생하면 error를 출력하고 종료한다.



문제 풀이


결과 값을 출력하지 않고, 쿼리를 출력하거나 "error"를 출력하거나 두 개의 선택지가 있다. 
쿼리에 대한 참과 거짓의 결과가 구분할 수 있으면 Blind SQLI를 시도할 수 있다. Blind SQLI를 하기 위해 쿼리의 참이나 거짓이나 둘 중 하나를 일부러 에러를 출력하도록 만든다.


에러를 발생시키는 방법은 여러가지가 있겠지만 풀이에선 ~0+1를 이용한다.

  • SELECT ~0 => 18446744073709551615
  • SELECT ~0 + 1 => ERROR
~0는 unsigned의 최댓값이 들어간다. 최댓값에 +1을 하여 에러를 출력하는 방식이다.  '(', ')' 를 필터링하지만 case를 필터링하고 있는 것은 아니기에 case를 통해 참이면 에러를 발생시키지 않는 값, 거짓이면 에러를 발생시키는 ~0+1를 출력하도록 아래의 쿼리로 요청한다.

query : select id,pw from prob_frankenstein where id='frankenstein' and pw='' || id > case when 1=1 then 0x123 else ~0+1 END-- -'

query : select id,pw from prob_frankenstein where id='frankenstein' and pw='' || id > case when 1=2 then 0x123 else ~0+1 END-- -'


참의 경우 다음과 같이 쿼리와 소스코드가 출력되지만 



거짓의 경우 error를 출력한다. 이렇게 error를 통해 강제로 blind SQLI 환경을 만들어준다.



'(', ')'를 사용할 수 없으므로 length, mid, substr, ascii 등 함수를 사용할 수 없다. red_dragon에서 사용했던 방법으로 부등호와 16진수를 통해 쉽게 알아낼수 있다.





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

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