导语:
当程序员在编写代码的过程中,由于使用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文件的安全配置,我们就能避免远程文件包含。