之前挖src,挖到一个网站存在文件下载漏洞,想通过文件下载获取源码,但历史命令一直没有管理员操作源码的命令。功夫不负有心人,经过一年不断得下载历史命令,终于成功下载到源码。
漏洞点:
一、文件下载漏洞
在上传附件处,可将上传的文件进行下载。
下载链接为:
https://xxxx.com/internships/student/task/apply/localDownloadFile?filePath=xxx/xxx/xxx/xxx/xxxx.pdf&fileName=1(1).pdf
构造请求地址,可下载到历史命令:
https://xxxx.com/internships/student/task/apply/localDownloadFile?filePath=../../../../root/.bash_history&fileName=1.txt
查看历史命令,拼接出源码路径为/root/student.war
成功下载到源码
https://xxxx.com/internships/student/task/apply/localDownloadFile?filePath=../../../../root/student.war&fileName=4.war
二、反编译war文件
将war文件改为zip后缀再解压即可
再使用idea打开文件夹
三、代码审计
漏洞1:文件下载
先查看刚才的文件下载漏洞代码,
https://xxxx.com/internships/student/task/apply/localDownloadFile?filePath=xxx/xxx/xxx/xxx/xxxx.pdf&fileName=1(1).pdf
搜索internships/student/task/apply,查看@RequestMapping接口
再在java文件中搜索localDownloadFile,查看该接口。
filePath和fileName参数可控
跟进去downloadFile函数,可知path没有任何的过滤,所以使用../的方式可以实现文件下载漏洞。
该downloadFile函数有大量接口调用,尝试其中一个接口复现一下。
根据代码的接口进行构造,https://xxx.cn/xxxx/societyWorkLog/localDownloadFile?filePath=../../../../../etc/passwd&fileName=1.txt
成功下载passwd文件
漏洞2:sql注入
根据代码中的jar包可知项目中用的是mybatis
搜索在xml文件搜索${},查看是否有拼接sql语句
根据selectid对应的值,查找实现该sql语句的方法
TLogisticsRepairApplyMapper:
找到了实现方法,
再根据TLogisticsRepairApplyMapper跟踪调用了该方法的server层
在RepairService中调用了该方法,再根据该server层找到对应的cotroller层
其中,因为RepairService实现了iRepairService,所以应该查找iRepairService.getApplyByPage
共两处调用了该server层的方法,查看其中一个controller层接口
跟进TLogisticsRepairApply类,查看可造成sql注入的参数怎么构造
creatorId为string类型,可控,满足了sql注入的条件
然后就根据接口进行构造参数
https://xxx.cn/student/logistics/repair/getApplyByPage?
creatorid=555
https://xxxxx.cn/student/logistics/repair/getApplyByPage?creatorid=555+and+length(user())>0–%20
判断数据库用户长度为10,错误,无数据回显
判断数据库用户名长度为14,正确,返回数据
漏洞3:敏感信息越权
在xml中搜索cardID,因为这个大概率是用户身份证信息,发现了有几条sql语句是查询了用户身份证的。
根据刚才sql注入查找函数调用同理,最后跟到了该接口,其中id是用户可控的,存在越权的可能性。
构造一下参数:https://xxxx.cn/student/wx/student/base/student_family_edit/1000,访问成功,数据包中回显了用户身份证信息,存在敏感信息越权漏洞。
漏洞4:配置信息泄露
代码中存在大量数据库等配置信息,但是都在内网,无法利用。
其中wx.properties泄露了微信公众配置信息。appId与appSecret
利用方法:
https://api.weixin.qq.com/cgi-bin/
token?grant_type=client_credential&appid=xxxx&secret=xxxx
将对应的appid和appSecret填入,访问url即可。回显了微信access-token。
接着可以使用access_token调用该小程序所有后台接口的目的,后台服务端接口已涵盖数据、运维、消息等多方面场景能力
利用方法如下图所示
其他利用方法可到微信公众平台后台服务端接口查找。
漏洞5:垂直越权
翻找代码,看到该接口名称,疑似是系统配置接口,这种接口一般是管理员才有权限访问的。
其中一个接口疑似是上传图标的,而且未对上传用户进行权限校验,看起来可以垂直越权,这段代码逻辑大概是这样的:
从请求数据包获取上传文件数据,将文件上传,判断list是否为空,不为空就通过updatelogo方法,将上传文件响应的data与一些学校id参数等数据储存到数据库中。
漏洞复现:
先访问该接口对应的页面看看
确实是一个文件上传图标的地方,上传一个文件试试
上传后,重新访问网站主页,图标修改成功。太可拷了,得马上将logo改回原样。
好好好,下机。
原文始发于微信公众号(有恒安全):一次文件下载漏洞获取源代码审计