DVWA靶场-File Upload 文件上传

往期博文:

DVWA靶场-Brute Force Source 暴力破解

DVWA靶场-Command Injection 命令注入

DVWA靶场-CSRF 跨站请求伪造

DVWA靶场-File Inclusion 文件包含

靶场环境搭建

https://github.com/ethicalhack3r/DVWA

[网络安全学习篇附]:DVWA 靶场搭建

目录

 

File Upload

Low File Upload

核心代码

Medium File Upload

核心代码

High File Upload

核心代码

windows下 制作图片木马

linux下 制作图片木马

Impossible File Upload

核心代码


File Upload

Low File Upload

核心代码

<?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 ) ) {
        echo '<pre>Your image was not uploaded.</pre>';
    }
    else {
        // Yes!
        echo "<pre>{$target_path} succesfully uploaded!</pre>";
    }
}

?>

low 级别对上传的文件没有任何的过滤,并且会输出文件上传成功后保存的路径

我们本地构造info.php 文件

<?php phpinfo(); ?>

将其上传

上传成功后,使用输出的路径直接追加到当前页面的url 之后

../../hackable/uploads/info.php

 

Medium File Upload

核心代码

<?php 

    // 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 ) ) 

?>

中级相较于初级增加了文件类型检测机制,我们只需要通过bp 抓包,修改tyoe 参数即可绕过

 

High File Upload

核心代码

<?php 

if( isset( $_POST[ 'Upload' ] ) ) { 

    $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' ]; 

    // 判断后缀名是否为jpg,jpeg,png

    if( ( strtolower( $uploaded_ext ) == "jpg" || strtolower( $uploaded_ext ) == "jpeg" || strtolower( $uploaded_ext ) == "png" ) &&

        ( $uploaded_size < 100000 ) &&

//getimagesize 进行图片检测

        getimagesize( $uploaded_tmp ) ) {

?>

这里的getimagesize 函数会对我们上传的图片进行验证,我们可以通过制作图片木马来绕过这个函数,

windows下 制作图片木马

copy pic.png/b+info.php/a info.png

linux下 制作图片木马

# 将 info.php 内容追加到 pic.png

cat info.php >> pic.png

 

# png + php 合成 png 图马

cat pic.png info.php >> info.png

 

# 直接 echo 追加

echo '<?php phpinfo();?>' >> pic.png

 

上传成功

这里我们结合文件包含漏洞去验证我们上传的图片木马

vulnerabilities/fi/?page=file:///C:\phpStudy\WWW\DVWA-master\hackable\uploads\test_info.jpg

 

Impossible File Upload

核心代码

<?php

    // token 防御csrf
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' ); 

    //使用时间戳的md5值作为文件名
    $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

    // 检测文件的后缀名,文件大小,getimagesize()检测
    if( ( strtolower( $uploaded_ext ) == 'jpg' || strtolower( $uploaded_ext ) == 'jpeg' || strtolower( $uploaded_ext ) == 'png' ) && ( $uploaded_size < 100000 ) &&
    ( $uploaded_type == 'image/jpeg' || $uploaded_type == 'image/png' ) &&
    getimagesize( $uploaded_tmp ) ) { 

        // 删除源数据,重新生成图片
        if( $uploaded_type == 'image/jpeg' ) {
            $img = imagecreatefromjpeg( $uploaded_tmp );
            imagejpeg( $img, $temp_file, 100);
        }
        else {
            $img = imagecreatefrompng( $uploaded_tmp );
            imagepng( $img, $temp_file, 9);
        } 

       //销毁图像资源
       imagedestroy( $img ); 

// Generate Anti-CSRF token
generateSessionToken(); 

?>

 

可以看到,Impossible级别的代码对上传文件进行了重命名(为md5值,导致%00截断无法绕过过滤规则),加入token防护CSRF攻击,同时对文件的内容作了严格的检查,过滤了图片中的恶意代码,导致攻击者无法上传含有恶意脚本的文件。


https://www.sqlsec.com/2020/05/dvwa.html#toc-heading-31

https://www.freebuf.com/articles/web/119467.html

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

beglage

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

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

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

打赏作者

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

抵扣说明:

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

余额充值