S2-067与S2-066
S2-067(CVE-2024-53677)
影响版本:
Struts 2.5.0 - Struts 2.5.33
Struts 2.5.0 - Struts 2.5.33
Struts 6.0.0 - Struts 6.3.0.2
原理简述:
这是一个存在于apache struts框架的漏洞,其关键点在于远程服务器存在上传点,且运用FileUploadInterceptor作为上传函数。
旧的 FileUploadInterceptor 是基于 MultiPartRequestWrapper 的。它在处理上传请求时,会把上传内容拆成三类可注入到 Action 的参数:
<file>:实际上传文件<file>ContentType:内容类型<file>FileName:上传文件的原始文件名
原始文件名被当成普通参数一路带进了业务层。 一旦这个值里包含路径成分,而后续保存逻辑又直接或间接信任了它,文件最终写入的位置就可能被攻击者影响。
一句话:
旧上传机制把用户可控的文件名/上传参数送进了文件落地流程,但对路径边界控制不严,导致文件可以被写到预期目录之外。
这个漏洞是我在 SHCTF-Challenge Info - [阶段3] BabyJavaUpload 遇到的。
题目就给了一个upload.php的接口用来接受我们上传的数据,通过java的名字和上传页面,可以猜测到一些框架,比如说struts 2。
通过构造一个恶意的jspx执行cat flag的操作。
在利用这个漏洞,可以将我们的文件进行目录穿越,最终成功读取到了flag。
路径穿越的关键点就在于 Struts 的参数绑定机制会读取我们构造的路径然后绑定。
S2-066(CVE-2023-50164)
其实,这两个漏洞产生的原理很像,或者说,S2-067是S2-066的补充。
正常情况下,你上传的文件字段名是 upload,Struts 会自动生成 uploadFileName。如果你手动在请求里塞一个 UploadFileName(注意首字母 U 大小写),框架在合并参数时,可能会因为优先级问题,把你控制的恶意字符串覆盖掉系统生成的合法文件名。
导致我们可以让我们的恶意文件写在哪些本来写不到的地方。
S2-066的攻击点在于大小写字母的不同。
而S2-067即使没有大小写覆盖,由于旧的拦截器(MultiPartRequestWrapper)在处理文件名时,压根就没考虑过文件名里带 ../ 的情况。攻击者可以直接在标准的上传参数里注入路径就完成路径穿越写文件的操作。
- 版权声明:本文由 余林阳 创作,转载请注明出处。
喜欢这篇文章吗?
点击右侧按钮为文章点赞,让更多人看到!
在下余林阳