文件包含——(3)

导语:

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

  • require
  • require_once
  • include
  • include_once

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

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

  • PHP包含漏洞结合上传漏洞;
  • PHP包含读文件;
  • PHP包含写文件;
  • PHP包含日志文件;
  • PHP截断包含;
  • PHP内置伪协议利用。

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

正文

0x01 包含上传文件

以DVWA为例演示一下PHP文件包含漏洞,代码如下:

<?php $file = $_GET['page']; include $file; ?>

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

文件包含——(3)

0x02 PHP包含读文件

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

  • File:// 访问本地文件系统
  • http:// 访问HTTP(S)网址
  • php:// 访问各个输入/输出流
  • data:// 数据

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

文件包含——(3)

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

0x03 PHP包含写文件

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

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

文件包含——(3)

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

0x04 PHP包含日志

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

文件包含——(3)

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

0x05 截断包含

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

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

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

文件包含——(3)

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

文件包含——(3)

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

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

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

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

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

0x06 其他绕过

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

文件包含——(3)

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

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

文件包含——(3)

成功绕过。

0x07 防御和安全编码

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

文件包含——(3)

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

结语

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