DVWA远程文件包含防御

在这里推荐下自己的博客,支持友链互换,Back's Blog

本次防御从代码层面出发, 尽量从多个角度进行防御。不足之处请指出。谢谢。

黑名单检测防御

首先看下dvwa的远程文件包含页面源码(low级别)。

<?php
// The page we wish to display
$file = $_GET[ 'page' ];
?>

可以看到没有经过任何的加固,远程文件包含利用的最大特点显而易见,就是http和https协议。

我们先进行漏洞利用,简单复现。远程文件包含需要在php.ini中打开allow_url_include。


v2-7bfd03f96a207c3bde11c8f7769263c4_b.jpg


这里我已经打开了allow_url_include

本地写好了一个测试文件。简单点。


v2-9f818d0381e33f05140f8f43cc6765b9_b.jpg


进行远程文件包含测试,因为在本地测试,所以写在了同一个虚拟机下(懒得多开)


v2-aebb8d2b4ec1df33d197a3dfaa714cea_b.jpg


成功包含远程文件

这里进行加固,使用黑名单进行检测,若包含的代码中包含http、https则报错,并且退出执行。

加固之后代码如下

<?php

$file = $_GET[ 'page' ];

$black = array("https","http");

if(!in_array($file,$black)){

	echo "危险操作!";

	exit;

}

?>

进行远程文件包含测试


v2-d1d23b236c408a837294946f42a9c97b_b.jpg


黑名单中,不仅可以添加协议,也可以添加敏感信息。如passwd、shadow、hosts等等,以进行防御本地文件包含。

str_replace()函数替换防御

加固代码如下,这里仅写了http用以测试

<?php

$file = $_GET[ 'page' ];

$file = str_replace("http","",$file);

?>

加固成功


v2-a4e3653b2842872fc4561ba554287eff_b.jpg


但是这种加固是及其不安全的,因为str_replace()函数有一个特性,即仅会检测一次。如果我们构造出hthttptp这样的参数,它会替换掉中间的http,然后左右剩下的ht 和 tp 仍会构成一个新的http。

而str_replace()不会再次对此进行检测。从而达到绕过的目的。如下测试图。


v2-57751c910954dc886b7c745a15e65bfe_b.jpg


过滤其他的诸如 https、http:// 等同样可以绕过。

不过对单字符就没办法了。因为只有一个字符,无法构造合成。如下

<?php

$file = $_GET[ 'page' ];

$file = str_replace("h","",$file);

?>

v2-4acfaebb9138f49c8daa6b06fc75fd3e_b.jpg


原则上没有什么问题,但是不建议如此过滤。不仅容易误伤,还容易造成其他错误。

strstr函数过滤防御

直接上代码吧。懒得多BB了。

<?php
$file = $_GET[ 'page' ];
if(strstr($file,"http")==true){
	echo "危险操作";
	exit;
}
?>

strstr()函数主要是进行了一个检测,没有对参数本身进行更改,所以不存在hthttptp的这种情况出现。

然后这里进行判断, 如果存在http则echo “危险操作”,并退出执行。


v2-7fe620bcb7698ee9a640d0c688f01d1e_b.jpg


如果不退出,会是怎样的情景?看一下、我这里修改了下1.txt内容

可以看到,虽然输出危险操作,但是仍然将内容进行了执行并输出。


v2-15534a7ebe49caced7791f233c5606d9_b.jpg


你以为这样就是安全的吗?

不,strstr()函数还有一个问题所在,就是它区分大小写。什么意思?就是小写过滤,但是大写不过滤。如下


v2-765024552ab38292f94402ad6db0c434_b.jpg


应对措施也简单,将获得到的参数进行小写转换。使用strtolower()函数。

$file = strtolower($file);

如此即可


v2-468801834e964b3e06e7621cc1f1d822_b.jpg


白名单检测防御

这种防御方法,即指定可包含文件,其他均不允许。此种方法和Impossible级别一样,只不过添加远程文件即可。

<?php


// The page we wish to display

$file = $_GET[ 'page' ];

// Only allow include.php or file{1..3}.php

if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {

	// This isn't the page we want!

	echo "ERROR: File not found!";

	exit;

}

?>

关于远程文件包含的主要加固方式,还是关闭php.ini中的allow_url_include()比较安全。

如果必须开启的话,要从代码层面进行加固。多层防护,一定要检测你所使用的加固函数是否可以绕过,以及相应的加固措施。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SwBack

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值