Django SQL注入漏洞复现 (CVE-2022-28347)

💡 原文中文,约3200字,阅读约需8分钟。
📝

内容提要

在Django 2.2的2.2.28之前版本、3.2的3.2.13之前版本和4.0的4.0.4之前版本中的QuerySet.deexplain()存在SQL注入问题。攻击者可以通过传递精心编制的字典作为options参数来实现注入负载。漏洞影响的Django版本有2.2 <= Django < 2.2.28、3.2 <= Django < 3.2.13和4.0 <= Django < 4.0.4。修复方法是在执行语句之前对危险字符进行过滤,只有白名单内的字符串才会被拼接到语句中。

🎯

关键要点

  • 在Django 2.2的2.2.28之前版本、3.2的3.2.13之前版本和4.0的4.0.4之前版本中的QuerySet.deexplain()存在SQL注入问题。
  • 攻击者可以通过传递精心编制的字典作为options参数来实现注入负载。
  • 漏洞影响的Django版本有2.2 <= Django < 2.2.28、3.2 <= Django < 3.2.13和4.0 <= Django < 4.0.4。
  • 修复方法是在执行语句之前对危险字符进行过滤,只有白名单内的字符串才会被拼接到语句中。
  • 创建存在漏洞的Django版本3.2.12项目,并设置PostgreSQL数据库连接。
  • 通过构造特定的请求,可以成功触发SQL注入,使服务器延迟响应。
  • EXPLAIN命令用于显示SQL语句的执行计划,EXPLAIN ANALYZE会实际运行语句并显示运行时间。
  • Django的QuerySet.explain方法在执行时会调用数据库的explain_query_prefix方法,导致SQL注入风险。
  • 漏洞修复通过过滤危险字符来防止注入,确保只有白名单内的字符串被使用。
➡️

继续阅读