Skip to content
KitploitKITPLOIT
工具博客
提交
工具博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

··订阅源·联系·隐私·© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
Django-faille-CVE-2025-57833_test — 教育性概念验证,演示通过Django的annotate()和alias()方法中的动态别名进行SQL注入(CVE-2025-57833)。包含漏洞代码、利用示例和修复分析。 | Kitploit
工具/GitHubGitHub/loic-houchi/django-faille-cve-2025-57833_test
静态分析漏洞分析代码分析Web应用程序漏洞利用学习与教育数据库安全
GitHubloic-houchi/django-faille-cve-2025-57833_test

Django-faille-CVE-2025-57833_test

教育性概念验证,演示通过Django的annotate()和alias()方法中的动态别名进行SQL注入(CVE-2025-57833)。包含漏洞代码、利用示例和修复分析。

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享
查看仓库
211个月前尚未审核

通过 Django 中的别名进行 SQL 注入漏洞测试

定义:什么是别名?

别名 是 SQL 查询中给列或聚合结果起的名称。
在 Django 中,别名通过 annotate() 或 alias() 方法用于命名计算字段。

示例:

root@kitploit:~
from django.db.models import Count
books = Book.objects.annotate(book_count=Count('id'))

这里,book_count 是 Count('id') 结果的别名。
这允许为计算列获取一个可读的名称。


通过 shell 插入数据

为快速操作,可以通过 shell 插入数据:

root@kitploit:~
python manage.py shell

执行的命令:

root@kitploit:~
from myapp.models import Author, Book

a = Author.objects.create(name=" houchi pierre")
Book.objects.create(title="Les belles filles", author=a)
Book.objects.create(title="Les baux arcons", author=a)

exit()

漏洞背景

在 Django 4.2.23 之前,可以通过用户提供的动态别名注入 SQL。
该漏洞编号为 CVE-2025-57833。

当使用带有未过滤用户提供的键的字典扩展 (**kwargs) 时,该漏洞会影响 annotate() 和 alias() 函数。


漏洞代码示例 (myapp/views.py)

root@kitploit:~
import json
from django.db.models import Count
from django.http import JsonResponse
from .models import Author

def vulnerable_view(request):
    # 从 URL 获取别名
    alias_param = request.GET.get("alias", "{}")
    try:
        # ⚠️ 有漏洞:直接评估用户数据
        alias_dict = json.loads(alias_param)
        for key, value in alias_dict.items():
            alias_dict[key] = eval(value)  # 危险!允许执行任意代码

        # 使用动态注解创建 queryset
        qs = Author.objects.annotate(**alias_dict).values("name", *alias_dict.keys())

        # 返回结果
        return JsonResponse(list(qs), safe=False)

    except Exception as e:
        return JsonResponse({"error": str(e)})

解释:

  1. alias_param = request.GET.get("alias", "{}")
    获取用户传递的 alias 参数的值。

  2. alias_dict = json.loads(alias_param)
    将 JSON 字符串转换为 Python 字典。

  3. alias_dict[key] = eval(value)
    ⚠️ 非常危险:eval() 将字符串作为 Python 代码执行。
    用户可以注入破坏性的 SQL。

  4. Author.objects.annotate(**alias_dict)
    使用提供的别名动态应用注解。


模型 (myapp/models.py)

root@kitploit:~
from django.db import models

class Author(models.Model):
    name = models.CharField(max_length=100)
    def __str__(self):
        return self.name

class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.ForeignKey(Author, on_delete=models.CASCADE)
    def __str__(self):
        return self.title

解释:

  • Author 和 Book 通过 ForeignKey 关系关联。
  • 在 Author 上使用动态注解来计算其书籍的相关信息。

修复前的利用示例

  • 恶意 URL:
root@kitploit:~
http://127.0.0.1:8000/vuln/?alias={"evil); DROP TABLE myapp_book;--":"Count('id')"}
  • 风险:
    • 执行任意 SQL 命令,删除表或修改数据。
    • 这通过注入的别名直接利用了漏洞。

Django 4.2.23 中的修复

  • Django 现在禁止在别名中使用某些字符:

    • 空格
    • 引号
    • 分号
    • SQL 注释(--)
  • 如果 URL 包含这些字符,Django 会抛出错误:

root@kitploit:~
Column aliases cannot contain whitespace characters, quotation marks, semicolons, or SQL comments.
  • 结果:无法进行破坏性 SQL 注入。

安全示例

root@kitploit:~
http://127.0.0.1:8000/vuln/?alias={"books_count":"Count('book')"}
  • 这并不构成漏洞。
  • 在易受攻击版本(CVE-2025-57833)中,只有恶意用户可以通过以下方式注入 SQL 时才会出现漏洞:
    • 别名中包含禁止字符(空格、分号、引号、SQL 注释)
    • 或对来自用户的值使用 eval()。

避免此漏洞的最佳实践

  1. 切勿对用户数据使用 eval()。
  2. 验证别名名称,只接受安全字符。
  3. 将注解值限制为允许的函数或表达式。
  4. 保持 Django 更新,以便获得修复。

结论

  • 漏洞 CVE-2025-57833 允许通过动态别名注入 SQL。
  • Django 4.2.23 及更高版本修复了此漏洞。
  • 严格验证用户数据仍然至关重要。

作者: Loïc
日期: 2025年6月9日

下载工具