CodeQL 文档

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

点击查看 CodeQL 代码库中的查询

将用户控制的来源传递到 NoSQL 查询中会导致 NoSQL 注入漏洞。包含用户控制来源的此受污染的 NoSQL 查询然后可以在 MongoDB 等 NoSQL 数据库中执行恶意查询。为了让用户控制的来源污染 NoSQL 查询,必须使用类似 json.loadsxmltodict.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})

参考文献

  • ©GitHub, Inc.
  • 条款
  • 隐私