freeBuf
主站

分类

云安全 AI安全 开发安全 终端安全 数据安全 Web安全 基础安全 企业安全 关基安全 移动安全 系统安全 其他安全

特色

热点 工具 漏洞 人物志 活动 安全招聘 攻防演练 政策法规

点我创作

试试在FreeBuf发布您的第一篇文章 让安全圈留下您的足迹
我知道了

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

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

FreeBuf+小程序

FreeBuf+小程序

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

0

1

2

3

4

5

6

7

8

9

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

漏洞信息

漏洞来源: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安全
本文为 启御Sec 独立观点,未经授权禁止转载。
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
启御Sec LV.3
专注于安全领域,覆盖web安全、二进制安全、云安全、逆向、app安全、工控安全、物联网安全等,创作分享优质安全内容!
  • 2 文章数
  • 3 关注者
安卓APP-HTTPS抓包Frida Hook教程
2024-10-07
文章目录