只需要一个选项:从OWASP测试指南上翻译了NoSQL注入的章节

检测NoSQL注入
https://www.owasp.org/index.php/Testing_for_NoSQL_injection

以下是中文的譯文。

对NoSQL注入进行验证

总结

NoSQL数据库具有比传统的SQL数据库更松散的一致性约束。通过减少关系约束和一致性检查,NoSQL数据库在性能和扩展性方面有许多优势。即使不使用传统的SQL语法,这些数据库仍然潜在地容易受到注入攻击的影响。这些NoSQL注入攻击可以在过程式语言[1]中执行,而不是声明性[2] SQL语言,因此其潜在影响比传统的SQL注入更大。

NoSQL 数据库调用可以根据应用程序的编程语言、自定义 API 调用或常见协议(如 XML、JSON、LINQ 等)来编写。对于针对这些规范进行的恶意输入,可能会绕过主要应用程序的净化检查。例如,对于包含特殊字符 / { } : 的 JSON API 的攻击,仅通过常见的 HTML 特殊字符过滤(如 < > & ;)无法防止攻击。

目前在应用程序中使用的NoSQL数据库已经有150多个[3],提供了各种不同的语言和关系模型的API。它们的功能和限制各不相同。由于它们之间没有共同的语言,因此样本注入代码无法横跨应用于NoSQL数据库。因此,进行NoSQL注入攻击测试的人需要熟悉语法、数据模型和基础编程语言,以创建特定的测试。

NoSQL注入攻击可能在与传统的SQL注入不同的应用程序领域中执行。如果SQL注入在数据库引擎内执行,则根据使用的NoSQL API和数据模型,在应用程序层或数据库层内可能会执行NoSQL变体。通常,NoSQL注入攻击发生的地方是攻击字符串被解析、评估和连接到NoSQL API调用的位置。

此外,定时攻击与NoSQL数据库中的并发性检查缺失有关。这些攻击不被视为注入测试的对象。由于MongoDB是目前最广泛使用的NoSQL数据库,因此我们将在所有示例中使用MongoDB API。

考试方式

MongoDB的NoSQL注入漏洞测试:
MongoDB API要求BSON(二进制JSON)调用,并提供了安全的BSON查询组装工具。然而,根据MongoDB的文档,未序列化的JSON和JavaScript表达式在一些替代查询参数中是允许的。最常用的允许任意JavaScript输入的API调用是$ where运算符。

MongoDB的$where操作符通常用于执行与SQL内的简单过滤和检查类似的操作。

在中文中原生地解释以下代码,只需要一种选项:
db.myCollection.find( { $where: “this.credits==this.debits” } );

db.myCollection.find({$where: “this.credits==this.debits”}); 可以翻译为:在我的集合中查找满足“this.credits==this.debits”条件的记录。

根据需要可以执行JavaScript,进一步实现更高级的条件。

在中文中的本地化解释: db.myCollection.find( { $where: function() { return obj.credits – obj.debits < 0;} } );

db.myCollection.find( { $where: function() { return obj.credits – obj.debits < 0; } } ); 可以被改写为:
db.myCollection.find( { $where: function() { return obj.credits – obj.debits < 0;} } );

例1
$ where演算子に渡されるデータを攻撃者が操作できる場合、攻撃者は任意のJavaScriptを含めることでMongoDBクエリの一部として評価させることができます。ユーザー入力がサニタイズされずに直接MongoDBクエリに渡された場合に、脆弱性にさらけ出されてしまう例が次に示すコードです。

db.myCollection.find( { active: true, $where: function() { return obj.credits – obj.debits < $userInput; } } );;

在中国, NATIVE 会有多种变体,我给出其中一种:

db.myCollection.find( { 激活: true, $where: function() { return obj.信用 – obj.账单 < $用户输入; } } );;

他の種類のインジェクションをテストする場合と同様に、問題を実証するだけならこの脆弱性を完全にエクスプロイトする必要はありません。標的のAPI言語に関連する特殊文字を注入し、結果を観察することによって、テスターは、アプリケーションが入力を正しくサニタイズしているかどうかを判断できます。たとえばMongoDB内で、次のいずれかの特殊文字を含む文字列がサニタイズなしで渡された場合、データベースエラーが発生します。

‘ ” \ ; { }

通常のSQLインジェクションでは、同様の脆弱性により、攻撃者は任意のSQLコマンドを実行し、意のままにデータを露出させたり操作したりできてしまいます。ただし、JavaScriptは完全な機能を備えた言語であるため、攻撃者はデータを操作できるだけでなく、任意のコードを実行することも可能です。たとえば、テスト時ならただエラーが発生だけですが、完全なエクスプロイトでは特殊な文字を使用して有効なJavaScriptを作成します。

この入力 “(function(){var date = new Date(); do{curDate = new Date();}while(curDate-date<10000); return Math.max();})()” を $userInput にインサートする上記の例では、このインジェクションは最初にサービスの拒否を引き起こすインライン関数を呼び出し、最終的に数値を返します。この特殊な攻撃文字列は、MongoDBインスタンス全体が100%CPU使用率で10秒間実行される事例です。

即使查询中使用的输入完全经过消毒或参数化处理,仍然存在可以触发NoSQL注入的替代路径。许多NoSQL实例都具有与应用程序编程语言无关的独特保留变量名。

例如,在MongoDB中,$where语法本身就是一个保留的查询运算符。您需要准确地传递查询,就像它的书写方式一样。如果进行任何更改,将会导致数据库错误。然而,$where也是一个有效的PHP变量名,因此创建名为$where的PHP变量可能会使攻击者有可能将代码插入到查询中。PHP MongoDB文档明确警告开发者:

すべての特別なクエリ演算子($で始まる)に対してシングルクオートを使用していることを確認し、PHPが "$ exists"を$exists変数で置き換えようとしないようにしてください。

即使查询不依赖用户输入,但如下示例所示,攻击者通过用恶意数据替换运算符,仍有可能利用MongoDB进行攻击。

db.myCollection.find({ $where: function() { return obj.credits – obj.debits < 0; } });
在中文中,只需一种方式来改写这个语句:
db.myCollection.find({$where: function() { return obj.credits – obj.debits < 0;}});

PHP変数にデータを割り当てる方法の1つは、HTTPパラメータ汚染です( Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004))参照。パラメータ汚染を使って$whereという名前の変数を作成すると、クエリの有効期限切れを示すMongoDBエラーが発生する可能性があります。文字列 “$ where”自身でない$whereのいかなる値でも、脆弱性を証明するのに十分なはずです。攻撃者は、以下を挿入することで完全なエクスプロイトを開発します: “$where: function() { //arbitrary JavaScript here }”

引用资料

具有NoSQL注入示例的MongoDB注入负载词汇表-https://github.com/cr0hn/nosqlinjection_wordlists

Adobe的Bryan Sullivan:《服务器端JavaScript注入》- https://media.blackhat.com/bh-us-11/Sullivan/BH_US_11_Sullivan_Server_Side_WP.pdf

来自Adobe的Bryan Sullivan表示:“NoSQL,安全性更低”- http://blogs.adobe.com/asset/files/2011/04/NoSQL-But-Even-Less-Security.pdf

贝克咨询的Erlend说:“【安全】NOSQL注入” – http://erlend.oftedal.no/blog/?blogid=110

Syhunt的Felipe Aragon表示:“NoSQL/SSJS注入”- http://www.syhunt.com/?n=Articles.NoSQLInjection

MongoDB文档:「MongoDB如何解决SQL或查询注入问题?」- http://docs.mongodb.org/manual/faq/developers/#how-does-mongodb-address-sql-or-query-injection

PHP文档:“MongoCollection::find”-http://php.net/manual/en/mongocollection.find.php

“破解NodeJS和MongoDB” – http://blog.websecurify.com/2014/08/hacking-nodejs-and-mongodb.html

攻击NodeJS和MongoDB – http://blog.websecurify.com/2014/08/attacks-nodejs-and-mongodb-part-to.html

クリエイティブ・コモンズ・ライセンス
广告
将在 10 秒后关闭
bannerAds