Upload-Labs(16)
前言
我在这道题上花了快一天的时间,但是也学到了不少姿势,觉得东西应该足够多,而且参考了的博客发现这道题算是有歧义的,不知道作者想要考察的点是哪一个,所以算是有两种解法吧,可惜的是两种方法都不算是大成功,只有部分成功执行了。
参考博客:upload-labs之pass 16详细分析
Pass-16
源码(三种图片的判定,只贴一个吧,篇幅小一点):
$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){// 获得上传文件的基本信息,文件名,类型,大小,临时文件路径$filename = $_FILES['upload_file']['name'];$filetype = $_FILES['upload_file']['type'];$tmpname = $_FILES['upload_file']['tmp_name'];$target_path=UPLOAD_PATH.'/'.basename($filename);// 获得上传文件的扩展名$fileext= substr(strrchr($filename,"."),1);//判断文件后缀与类型,合法才进行上传操作if(($fileext == "jpg") && ($filetype=="image/jpeg")){if(move_uploaded_file($tmpname,$target_path)){//使用上传的图片生成新的图片$im = imagecreatefromjpeg($target_path);if($im == false){$msg = "该文件不是jpg格式的图片!";@unlink($target_path);}else{//给新图片指定文件名srand(time());$newfilename = strval(rand()).".jpg";//显示二次渲染后的图片(使用用户上传图片生成的新图片)$img_path = UPLOAD_PATH.'/'.$newfilename;imagejpeg($im,$img_path);@unlink($target_path);$is_upload = true;}} else {$msg = "上传出错!";}}else if(($fileext == "png") && ($filetype=="image/png")){......}else if(($fileext == "gif") && ($filetype=="image/gif")){.....}else{$msg = "只允许上传后缀为.jpg|.png|.gif的图片文件!";}
}
提示:本pass重新渲染了图片!
。说明对图片进行了二次渲染,我的理解就是把上传的图片,根据一些标准,只把图片中的图片信息提取出来,再生成一个图片,可以有效避免图片马。
首先是分析一波源码:
以jpg文件判定为例。获取文件名、类型、临时文件路径,获取文件后缀,进入jpg图片判定,判定的方式是通过文件后缀和文件的类型判定,再执行move_uploaded_file
函数先把文件移动到upload
文件夹,现在文件路径是$target_path
,之后对图片进行二次渲染。
二次渲染用到了imagecreatefromjpeg
函数,官方解释:由文件或 URL 创建一个新图象,返回一图像标识符,代表了从给定的文件名取得的图像(这时候图像对象还是一个空的)。然后判断是否是一个图片文件,如果不是的话执行unlink
函数删除文件,否则,为新图片随机一个名称,执行imagejpeg
函数把图象输出到新文件$newfilename
。再将之前用户上传的文件$target_path
删除掉。
根据上面的分析就能得出来两种思路:
- 访问二次渲染之前的上传的文件。
- 在图片二次渲染以后图片马未失效。
第一种方法
(Linux环境、php版本7.2.21)
因为二次渲染那部分if、else
无论如何都会执行unlink
函数删除你的文件,需要在执行imagecreatefromjpeg
时报错才能访问到自己原来上传的文件。
jpg格式
准备并上传
需要准备只含有一句话木马的文件并命名为.jpg格式。直接上传。
文件包含验证
上传以后我使用的在线靶场网页中题目部分直接消失了,这就说明函数执行过程中出错导致页面也没有正常返回。然后就可以使用inclue.php
文件包含访问刚刚上传的文件
其他格式
如图成功访问就是图片马上传成功了。但是这个方法我只有jpg
格式的文件上传成功了,另外两种格式的图片没有上传成功,这个我感觉需要了解imagecreatefromjpeg
、imagecreatefrompng
、imagecreatefromgif
,这三个函数的原理,让其报错即可。
第二种方法
(windows环境,php版本5.2.17)
这种方法是让图片码在经过二次渲染以后,能保证代码不会被二次渲染给过滤掉。从最简单的一个一个来。
用到的工具是Beyond Compare 4,是一个文件比较的工具,就是查看图片渲染修改的哪些部分,还可以查看文件的16进制格式。
GIF格式
准备并上传
上传一个使用copy /b
指令制作的图片马,之前文章第13题用过。假设上传的图片马为yoo.gif,上传成功以后再下载下载的文件名为2119840023.gif。
文件比较
使用前面说的Beyond Compare 4工具进行比较,左边是渲染前的文件,右边是渲染后的文件,图片中白色的地方就是两个文件相同的地方,红色部分则是文件不同的地方。看的出来图片文件的前面一大部分二次渲染的时候都没有改变,所以我们可以直接将代码放在这一部分逃过二次渲染。<?php phpinfo(); ?>
的十六进制是3C 3F 70 68 70 20 70 68 70 69 6E 66 6F 28 29 3B 20 3F 3E
直接粘贴插入,在右边框中右键保存文件再进行上传。
文件包含验证
上传以后进行文件包含,代码执行成功。
为了验证我们的想法,我们可以刚刚把上传的图片再下载下载,查看插入的代码是否逃过了二次渲染(废话执行成功了代码肯定在)。
png格式
这题自己原来打算模仿gif的方法修改图片,但是上传以后下载,对比文件十六进制不同的时候我傻了
这不同还是一段一段的,根本不可能模仿gif的方法,上面那一段相同的还是图片的头标识部分,修改的话就不是png格式图片,更过不了。
所以我直接看答案了,还是前言里的博客。png图片由3个以上的数据块组成,然后又分了图片基本信息、实际数据块、辅助数据块blablablabl,而且数据块中还有CRC码,学过计算机网络的都知道CRC码是验证错误的,自己随便插入代码以后不修改CRC码肯定是过不了的。
所以又出来了两种方法:
- 修改CRC码
- 直接生成图片
计算CRC码
计算CRC码的python
脚本
import binascii
import repng = open(r'1.png','rb')
a = png.read()
png.close()
hexstr = binascii.b2a_hex(a)''' PLTE crc '''
data = '504c5445'+ re.findall('504c5445(.*?)49444154',hexstr)[0]
crc = binascii.crc32(data[:-16].decode('hex')) & 0xffffffff
print hex(crc)
准备
php底层在对PLTE数据块验证的时候,主要进行了CRC校验.所以可以在该部分写入代码,再重新计算CRC码,再修改原来的CRC码即可。
计算CRC码
脚本会打开名为1.png的文件然后输出计算以后的CRC码结果。在把结果覆盖原来的CRC码上传图片就不会出错了。
这个方法我没有尝试,因为我不会python。都2020年了还有人不会python,不会吧不会吧。
Upload-Labs(16)相关推荐
- Upload labs
Pass -01(js检查) 题目基于前端js过滤,只能上传图片格式的文件,所以我们用一句话木马,改后缀上传后,用burp抓包,修改文件后缀为php,然后用蚁剑连接, 注意: 文件没有上传在具体题目中 ...
- upload -labs通关解析及上传类型总结和思考
Pass-01(客户端JS绕过) 客户端JS判断方法:上传一个php文件,用bp抓包,如果没抓到包就弹框说不能上传,就说明是客户端JS检测 客户端JS绕过方法: 方法一: 上传一个图片马格式为jpg, ...
- (白帽子学习笔记)前渗透——文件上传upload labs
读者需知 1.本文仅供学习使用,由于传播和利用此文所造成的损失均由使用者本人负责,文章作者不为此承担责任 2.本文参考了一些文章,如有侵权请联系本人删除 第一关--前端验证 1.将浏览器中的JS代码禁 ...
- Upload LABS Pass-11
第十一关在服务端使用了白名单 , 但文件保存路径外漏 , 可以使用00截断 准备一个 11.php 文件 , 内容为一句话木马 <?php eval($_POST[-7]);?> 上传 1 ...
- Upload LABS Pass-10
第十关在后端使用了黑名单 , 将匹配到的后缀名替换为空,使文件不能使用 , 但其只过滤了一遍 , 我们可以使用双写后缀名的方式绕过黑名单 准备一个 10.pphphp 文件 , 内容为一句话木马 &l ...
- Upload LABS Pass-9
第九关在后端使用了黑名单,并过滤了大小写,空格,点以及数据流 , 但未对文件重命名并且只过滤了一遍点和空格 , 我们在文件后缀名添加 点空格点 , 来绕过黑名单 准备一个 9.php 文件 , 内容为 ...
- Upload LABS Pass-8
第八关在后端使用了黑名单 , 并过滤了大小写,点以及空格 , 但并未过滤数据流 , 我们使用代理拦截请求,在文件后缀名中添加数据流,绕过黑名单 准备一个 8.php 文件 , 内容为一句话木马 < ...
- Upload LABS Pass-7
第七关在后端使用了黑名单 , 并过滤了大小写,空格 , 但未过滤点 , 我们使用代理拦截请求,将后缀名添加点. , 来绕过黑名单 准备一个 7.php 文件 , 内容为一句话木马 <?php e ...
- Upload LABS Pass-6
第六关在后端使用了黑名单 , 并过滤了大小写和点 , 但未过滤空格 , 我们使用代理抓包在后缀名中添加空格,即可绕过黑名单 准备一个 6.php 文件 , 内容为一句话木马 <?php eval ...
- Upload LABS Pass-5
第五关在后端使用了黑名单 , 并过滤了空格,点 , 但未过滤大小写 , 我们修改文件后缀大小写来绕过黑名单 准备一个 5.PHP 文件 , 内容为一句话木马 <?php eval($_POST[ ...
最新文章
- 机器学习中的聚类算法(2):Mean Shift算法
- Linux软件包命令
- java实验2词法分析程序设计
- C#实现Access导入导出Excel
- 【MapBox】5种地图(底图)样式自由切换附源码
- Github入门学习
- python编程快速上手第三章_Python编程快速上手 往让繁琐工作自动化-6.6 习题(示例代码)...
- python 分布式锁_Python分布式锁 Sherlock
- 【转】使用并口控制笔记本软驱中的电机
- QQ在线客服聊天功能
- NetCore3.1简单使用JWT
- 计算机id dns知识,DNS 事件 ID 4013 疑难解答 - Windows Server | Microsoft Docs
- 1000句英语经典口语 (1)
- mysql 按日期分组求和
- jupyter和spider;Anaconda、Python、Jupyter、Pycharm、Spyder、conda、pip
- 基于STM32F4单片机对步进电机的控制(有代码)
- 数据库配置口令复杂度策略和口令有效期策略
- RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR之主要功能模块及相关技术特点与性能指标分析
- 浪潮云海OS C位出道 融合开放基础设施呼之欲出
- 常见信息安全威胁与防范以及安全防御未来的发展趋势
热门文章
- 【AI视野·今日CV 计算机视觉论文速览 第206期】
- 【今日CS 视觉论文速览】3 Jan 2019
- win8.1除了应用界面的应用,其他系统程序都不能上网,包括IE
- this 关键字 java 1614781517
- 继承演练 动物 狗 哮天犬 c# 1613703354
- 字符缓冲流 读写数据
- html列表的三种形式 1128
- python-基本装饰器
- django-路由进阶-01
- Last_Errno: 1755 Last_Error: Cannot execute the current event group in the parallel mode错误解决