소스코드 분석
<?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 |