背景
公司内部SDL安全审计阶段,大致浏览系统迭代系统的功能点。发现迭代版本新增文件管理功能,包括文件获取、复制、下载、上传,脑海飘过五个大字: TND有漏洞啊 !
渗透流程
1. 文件下载处抓包
从该包可以看出,该服务使用 hdfs分布式文件系统,默认包含三个参数(path、fileName、workspaceUuid)。前端提供文件下载功能,尝试修改path、fileName参数,报错文件不存在。
思考:既然能报文件不存在,大概率存在任意文件下载漏洞?
hdfs分布式文件系统介绍:https://baike.baidu.com/item/hdfs/4836121?fr=aladdin
2. 漏洞挖掘思路
考虑使用回溯符…/…/ 是否可以读取/etc/passwd
未成功,响应包报错!!!
如果想验证漏洞存在,就要知道hdfs服务器上有什么文件或者配置文件…
抓包测试后,发现开发把path路径写死:hdfs://ns1
3. 获取hdfs服务器目录
天无绝人之路:http history中发现另一个功能——数据获取(list)。
经测试,后端代码仍未对path做校验,使用回溯符(…/…/)成功遍历根目录所有文件、获取所有文件名。
4. 漏洞利用
使用获取的文件名,利用download功能,实现任意文件下载
代码审计
确定漏洞存在,找开发同学要源代码,定位后端代码问题。
文件获取代码:
文件下载代码:
下一步传到 getNewPath,转到定义,仍未做任何校验。
总结&漏洞整改
公司落地执行SDL安全开发生命周期,在应用需求、设计、开发、测试以及上线等阶段提前发现安全问题,目的是为了规避应用上线后再发现安全问题,此时漏洞整改成本较大。
整改建议:
1. 后端对path、filename等参数做限制,指定白名单路径
2. 对传入的文件名参数进行过滤,并且判断是否是允许获取的文件类型,过滤回溯符 ../../
3. 做好文件权限访问控制