NoSQL 注入¶
ID: py/nosql-injection
Kind: path-problem
Security severity: 8.8
Severity: error
Precision: high
Tags:
- security
- external/cwe/cwe-943
Query suites:
- python-code-scanning.qls
- python-security-extended.qls
- python-security-and-quality.qls
将用户控制的来源传递到 NoSQL 查询中会导致 NoSQL 注入漏洞。包含用户控制来源的此受污染的 NoSQL 查询然后可以在 MongoDB 等 NoSQL 数据库中执行恶意查询。为了让用户控制的来源污染 NoSQL 查询,必须使用类似 json.loads
或 xmltodict.parse
的方法将用户控制的来源转换为 Python 对象。
由于用户控制的来源被传递到查询中,因此恶意用户可以完全控制查询本身。当受污染的查询被执行时,恶意用户可以执行恶意操作,例如绕过角色限制或访问和修改 NoSQL 数据库中的受限数据。
建议¶
可以通过对从用户提供的来源传递到 NoSQL 查询的用户输入的特殊字符进行转义来防止 NoSQL 注入。或者,使用 MongoSanitizer 等清理库将确保用户提供的来源不能充当恶意查询。
示例¶
在下面的示例中,用户提供的来源被传递到一个查询 MongoDB 数据库的 MongoDB 函数。
from flask import Flask, request
from flask_pymongo import PyMongo
import json
mongo = PyMongo(app)
@app.route("/")
def home_page():
unsanitized_search = request.args['search']
json_search = json.loads(unsanitized_search)
result = mongo.db.user.find({'name': json_search})
这可以通过使用像 MongoSanitizer 这样的清理库来修复,如下面的带注释的代码版本所示。
from flask import Flask, request
from flask_pymongo import PyMongo
from mongosanitizer.sanitizer import sanitize
import json
mongo = PyMongo(app)
@app.route("/")
def home_page():
unsafe_search = request.args['search']
json_search = json.loads(unsafe_search)
safe_search = sanitize(unsanitized_search)
result = client.db.collection.find_one({'data': safe_search})
参考文献¶
Mongoengine: Documentation.
Flask-Mongoengine: Documentation.
PyMongo: Documentation.
Flask-PyMongo: Documentation.
OWASP: NoSQL Injection.
Security Stack Exchange 讨论: Question 83231.
常见弱点枚举: CWE-943.