wargame/Lord Of SQL Injection

[LOS] siren

LimeLee 2019. 7. 26. 11:05

소스코드 분석

<?php  
  include "./config.php";  
  login_chk();  
  $db = mongodb_connect();  
  $query = array(  
    "id" => $_GET['id'],  
    "pw" => $_GET['pw']  
  );  
  echo "<hr>query : <strong>".json_encode($query)."</strong><hr><br>";  
  $result = mongodb_fetch_array($db->prob_siren->find($query));  
  if($result['id']) echo "<h2>Hello User</h2>";  

  $query = array("id" => "admin");  
  $result = mongodb_fetch_array($db->prob_siren->find($query));  
  if($result['pw'] === $_GET['pw']) solve("siren");  
  highlight_file(__FILE__);  

?>

1. $db = mongodb_connect(); > DB 환경 MongoDB

2. if($result['pw'] === $_GET['pw']) solve("siren"); > 요청값과 반환 값을 엄격한 비교. pw를 알 필요가 있으므로 Blind SQL Injection 시도

 

문제 풀이

pw 값을 알아야 하므로 $ne를 사용하여 인증우회 할 수 없다.

이번엔 부등호인 $gt를 이용하여 pw 값을 한자리 씩 알아낸다.

다음과 같이 요청한다.

 

?id=admin&pw[$gt]=3

 

 

 

?id=admin&pw[$gt]=1

 

 

두 번의 요청으로 pw가 1보다는 크지만 3보다는 작다는 것을 알 수 있다.

pw의 첫 글자는 1이거나 2일 것이다.

이런 식으로 참과 거짓으로 패스워드 값을 유추해 나간다.

 

저렴한 파이썬 코드

 

부등호 $gt로 비교하면 같은 글자를 비교할 때에는 거짓이 되어버리므로 마지막 글자는 바로 다음 글자라고 유추 가능하다. (크거나 같다의 의미인 $gte를 사용하면 패스워드 값을 비교할 때도 참이 나옴)

 

?id=admin&pw=1588f5a3

 

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

[LOS] incubus  (0) 2019.07.26
[LOS] cerberus  (0) 2019.07.26
[LOS] kraken  (0) 2019.07.26
[LOS] mummy  (0) 2019.07.26
[LOS] yeti  (0) 2019.07.26