webshell一些上传心得
我们以upload-labs为基础
一、前端拦截:
如第一关
工作方式:
直接在前端拦截
绕过方式:
因为没有限制后端,所有可以用bs 绕过前端修改格式即可
-
将需要上传的php文件改成jpg格式
-
使用burp suite 拦截上传后,使用repeater模块将jpg改回php发送即可

-
可以看到成功上传

二、只判断文件类型:
如第二关
工作方式:
只判断了文件的类型,而没有进行其他的检查方式
绕过方式:
使用bs将返回的数据包中文件格式直接改成允许的文件格式即可绕过
-
将php文件上传的同时使用bs抓包
-
使用repeater模块,将content-type中数据改为
image/png即可

-
可以看到已成功上传

三、黑名单限制
如第5、6、7、8、9关(因为是windows的特性,所以只能在windows中使用)
工作方式:
匹配到代码带有的黑名单后会直接拦截
绕过方式:
将后缀改为一些没有被拦截到的方式进行绕过
| 绕过方式 | 示例 | 绕过原因 |
|---|---|---|
| 修改大小写绕过 | 1.Php | windows不区分大小写 |
| 添加末尾空格绕过 | 1.php | Windows会自动删除首尾空格 |
| 在末尾添加 . 绕过 | 1.php. | windows会删除末尾的点 |
在末尾添加 ::$DATA绕过 | 1.php:$DATA | Windows会将以::$DATA结尾的文件以数据流的方式处理 |
四、删除黑名单内容
如第十关
工作方式:
将匹配到的黑名单的信息删掉
绕过方式:
双写代码实现绕过如1.pphphp
五、修改文件上传位置:
如第十一、十二关
工作方式:
用户在上传文件后,程序将在temp目录下生成一个临时文件,再将该文件转到程序指定的目录下
绕过方式:
在第十一关:文件保存路径是由第9行代码决定
# 第十一关的部分代码如下
$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){$ext_arr = array('jpg','png','gif');$file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);if(in_array($file_ext,$ext_arr)){$temp_file = $_FILES['upload_file']['tmp_name'];$img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext; # 看这行代码if(move_uploaded_file($temp_file,$img_path)){$is_upload = true;} else {$msg = '上传出错!';}} else{$msg = "只允许上传.jpg|.png|.gif类型文件!";}
}
我们随意上传一个文件:可以看出用户可以修改save_path函数的内容,那我们将内容改为../uploads/1.php%00 然后上传文件后缀为.jpg的php文件,代码处得到的后缀为jpg,能够通过对文件后缀的检测,但在$img_path变量处就会出现其值为../uploads/1.php%00+随机日期.jpg,当执行move_uploaded_file函数时,服务器会对路径中%00后的内容不做解析,默认迁移文件为../uploads/1.php。
%00截断原理:
这是字符串的结束标识符(不再对后文的信息进行处理),攻击者可以利用手动添加字符串标识符的方式将后面的内容忽略,而后面的内容又可以帮助我们绕过检测。

-
将jpg格式的php文件上传的同时使用bs抓包
-
将抓到的数据包转到repeater模块同时修改
save_path并发送
-
可以看出php文件以及上传为1.php。同时,因为1.php后面的\0将后面的jpg忽略了

注意在第十二关中使用的是post方法,需要对%00解码:
六、文件头检查(文件包含):
如第14、15、16关
工作方式:
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;
}
如这个函数片段,该检查方式是查看文件头部的两个字节的信息(前几个字节是格式信息)。如图:

绕过方式:
前提:需要有文件包含漏洞才可实现,因为使用图片马会导致拼接的php代码无法解析
因为检查的文件头部信息,上述的如改文件格式等方式肯定是不行了,就需要使用图片马了
图片马:
在图片信息的后面拼接木马信息,使得在检查时,前几个字节仍然是正常的图片信息,但后面的php不会被检查,从而绕过检测上传
- 制作图片马:
打开cmd窗口(注意工作目录)、copy 1.png/b + 1.php /a 1.png 
拼接之后的数据:
-
将制作好的图片马直接上传
-
再利用文件包含漏洞即可成功

七、二次渲染:
第16关
工作方式:
用户上传图片后,程序并没有直接将该图片使用,而是用该图片生成一个新的图片,将新的图片用于内部使用
$im = imagecreatefromjpeg($target_path);
# 用$target_path的图片生成一个新的图片赋值给$im
绕过方式:
图片会进行二次渲染从而使图片马不能正常使用,需要寻找没有被修改且不会影响图片格式的部分插入一句话木马
| 格式 | webshell插入位置 |
|---|---|
| GIF: | 可以直接在渲染前后没变化的数据块插入木马即可 |
| PNG: | 需要将数据写入PLTE或IDAT模块 |
| JPG: | 需要插入到指定的数据块,而且可能不成功,所以需要多次尝试 |
GIF绕过:
- 上传一个普通的GIF图片;将渲染后的图片下载后进行比较
- 使用010editer等工具进行比较
- 最好选择相同且为全0的填充字段,如果没有,在偏后的部分找相同字段修改也可以的

- 利用文件包含漏洞访问

八、条件竞争
第十七关
工作方式
$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 = '上传出错!';}
}
代码的处理流程
- 移动文件到指定路径
- 判断文件后缀是否符合
- 符合则重命名;不符合则删除文件
绕过方式
像这种存在代码逻辑问题(先移动再删除),服务器处理过程中,总是有时间差,而我们上传图片后在文件还没被删除时就快速访问目标文件(上传的文件是在上级目录再创建一个木马文件),就能够在删除前就创建新的木马文件,源文件删除后,新木马文件并不会删除
- 创建木马文件
q.php:在执行时会在上级目录生成一个1.php的木马文件
<?php fputs(fopen('../1.php','w'),'<?php @eval($_POST["111"])?>');?>
-
将
q.php上传并用bs抓包
转入intruder模块,随便设置一下

-
再抓一个访问q.php的数据包

-
也转入intruder模块
-
准备工作做好后,开始攻击
可以看到有一个成功,再打开vscode

1.php已经生成
相关文章:
webshell一些上传心得
我们以upload-labs为基础 一、前端拦截: 如第一关 工作方式: 直接在前端拦截 绕过方式: 因为没有限制后端,所有可以用bs 绕过前端修改格式即可 将需要上传的php文件改成jpg格式 使用burp suite 拦截上传后,使用re…...
ROS实践(二)构建Gazebo机器人模型文件urdf
目录 一、基础语法 1. urdf文件组成 2. robot根标签 3. link 和 joint标签 4. sensor标签 二、 实验:使用launch文件启动rviz查看机器人模型 1. 编写机器人模型的urdf文件。 2. 编写launch文件。 3. 运行launch,查看效果。 URDF(Unifi…...
Linux 入门:常用命令速查手册
目录 一.指令 1.pwd(显示所在路径) 2.ls(列出所有子目录与文件) 3.touch(创建文件) 4.mkdir(创建目录) 5.cd(改变所处位置) 6.rm(删除&…...
kali linux web扫描工具
Kali Linux是一款专为网络安全领域而打造的操作系统,提供了众多优秀的安全工具,其中就包括了强大的web扫描工具。Web扫描是网络安全检测的一个重要环节,它可以帮助安全专家检测网站的漏洞,提升网站的安全性。 Kali Linux中集成了…...
2路模拟量同步输出卡、任意波形发生器卡—PCIe9100数据采集卡
品牌:阿尔泰科技 型号: PCIe9100、PCIe9101、PXIe9100、PXIe9101 产品系列:任意波形发生器 支持操作系统:XP、Win7、Win8、Win10 简要介绍: 910X 系列是阿尔泰科技公司推出的 PCIe、PXIe 总线的任意波形发生器&…...
Facebook 隐私保护技术的发展与未来趋势
Facebook 隐私保护技术的发展与未来趋势 在这个数字化时代,个人隐私保护已成为全球关注的焦点。Facebook,作为全球最大的社交网络平台之一,其在隐私保护技术的发展上扮演着重要角色。本文将探讨 Facebook 在隐私保护技术方面的进展ÿ…...
Android TCP封装工具类
TCP通信的封装,我们可以从以下几个方面进行改进: 线程池优化:使用更高效的线程池配置,避免频繁创建和销毁线程。 连接重试机制:在网络不稳定时,自动重试连接。 心跳机制:保持长连接ÿ…...
Python基于Django的医用耗材网上申领系统【附源码、文档说明】
博主介绍:✌Java老徐、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&…...
Java虚拟机之垃圾收集(一)
目录 一、如何判定对象“生死”? 1. 引用计数算法(理论参考) 2. 可达性分析算法(JVM 实际使用) 3. 对象的“缓刑”机制 二、引用类型与回收策略 三、何时触发垃圾回收? 1. 分代回收策略 2. 手动触发…...
【mysql】mysql数据库,权限授予,账号设置
创建一个可用的数据库,名字为gitea,支持中文utf8mb4 CREATE DATABASE gitea CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; # 设置东八区时区 SET GLOBAL time_zone 08:00; FLUSH PRIVILEGES; # 查询当前时间 SELECT NOW();给【普通用户】授予查…...
Html5学习教程,从入门到精通, HTML5超链接应用的详细语法知识点和案例代码(18)
HTML5超链接应用的详细语法知识点和案例代码 超链接(Hyperlink),也称为跃点链接,是互联网和文档编辑中的一种重要概念。 超链接的定义 超链接是指从一个网页指向一个目标的连接关系,这个目标可以是另一个网页&#…...
⭐LeetCode(数学分类) 48. 旋转图像——优美的数学法转圈(原地修改)⭐
⭐LeetCode(数学分类) 48. 旋转图像——优美的数学法转圈(原地修改)⭐ 示例 1: 输入:root [5,3,6,2,4,null,8,1,null,null,null,7,9] 输出:[1,null,2,null,3,null,4,null,5,null,6,null,7,null,8,null,9] 示例 2: 输入࿱…...
深度学习PyTorch之13种模型精度评估公式及调用方法
深度学习pytorch之22种损失函数数学公式和代码定义 深度学习pytorch之19种优化算法(optimizer)解析 深度学习pytorch之4种归一化方法(Normalization)原理公式解析和参数使用 深度学习pytorch之简单方法自定义9类卷积即插即用 实时…...
tomcat单机多实例部署
一、部署方法 多实例可以运行多个不同的应用,也可以运行相同的应用,类似于虚拟主机,但是他可以做负载均衡。 方式一: 把tomcat的主目录挨个复制,然后把每台主机的端口给改掉就行了。 优点是最简单最直接,…...
Java开发者如何接入并使用DeepSeek
目录 一、准备工作 二、添加DeepSeek SDK依赖 三、初始化DeepSeek客户端 四、数据上传与查询 五、数据处理与分析 六、实际应用案例 七、总结 【博主推荐】:最近发现了一个超棒的人工智能学习网站,内容通俗易懂,风格风趣幽默ÿ…...
win10电脑鼠标速度突然变的很慢?
电脑鼠标突然变很慢,杀毒检测后没问题,鼠标设置也没变,最后发现可能是误触鼠标的“DPI”调节键。 DPI调节键在鼠标滚轮下方,再次点击即可恢复正常鼠标速度。 如果有和-的按键,速度变快,-速度变慢。 图源&…...
第四次CCF-CSP认证(含C++源码)
第四次CCF-CSP认证 第一道(easy)思路及AC代码 第二道(easy)思路及AC代码遇到的问题 第三道(mid)思路及AC代码 第一道(easy) 题目链接 思路及AC代码 这题就是将这个矩阵旋转之后输出…...
Netty基础—1.网络编程基础一
大纲 1.什么是OSI开放系统互连 2.OSI七层模型各层的作用 3.TCP/IP协议的简介 4.TCP和UDP的简介 5.TCP连接的三次握手 6.TCP连接的四次挥手 7.TCP/IP中的数据包 8.TCP通过确认应答与序列号提高可靠性 9.HTTP请求的传输过程 10.HTTP协议报文结构 11.Socket、短连接、长…...
【理想解法学习笔记】
目录 理想解法原理简介算法步骤属性值规范化方法代码示例 理想解法 原理简介 TOPSIS(Technique for Order Preference by Simi larity to IdealSolution)法是一种逼近理想解的排序方法。其基本的处理思路是:首先建立初始化决策矩阵,而后基于规范化后的初…...
98.在 Vue3 中使用 OpenLayers 根据 Resolution 的不同显示不同的地图
在 Vue3 中使用 OpenLayers 根据 Resolution 的不同显示不同的地图 前言 在 Web GIS(地理信息系统)应用开发中,地图的 Resolution(分辨率)是一个重要的概念。不同的 Resolution 适用于不同的地图层级,有时…...
Docker 部署 Vaultwarden
一、前言 1. 官网 1.1 Vaultwarden https://github.com/dani-garcia/vaultwarden https://github.com/wcjxixi/Vaultwarden-Wiki-Chn https://hub.docker.com/r/vaultwarden/server https://rs.ppgg.in/ # Vaultwarden Wiki 中文版 https://geekdaxue.co/read/Vaultward…...
Smart contract -- 自毁合约
在区块链开发中,Solidity 语言提供了强大的功能,其中自毁合约是一个独特且重要的特性。今天,就让我们深入探讨一下 Solidity 中的自毁合约,以及如何使用 selfdestruct 函数。 注意:使用继承时请确保代码的正确性&#…...
unity学习64,第3个小游戏:一个2D跑酷游戏
目录 学习参考 素材资源导入 1 创建项目 1.1 创建1个2D项目 1.2 导入素材 2 背景图bg 2.0 bg素材 2.1 创建背景 2.2 修改素材,且修改摄像机等 2.2.1 修改导入的原始prefab素材 2.2.2 对应调整摄像机 2.2.3 弄好背景 2.3 背景相关脚本实现 2.3.1 错误…...
Python Flask 在网页应用程序中处理错误和异常
Python Flask 在网页应用程序中处理错误和异常 Python Flask 在网页应用程序中处理错误和异常 Python Flask 在网页应用程序中处理错误和异常 在我们所有的代码示例中,我们没有注意如何处理用户在浏览器中输入错误的URL或向我们的应用程序发送错误的参数集的情况。…...
模板方法模式的C++实现示例
核心思想 模板方法设计模式是一种行为设计模式,它定义了一个算法的框架,并将某些步骤的具体实现延迟到子类中。通过这种方式,模板方法模式允许子类在不改变算法结构的情况下重新定义算法的某些步骤。 模板方法模式的核心在于: …...
水下机器人推进器PID参数整定与MATLAB仿真
水下机器人推进器PID参数整定与MATLAB仿真 1. PID控制原理 目标:通过调节比例(P)、积分(I)、微分(D)参数,使推进器输出力快速稳定跟踪期望值。传递函数(示例):推进器动力学模型可简化为: [ G(s) = \frac{K}{\tau s + 1} \cdot e^{-Ts} ] 其中:K为增益,τ为时间常…...
在本地部署DeepSeek等大模型时,需警惕的潜在安全风险
在本地部署DeepSeek等大模型时,尽管数据存储在本地环境(而非云端),但仍需警惕以下潜在安全风险: 1. 模型与数据存储风险 未加密的存储介质:若训练数据、模型权重或日志以明文形式存储,可能被物…...
智能焊机监测系统:打造工业安全的数字化盾牌
在现代工业生产中,焊机作为核心设备之一,其稳定性和安全性直接关系到生产效率和产品质量。德州迪格特科技有限公司推出的智能焊机监测系统,通过先进的技术手段,为工业生产构筑了一道坚固的安全防线。 智能监测,保障焊…...
【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX
文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串,value 的类型是存在差异的 二进制存储 Redis 中的字符串,直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据,还可…...
GaussDB安全配置指南:从认证到防御的全方面防护
一、引言 随着企业数据规模的扩大和云端化进程加速,数据库安全性成为运维的核心挑战之一。GaussDB作为一款高性能分布式数据库,提供了丰富的安全功能。本文将从 认证机制、权限控制、数据加密、审计日志 等维度,系统性地讲解如何加固 Ga…...
