BlBana's BlackHouse.

文件包含漏洞

字数统计: 1.3k阅读时长: 4 min
2016/08/12 Share

导语:

当程序员在编写代码的过程中,由于使用PHP文件包含函数过滤不严,从而导致了文件包含漏洞。在PHP中用于文件包含的函数有四个:

1.require

2.require_once

3.include

4.include_once

include和require区别主要是,include在包含的过程中如果出现错误,会抛出一个警告,程序继续正常运行;而require函数出现错误的时候,会直接报错并退出程序的执行。

文件包含漏洞主要的危害有这些:

1.PHP包含漏洞结合上传漏洞;

2.PHP包含读文件;

3.PHP包含写文件;

4.PHP包含日志文件;

5.PHP截断包含;

6.PHP内置伪协议利用。

这些是文件包含漏洞的常见使用方法,有效的结合能够起到巨大的作用。

正文

0x01 包含上传文件

以DVWA为例演示一下PHP文件包含漏洞,代码如下:
<?php $file = $_GET['page']; include $file; ?>

我们可以先利用上传漏洞,上传我们要包含的文件在利用包含漏洞执行代码,来包含我们在../../目录下上传的含有phpinfo()的文本文件,我们发现即使是.txt文件也可以正常解析,这就是文件包含的强大之处。

0x02 PHP包含读文件

在PHP中还内置了一些类似于URL中的PHP伪协议,我们可以利用这些伪协议来帮助我们实现更加高级的文件包含功能

常见的PHP伪协议:

1.File:// 访问本地文件系统

2.http:// 访问HTTP(S)网址

3.php:// 访问各个输入/输出流

4.data:// 数据

通常情况下,当我们去包含PHP源码的时候,源码会被解析我们就都不到源代码了,这时候就可以利用读文件的方式读取到PHP源码,我们可以使用:php://filter/read = convert.base64-encode/resource=xxx.php的方式,将PHP源码以Base64编码的形式读出来:

我们成功的将PHP源码读了出来,代码还没有解析。

0x03 PHP包含写文件

既然能读文件,肯定还能写文件,但是要是想利用包含写文件,必须开启PHP的url_allow_include远程URL功能,但是这个功能经过测试在5.3.0的时候已经用不了了,5.4.0直接废除了,因此在PHP 5.3.0一下版本才能实现。

利用php://input post提交我们要执行的代码

直接可以执行系统命令,太可怕了 ~~~ 但是条件很苛刻,需要开启远程加载URL选项,比较难见

0x04 PHP包含日志

当我们没有上传点,并且也没有url_allow_include功能时,我们就可以考虑包含服务器的日志文件,思路也比较简单,当我们访问网站时,服务器的日志中都会记录我们的行为,当我们访问链接中包含PHP一句话木马时,也会被记录到日志中

这时候我们如果知道服务器的日志位置,我们可以去包含这个文件从而拿到shell

0x05 截断包含

当PHP源码对于文件包含做出一定过滤的时候:

<?php if(isset($_GET['page'])){ include $_GET['page'].'.php'; }else{ include 'index.php'; } ?>
 

 

这时,当我们直接包含文件的时候就会爆出错误

告诉我们文件打开失败,这个时候我们要想办法过滤到后面的.php,我们就可以利用%00截断来绕过过滤

OK了,成功包含了目标文件,但是这个功能也仅在5.3.0下的版本可用,高于此版本便不行了。

?file=../../../../../../../../../etc/passwd/././././././.[…]/./././././.

(php版本小于5.2.8(?)可以成功

?file=../../../../../../../../../boot.ini/………[…]…………

(php版本小于5.2.8(?)可以成功,只适用windows

0x06 其他绕过

我在讲讲其他的绕过方法吧

dvwa中级难度的包含,这个主要是过滤了远程文件包含和我们目录的跳转,大小写混合输入就可以绕过远程文件包含的过滤

目录跳转的过滤我们可以构造….//….//xxx.php,方式绕过,由于他只过滤一次,我们可以利用他的过滤动态拼接目录跳转,从而绕过过滤

成功绕过。

0x07 防御和安全编码

接下来我们讲讲如何避免文件包含漏洞,其实只要我们把包含的文件写死,不要利用变量来构造包含的文件,自然就可以避免漏洞的发生,dvwa的high里用的就是没办法包含的源码

直接将文件写死,只要不是白名单里的这几个文件,一律不执行,很容易就避免了漏洞

结语

其实这个漏洞的避免并不难,只要在编写的过程中注意一下代码的编写,过滤好包含的文件就可以避免漏洞的发生,还有PHP文件的安全配置,我们就能避免远程文件包含。

 

CATALOG
  1. 1. 导语:
  2. 2. 正文
    1. 2.1. 0x01 包含上传文件
    2. 2.2. 0x02 PHP包含读文件
    3. 2.3. 0x03 PHP包含写文件
    4. 2.4. 0x04 PHP包含日志
    5. 2.5. 0x05 截断包含
    6. 2.6. 0x06 其他绕过
    7. 2.7. 0x07 防御和安全编码
  3. 3. 结语