前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >DVWA & Vulnerability: File Upload(文件上传)

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

作者头像
TenG
发布2020-10-28 17:48:07
1.9K0
发布2020-10-28 17:48:07
举报

菜鸟前言:

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

环境:Windows10 DVWA

工具:BurpSuite 蚁剑

蚁剑或中国菜刀都可以

难度等级以及绕过方法:

low:

先看源码:

代码语言:javascript
复制
<?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:

源码:

代码语言:javascript
复制
<?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
[在这里插入图片描述](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同样可以绕过

在这里插入图片描述
在这里插入图片描述

得到文件路径,蚁剑连接即可。

  1. 上传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:

放源码:

代码语言:javascript
复制
<?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功能在合适的地方放置木马(一点一点的试),到最后也能成功上传。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2020-09-11 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 菜鸟前言:
  • 环境:Windows10 DVWA
  • 工具:BurpSuite 蚁剑
  • 难度等级以及绕过方法:
    • low:
      • medium:
        • high:
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档