DVWA & Vulnerability: File Upload(文件上传)

菜鸟前言:

绕过方法有很多,这里只是讲几种我知道的方法,本人也是菜鸟一枚,写的不正确的地方欢迎大佬纠正,本篇博客也是为了记录一下自己踩到的坑,记录自己成长的点滴,以后方便查看,同时也希望能够帮到各位朋友,感谢!

环境:Windows10 DVWA

工具:BurpSuite 蚁剑

蚁剑或中国菜刀都可以

难度等级以及绕过方法:

low:

先看源码:

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // Can we move the file to the upload folder?
    if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
        // No
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}

?> 

$target_path这个变量就是获取上传文件路径,move_uploaded_file函数移动文件上传位置,文件上传的时候会存到放临时目录,当脚本运行结束后就会销毁,所以要更改存放目录,可以看到,这个等级的上传完全没有限制,所以随便上传一个php木马就可以连接。

medium:

源码:

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_type = $_FILES[ 'uploaded' ][ 'type' ];
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];

    // Is it an image?
    if( ( $uploaded_type == "image/jpeg" || $uploaded_type == "image/png" ) &&
        ( $uploaded_size < 100000 ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $_FILES[ 'uploaded' ][ 'tmp_name' ], $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?> 

可以看到,这个等级中用**$_FILES**函数获取了文件名、类型和文件大小,($_FILES函数相关问题请自行百度),而且还需要上传的文件为jpeg或者png且文件大小小于100000字节才可以成功上传。有三种方法可以绕过:

  1. 上传.php一句话木马文件使用BurpSuite修改文件类型绕过::在这里插入图片描述

修改Content-Type字段为image/jpeg可以看到成功上传:
在这里插入图片描述
使用蚁剑连接成功:
在这里插入图片描述

  1. 让.php木马文件改为.jpg文件使用BurpSuite修改文件名绕过:
    [在这里插入图片描述](https://img-blog.csdnimg.cn/20200911224204547.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQ1NjE1MTI3,size_16,color_FFFFFF,t_70#pic_center
    让3.jpg改为3.php同样可以绕过
    在这里插入图片描述
    得到文件路径,蚁剑连接即可。
  2. 上传muma.php.jpg文件,16进制00截断:
    在这里插入图片描述
    可以看到对应的文件名所在行的16进制.jpg小数点所对应的16进制字符为2e,修改为00即可:
    在这里插入图片描述
    阿帕奇服务器上传机制默认为读取小数点后三位,所以上传上去后刚好为muma.php,同样可以使用蚁剑连接。

命令行使用copy 文件1/b + 文件2/a 生成文件名 例:copy 1.jpg/b + 1.php muma.jpg使用jpg文件和php文件合成为jpg文件,同样可以上传绕过,方法都差不多,这里不再上图(这个方法是按照书上写的,我试验的时候并没有成功,在下面high等级会讲到原因)。

high:

放源码:

<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Where are we going to be writing to?
    $target_path  = DVWA_WEB_PAGE_TO_ROOT . "hackable/uploads/";
    $target_path .= basename( $_FILES[ 'uploaded' ][ 'name' ] );

    // File information
    $uploaded_name = $_FILES[ 'uploaded' ][ 'name' ];
    $uploaded_ext  = substr( $uploaded_name, strrpos( $uploaded_name, '.' ) + 1);
    $uploaded_size = $_FILES[ 'uploaded' ][ 'size' ];
    $uploaded_tmp  = $_FILES[ 'uploaded' ][ 'tmp_name' ];

    // Is it an image?
    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&
        ( $uploaded_size < 100000 ) &&
        getimagesize( $uploaded_tmp ) ) {

        // Can we move the file to the upload folder?
        if( !move_uploaded_file( $uploaded_tmp, $target_path ) ) {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }
        else {
            // Yes!
            echo "<pre>{$target_path} succesfully uploaded!</pre>";
        }
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

?>

这个等级个人觉得最主要的是getimage函数,这个函数大致就是获取上传文件内容,因为要检查内容所以相比medium等级来说要难很多,代码中主要函数作用:

strrpos(string , find ,start) 查找find字符在string字符中的最后一次出现的位置,start参数可选,表示指定从哪里开始
substr(string,start,length) 返回string字符中从start开始的字符串,length参数可选,表示返回字符的长度
strtolower(string) 返回给定字符串的小写
getimagesize(string) :函数将测定任何 GIF,JPG,PNG,SWF,SWC,PSD,TIFF,BMP,IFF,JP2,JPX,JB2,JPC,XBM 或 WBMP
图像文件的大小并返回图像的尺寸以及文件类型和一个可以用于普通 HTML 文件中 IMG 标记中的 height/width
文本字符串。如果不能访问 filename 指定的图像或者其不是有效的图像,getimagesize() 将返回 FALSE 并产生一条
E_WARNING级的错误。所以 getimagesize函数的作用是判断上传的文件是不是有效的图片

绕过方法:
使用medium等级的合成木马,但是合成的木马的图片文件要尽可能小,我就因为这个坑困惑了很久,今天才让大佬帮忙解决,因为php一句话木马在文件末尾,但是解析出来的图片码部分代码会让浏览器误判为php语句,所以就提前执行导致报错,造成php语句解析不了的问题。但是如果木马写的太前面getimagesize函数就会识别出来,所以可以在BurpSuite中使用Repeater功能在合适的地方放置木马(一点一点的试),到最后也能成功上传。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zer0one1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值