python编写sql注入脚本

Python Web 框架 Django 修复SQL注入漏洞(附详细分析)

OSCS(开源软件供应链安全社区)推出免费的漏洞、投毒情报订阅服务,社区用户可通过机器人订阅情报信息:https://www.oscs1024.com/?src=wx

漏洞概述

Django 是一个由 Python 语言编写的开源 Web 应用框架,Github 上 star 为 .9K。

Python 开发者使用 Django 可以快速开发、设计和部署网站。

7月4日,OSCS 监测到 Django 官方修复了一个 SQL 注入漏洞。如果 Trunc() 方法的 kind 参数和 Extract() 方法的 lookup_name 参数没有进行安全过滤,可能会造成 SQL 注入的风险,建议各位开发者关注。

  • 漏洞影响等级:高危
  • 利用条件:
  • 代码中使用了 Trunc() 和 Extract() 方法
  • 其中 kind 参数和 lookup_name 参数可控
  • 利用成本:低
  • 影响版本:(∞, ),[, ),官方已经在 、 版本修复此问题
  • CVE编号:CVE-

更多漏洞详细信息可进入 OSCS 社区查看:
https://www.oscs1024.com/hd/MPS-

漏洞分析

以 Django 版本为例,可以通过官方提供的测试用例进行验证。

Extract() 方法将数据处理后返回一个 Extract 类型的对象,lookup_name 参数是传入的恶意数据。

DTModel.objects.filter 方法通过下图链路拼接出有恶意数据的 SQL 语句

add_q 方法中 self.where.add() 则会将 lookup_name 拼接到 SQL 语句的 WHERE 部分

官方通告中数据库函数 Trunc,利用条件与 Extract 相同,测试用例如下:

风险场景

Extract() 方法的作用是提取日期的某部分为一个数字,内置的 lookup_name 参数指定返回数字是指定时间的对应部分,如当 lookup_name = 'year',返回年份。

Trunc() 方法也是将一个日期截断为一个部分,其中的 kind 参数与 lookup_name 参数功能类似。

因此,如果业务逻辑中有类似时间截取的逻辑,对应的 year、day 等参数由前端传入(用户可控,如选择时间等逻辑)的话,攻击者可以加入 payload,从而对数据库进行操作。

修复方案

将组件 Django 升级至 及以上版本

将组件 Django 升级至 及以上版本

参考链接

https://www.openwall.com/lists/oss-security////2

https://nvd.nist.gov/vuln/detail/CVE-

https://www.djangoproject.com/weblog//jul//security-releases/

原文链接:,转发请注明来源!