freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

Django-DOS漏洞分析&复现(CVE-2024-41989)
2024-10-04 23:48:06
所属地 海外

漏洞信息

漏洞来源:https://hackerone.com/reports/2644244

官方安全公告:https://www.djangoproject.com/weblog/2024/aug/06/security-releases/

漏洞影响:Django版本小于5.0.8或小于4.2.15

简介:Hackerone上给出的漏洞简介为django.utils.numberformat.floatformat() 中的内存耗尽,当给出具有大指数的科学计数法数字的字符串表示形式时,floatformat 模板过滤器会消耗大量内存。

漏洞复现

一、正常调用,传入正常数字1,查看耗时为:0.0072176456451416016 秒

1728107058_6700d2322ff4dc9d73383.png!small?1728107060073

二、传入大指数9e99999,查看耗时为:0.46574854850769043 秒

1728107064_6700d238aacd9894f6467.png!small?1728107066308

三、增大传入指数9e999999,查看耗时为:45.13413095474243 秒

1728107070_6700d23ef22fae53fd4a8.png!small?1728107072606

四、根据耗时结果来看,确实可以达到DOS效果,升级5.0.10版本后,重试(前面没有输出结果是因为输出的数字过于长,这里看到修复之后是把指数直接原样输出出来了,没有做转换)

1728107078_6700d24654d33e6192ece.png!small?1728107080044

漏洞分析

一、下断点调试,查看是哪里耗时,第一步进入floatformat函数,就找到了耗时的地方(两个断点)

1728107083_6700d24bbb4df487991fe.png!small?1728107085295

二、很明显就是int转换的时候产生了耗时,并且int转换的内容是Decimal转换过的对象,那么先看Decimal是什么类型

1728107089_6700d2517587109774da9.png!small?1728107091045

看上去就是让浮点数更精准,尝试用起来貌似正常使用和普通浮点数也没什么区别

1728107095_6700d25715e1bf0fc4366.png!small?1728107096411

三、再来看int方法是可以处理指数的

1728107102_6700d25e9b8d1b108b1a7.png!small?1728107116334

但是在处理较大指数时就会报错,如下图

1728107106_6700d2620a676843f630b.png!small?1728107116334

如果这个指数先使用Decimal来处理过呢?

1728107109_6700d265c6eb804acbe31.png!small?1728107116334

这个奇怪的现象,问下GPT,如下图ChatGPT4o不太行

1728107116_6700d26c7be362fe3a8ca.png!small?1728107118146

还得是ChatGPT o1-preview

1728107121_6700d271715e8d288a855.png!small?1728107123050

四、总结一下:浮点数超过无穷大是处理不了的,但是可以用Decimal先把大数转换为一个精确的十进制数,就避免了报错,然后把这个大数传给int去处理转换,从而消耗资源。

官方修复方法分析

一、在代码中加入了一个判断逻辑如下

1728107126_6700d276b5f0ab4324879.png!small?1728107128497

二、交给GPT分析

1728107131_6700d27b761138eb5bca1.png!small?1728107133691

简单来说就是计算实际大小,经过一系列测试,包括各种科学技术法的变形,以及使用无穷等,也没找到绕过方法,有绕过思路的大佬可以讨论下。

扩展延伸

搜了一下Django代码中还有哪里符合这种漏洞的,找到了一处比较符合,但是利用不了的,在from django.utils.translation.__init__.py的round_away_from_one方法,方法如下:

1728107137_6700d2810e06070251251.png!small?1728107138541

但经过测试,该方法传入的value是str类型时,由于类型不匹配,在Decimal方法中-1时会报错:1728107140_6700d284c537d220f2e8a.png!small?1728107142156

但Decimal方法处理大数解析为精确浮点型时,只接受字符串类型的大数,而数字类型的大数会解析为正无穷

1728107144_6700d2889c9f5ec01cd94.png!small?1728107146166

1728107148_6700d28cc6143de532ff1.png!small?1728107150112

int处理正无穷会报错

1728107152_6700d29005f4e1292e0ba.png!small?1728107153390

所以这里也没办法传入一个大数给int处理,也就无法造成DOS漏洞了。

# 渗透测试 # 黑客 # web安全 # 代码审计 # python安全
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录