目录
空字符绕过、超长字符绕过(././././././)、?绕过、#绕过(需使用编码%23)、空格绕过(需使用编码%20)
学习参考:
一、文件包含
1.什么是文件包含
程序开发人员会把重复使用的函数、变量、类等数据写到单个文件中,需要使用到里面的数据时直接调用此文件,而无需再次编写,这种文件调用的过程称为文件包含。
2.文件包含常见PHP函数
include() //代码执行到include()函数时将文件包含进来并运行
//包含文件发生错误时,程序警告,但会继续执行。
include_once() //与include()类似,唯一区别是文件已经被包含则不再包含。
require() //与include()的区别:执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_once() //与require()类似,唯一区别是文件已经被包含则不再包含
highlight_file()、show_source() //函数对文件进行语法高亮显示,通常能看到源代码
readfile()、file_get_contents() //函数读取一个文件,并写入到输出缓冲
fopen() //打开一个文件或者url
二、文件包含漏洞
1.文件包含漏洞产生原因
程序开发人员希望代码更灵活,所以将被包含文件设置成变量,来进行动态调用。
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
2.文件包含漏洞分类
(1)本地文件包含漏洞
本地文件包含LFI (Local File lnclude):被包含的文件在服务器本地
e.g 在本地创建这两个文件
phpinfo.php代码:
<?php
phpinfo();
?>
测试网页include1.php代码:
<?php
$file=$_GET['filename'];
include($file);
?>
//从URL参数$_GET['filename']获取文件名,然后使用include()函数包含这个文件。
//如果攻击者能够控制filename参数,就可以让服务器执行任意的PHP代码或包含任意文件。
网站利用文件包含功能 可以读取一些php文件,从而得到一些系统本地的敏感信息。
如通过include()函数来执行读取phpinfo.php页面:
(也可以使用绝对路径、相对路径读取)
绝对路径读取敏感文件
//windows敏感文件绝对路径
C:\boot.ini #查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml #IIS配置文件
C:\windows\repair\sam #存储Windows的密码
C:\programFiles\mysql\my.ini #mysql配置文件,里面可能有密码
C:\programFiles\mysql\data\mysql\user.MYD #mysql root密码
C:\windows\php.ini #php配置文件
//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/my.cnf #mysql配置文件
/etc/sysconfig/iptables #查看防火墙策略
(2)远程文件包含漏洞
远程文件包含RFL (Remote File Include):利用外部服务器中的文件进行执行
PHP 行事准则:allow_url_fopen 与 allow_url_include_allow_url_fopen为on-CSDN博客
前提:需要在php.ini中的配置选项中allow_url_fopen和allow_url_include为ON。此时include()、require()函数可以加载远程文件。
allow_url_fopen:on
allow_url_include:on
3.文件包含漏洞特点
(1)无视文件扩展名
当使用PHP中的一些函数的时,无论文件后缀是什么,这个文件都会被当作PHP代码进行执行。
e.g 此处后缀.jpg也可执行成功
(2)无条件解析PHP代码
文件包含漏洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。
三、PHP伪协议
(PHP支持的协议与封装协议)
1.file://协议
用于访问本地文件系统,在CTF中通常用来读取本地文件且不受allow_url_fopen与allow_url_include的影响
file:// [文件的绝对路径和文件名]
2.php://协议
访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input
php://filter 用于读取源码。
php://input 用于执行php代码。
(1)php://filter
读取源代码并进行base64编码输出。
有一些敏感信息会保存在php文件中,如果直接利用文件包含去打开一个php文件,php代码不会显示在页面上
php://filter/convert.base64-encode/resource=文件路径
//使⽤ convert.base64-encode 或 convert.base64-decode 来进⾏base64编码或解码
//convert.* 过滤器
条件:allow_url_fopen :off/on
allow_url_include:off/on
(2)php://input
访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。
当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。
file=php://input
条件:allow_url_fopen :off/on
allow_url_include:on
利用该方法,可以直接写入php文件,输入file=php://input
,然后使用burp抓包,写入php代码
3.zip://协议
访问压缩包里面的文件。
当它与包含函数结合时,zip://流 会被当作php文件执行。从而实现任意代码执行。
- zip://绝对路径
- 要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23
- 只需要是zip的压缩包即可,后缀名可以任意更改。
- 相同的类型还有 zlib:// 、 bzip2:// 、phar://
zip://[压缩包绝对路径]#[压缩包内文件]
e.g
?file=zip://D:/1.zip%23phpinfo.php
条件:allow_url_fopen :off/on
allow_url_include:off/on
4.data://协议
与php://input类似,可以让用户来控制输入流。
当它与包含函数结合时,用户输入的data://流 会被当作php文件执行。从而导致任意代码执行。
利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:
data://text/plain,<?php phpinfo();?>
//如果对特殊字符进行了过滤,可以通过base64编码后再输入:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
条件:allow_url_fopen :on
allow_url_include:on
四、文件包含漏洞绕过方式
//新建include2.php:
<?php
$name=$_GET['name'];
include($name.".lllllllll");
?>
正常访问界面,发现访问的文件后面被添加了.lllllllll(使用以下方法绕过.lllllllll)
1.本地文件包含绕过
(1)空字符 (%00)绕过
要求PHP版本小于5.3.4,设置一下(这里用的小皮)