freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

和开发斗智斗勇的日常:PHP is_file()函数绕过
2021-01-20 15:35:09

前言

最近新上了一个项目,不得不说,这个项目组的代码安全性在公司能排前三的,平时就连挖个xss都觉得是一种恩赐,本来没有抱太大的希望能够发现些什么,可是皇天不负有心人,在我的辛(hua)苦(shui)工作下终究是发现了问题。

0x1 开发小哥不讲武德

由于是内部项目,手里有源码,丢去扫了一圈,没有发现什么问题,于是乎开始黑盒测试,项目是一个小程序,使用fidder转发流量到burp上,可以在电脑上不用设置微信代理直接抓取小程序的接口数据包,发现了一处上传的地方,看了代码不能绕过,但是发现在请求个人信息接口的时候返回了上传文件的相对路径,然后通过查看图片的接口能够获取到图片的内容,刚想说试试文件读取漏洞,结果发现这个接口传递两个参数,一个文件路径,一个是token,进行了加密验证。

1611127710_6007db9e5e1b5707b13cb.png!small?1611127710677

又去翻了翻源码,加密算法无法破解,顿时又去翻了一下文件上传的代码,想着通过上传修改存储的路径,然后拼接他加密后的文件路径和token来实现任意文件读取,没想到当我修改文件路径的时候,直接给我抛出了异常(本地开发环境),我反复研究了一天后发现,这里应该是开发他们自己的问题,不是我的问题,于是呼叫了开发小哥过来修bug,小哥很给力,看了一眼异常以后就说知道问题在哪里了,回去不到一分钟修复了这个bug,兴奋的我当着小哥的面就按着之前的思路开始验证,这时小哥突然问了一句:你这个是传的本地的文件路径是吧,我顺嘴就回了他一句是的。

1611127730_6007dbb25dffa2b1278a7.png!small?1611127730567

1611127736_6007dbb8758a1add014ba.png!small?1611127736701

验证成功,我告诉他可以正常使用了,小哥看了我一眼就回到了工位,我也开始写报告了,报告正写到一半,突然感觉不对劲,回想起小哥问我的那句话,我立马再去复现我的那个漏洞,复现不了了。

1611127606_6007db361a5dc69438c11.png!small?1611127606348

啪,大意了啊,没有闪,开发小哥不讲武德,回头看了一眼小哥,心里一万个草泥马飘过。

0x2 道高一尺魔高一丈

由于开发小哥破坏规矩在先,我也就不客气了,直接上服务器拿到了他修复的代码,发现是通过类型函数验证了传入参数是否为文件。

1611127746_6007dbc2cfba07c67254c.png!small?1611127747026

看到这里要想绕过的条件就是parse_url()解析出来没有path参数,要么就是is_file()判断为假,测试了一下,parse_url()倒是好绕过,但是就没有原来的文件路径了,无法进行跨目录读取文件,于是重心放在了is_file()函数上面。

1611127758_6007dbce96d7532d143f3.png!small?1611127758797

查看说明发现如果输入的是存在且正常的文件就返回true,所以要构造一个不存在的文件路径。

1611127771_6007dbdb56bf869d6fde8.png!small?1611127771664

该函数检测的时候是以绝对路径来检测的,当输入的路径中第一级目录是不存在的,返回了yes绕过该函数的检测。但是利用文件读取时,文件路径必须存在可访问,再次查看读取图片文件的代码片段,$avater是我们传入的参数,前面限制了一个路径,所以构造一个存在在限制路径下的路径便可以绕过上传时is_file()函数的检测。

1611127781_6007dbe54784996d45112.png!small?1611127781515

通过之前成功的上传发现相对路径目录在/z**/下面,构造路径进行尝试,成功传入路径。

1611127789_6007dbed02ff023cfdf6a.png!small?1611127789200

再获取图片信息,也成功读取到文件内容。

1611127794_6007dbf26563ebc0bca9b.png!small?1611127794667

0x3 总结

其实之前也遇到过类似的文件读取加密字符串验证路径,也是通过上传的时候修改了上传的路径,使得读取加密字符串为我们需要的路径,这也是容易忽略掉的一点,认为读取的时候加密就万事大吉了,不过这次的开发小哥也比较鸡贼,在bug修改后能够第一时间反应过来存在的问题,进行了限制。虽然过程有些坎坷,期间想草草结束完事,但是对于疑点还是坚持下去了,思路短缺的时候休息一下,再次启程就会发现更多新的东西。

# 代码审计 # 文件读取
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者
文章目录