php代码审计-任意文件操作篇
常见的一些文件类的危险函数
文件包含
- include
- require
- include_once
- require_once
- sql_autoload
文件读取
- file_get_contents
php://filter 绕过死亡file_put_content() base64 的编码小trick
- fread
- readfile
- file
- highlight_file()(这玩意虽然是高亮显示代码,但是真的可以文件包含,参考basectf的
ez_php_jail)https://blog.csdn.net/2301_76362117/article/details/142261280
show_source
文件写入
- file_put_contents
- fwrite
- mkdir
- fputs
文件删除
- unlink
- rmdir
文件上传
- move_uploaded_file
- copy
- rename
文件上传漏洞
文件上传流程
- 检查文件大小,后缀,类型
- 检查文件内容
- 提取文件后缀
- 生成新文件名
- 将上传临时文件拷贝到新文件名位置
文件上传逻辑常见错误
- 只检查文件类型,不检查文件尾缀
- 文件后缀黑名单导致遗漏
- 使用原始文件名,导致\0截断等漏洞
文件上传,什么都没过滤的情况
例子:泛微eoffice三处任意文件上传getshell
特点:常见于路由设备,内部平台等
可使用扫描器批量发现
文件上传,前端验证情况
例子:泛微eoffice三处任意文件上传getshell
JavaScript进行文件名处理,无任何意义
可使用扫描器批量发现
1 |
|
文件上传,MineType检查绕过
例子:建站之心任意文件上传漏洞
特点:上传时检查mine-type,不检查文件尾缀
用mine-type生成文件尾缀
利用:修改数据包中的mine-type
可使用扫描器批量发现
(就是改这玩意)
文件上传,没有重命名文件后果(php5.3.4后彻底修复,move_uploaded_file是php5.4.7后修复的)
特点:从post变量中获取文件名(目录名)
服务端语言不检查\0
不重命名文件,导致\0进入系统
截断文件名,留下xxx.php
(就类似这种)
文件上传,.htaccess与.user.ini文件将图片转义成php
看中间件,如果找到上传点而且上传点没有任何文件尾缀限制,那么就可以用
文件包含漏洞
文件包含漏洞 !=文件读取漏洞
php文件包含漏洞危害
文件读取
代码执行
常见位置
模板文件名(切换模板)
语言文件名(切换语言)
文件包含漏洞限制
寻找可包含文件:上传文件,临时文件,session文件,日志文件
后缀无法控制的情况下
攻击思路
(1)配合文件上传进行getshell,上传带有后门代码的图片,触发脚本
(2)配合日志文件进行getshell,日志会记录访问ua信息,访问修改ua信息为后门代码,包含即执行后门代码
(3)配合会话文件进行getshell,伪协议没有上传文件也能进行php代码执行,读文件,写文件(算法的转换),session文件写入
什么过滤也没有的文件包含漏洞
例子:thinksns任意文件包含漏洞
https://qkl.seebug.org/vuldb/ssvid-94293
特点:使用thinkphp框架
可包含任意文件
效果:
包含上传的图片->执行命令
需要/0截断的任意文件包含
点:使用thinkphp框架
没有全局转义
/0不受过滤函数影响
/0截断导致任意文件包含漏洞
限制:
php 5.3.4+对包含\0的文件操作函数进行限制
突破:也有一些疏忽(cve-2015-2348)
可以控制协议的任意文件包含漏洞
例子:Metinfo5.3.10版本getshell漏洞
特点:
可控部分:include $file.’.php’;
http协议利用:http://a.com/1.php
php协议利用:zip/phar
制作包含2.php的压缩包
压缩包利用:zip:///var/www/upload/head/2.jpg#2.php
文件删除漏洞
例子:Discuz!x<3.4任意文件删除漏洞
https://www.cnblogs.com/rabbittt/p/13891301.html
危害:
删除服务器任意文件,dos服务器
删除安装锁定文件,导致环境重置(这也是一般cms判定你有没有将cms部署成功的校验方式,只要把锁定文件删了就可以重置环境)
重新安装,数据库写shell。重置管理员账号密码