前言
最近新上了一个项目,不得不说,这个项目组的代码安全性在公司能排前三的,平时就连挖个xss都觉得是一种恩赐,本来没有抱太大的希望能够发现些什么,可是皇天不负有心人,在我的辛(hua)苦(shui)工作下终究是发现了问题。
0x1 开发小哥不讲武德
由于是内部项目,手里有源码,丢去扫了一圈,没有发现什么问题,于是乎开始黑盒测试,项目是一个小程序,使用fidder转发流量到burp上,可以在电脑上不用设置微信代理直接抓取小程序的接口数据包,发现了一处上传的地方,看了代码不能绕过,但是发现在请求个人信息接口的时候返回了上传文件的相对路径,然后通过查看图片的接口能够获取到图片的内容,刚想说试试文件读取漏洞,结果发现这个接口传递两个参数,一个文件路径,一个是token,进行了加密验证。
又去翻了翻源码,加密算法无法破解,顿时又去翻了一下文件上传的代码,想着通过上传修改存储的路径,然后拼接他加密后的文件路径和token来实现任意文件读取,没想到当我修改文件路径的时候,直接给我抛出了异常(本地开发环境),我反复研究了一天后发现,这里应该是开发他们自己的问题,不是我的问题,于是呼叫了开发小哥过来修bug,小哥很给力,看了一眼异常以后就说知道问题在哪里了,回去不到一分钟修复了这个bug,兴奋的我当着小哥的面就按着之前的思路开始验证,这时小哥突然问了一句:你这个是传的本地的文件路径是吧,我顺嘴就回了他一句是的。
验证成功,我告诉他可以正常使用了,小哥看了我一眼就回到了工位,我也开始写报告了,报告正写到一半,突然感觉不对劲,回想起小哥问我的那句话,我立马再去复现我的那个漏洞,复现不了了。
啪,大意了啊,没有闪,开发小哥不讲武德,回头看了一眼小哥,心里一万个草泥马飘过。
0x2 道高一尺魔高一丈
由于开发小哥破坏规矩在先,我也就不客气了,直接上服务器拿到了他修复的代码,发现是通过类型函数验证了传入参数是否为文件。
看到这里要想绕过的条件就是parse_url()解析出来没有path参数,要么就是is_file()判断为假,测试了一下,parse_url()倒是好绕过,但是就没有原来的文件路径了,无法进行跨目录读取文件,于是重心放在了is_file()函数上面。
查看说明发现如果输入的是存在且正常的文件就返回true,所以要构造一个不存在的文件路径。
该函数检测的时候是以绝对路径来检测的,当输入的路径中第一级目录是不存在的,返回了yes绕过该函数的检测。但是利用文件读取时,文件路径必须存在可访问,再次查看读取图片文件的代码片段,$avater是我们传入的参数,前面限制了一个路径,所以构造一个存在在限制路径下的路径便可以绕过上传时is_file()函数的检测。
通过之前成功的上传发现相对路径目录在/z**/下面,构造路径进行尝试,成功传入路径。
再获取图片信息,也成功读取到文件内容。
0x3 总结
其实之前也遇到过类似的文件读取加密字符串验证路径,也是通过上传的时候修改了上传的路径,使得读取加密字符串为我们需要的路径,这也是容易忽略掉的一点,认为读取的时候加密就万事大吉了,不过这次的开发小哥也比较鸡贼,在bug修改后能够第一时间反应过来存在的问题,进行了限制。虽然过程有些坎坷,期间想草草结束完事,但是对于疑点还是坚持下去了,思路短缺的时候休息一下,再次启程就会发现更多新的东西。
来源:freebuf.com 2021-01-20 15:35:09 by: Strjziny
请登录后发表评论
注册