前言

​ 我在这道题上花了快一天的时间,但是也学到了不少姿势,觉得东西应该足够多,而且参考了的博客发现这道题算是有歧义的,不知道作者想要考察的点是哪一个,所以算是有两种解法吧,可惜的是两种方法都不算是大成功,只有部分成功执行了。

​ 参考博客: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删除掉。

​ 根据上面的分析就能得出来两种思路:

  1. 访问二次渲染之前的上传的文件。
  2. 在图片二次渲染以后图片马未失效。

第一种方法

​ (Linux环境、php版本7.2.21)

​ 因为二次渲染那部分if、else无论如何都会执行unlink函数删除你的文件,需要在执行imagecreatefromjpeg时报错才能访问到自己原来上传的文件。

jpg格式

准备并上传

​ 需要准备只含有一句话木马的文件并命名为.jpg格式。直接上传。

文件包含验证

​ 上传以后我使用的在线靶场网页中题目部分直接消失了,这就说明函数执行过程中出错导致页面也没有正常返回。然后就可以使用inclue.php文件包含访问刚刚上传的文件

其他格式

​ 如图成功访问就是图片马上传成功了。但是这个方法我只有jpg格式的文件上传成功了,另外两种格式的图片没有上传成功,这个我感觉需要了解imagecreatefromjpegimagecreatefrompngimagecreatefromgif,这三个函数的原理,让其报错即可。

第二种方法

​ (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码肯定是过不了的。

​ 所以又出来了两种方法:

  1. 修改CRC码
  2. 直接生成图片

计算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)相关推荐

  1. Upload labs

    Pass -01(js检查) 题目基于前端js过滤,只能上传图片格式的文件,所以我们用一句话木马,改后缀上传后,用burp抓包,修改文件后缀为php,然后用蚁剑连接, 注意: 文件没有上传在具体题目中 ...

  2. upload -labs通关解析及上传类型总结和思考

    Pass-01(客户端JS绕过) 客户端JS判断方法:上传一个php文件,用bp抓包,如果没抓到包就弹框说不能上传,就说明是客户端JS检测 客户端JS绕过方法: 方法一: 上传一个图片马格式为jpg, ...

  3. (白帽子学习笔记)前渗透——文件上传upload labs

    读者需知 1.本文仅供学习使用,由于传播和利用此文所造成的损失均由使用者本人负责,文章作者不为此承担责任 2.本文参考了一些文章,如有侵权请联系本人删除 第一关--前端验证 1.将浏览器中的JS代码禁 ...

  4. Upload LABS Pass-11

    第十一关在服务端使用了白名单 , 但文件保存路径外漏 , 可以使用00截断 准备一个 11.php 文件 , 内容为一句话木马 <?php eval($_POST[-7]);?> 上传 1 ...

  5. Upload LABS Pass-10

    第十关在后端使用了黑名单 , 将匹配到的后缀名替换为空,使文件不能使用 , 但其只过滤了一遍 , 我们可以使用双写后缀名的方式绕过黑名单 准备一个 10.pphphp 文件 , 内容为一句话木马 &l ...

  6. Upload LABS Pass-9

    第九关在后端使用了黑名单,并过滤了大小写,空格,点以及数据流 , 但未对文件重命名并且只过滤了一遍点和空格 , 我们在文件后缀名添加 点空格点 , 来绕过黑名单 准备一个 9.php 文件 , 内容为 ...

  7. Upload LABS Pass-8

    第八关在后端使用了黑名单 , 并过滤了大小写,点以及空格 , 但并未过滤数据流 , 我们使用代理拦截请求,在文件后缀名中添加数据流,绕过黑名单 准备一个 8.php 文件 , 内容为一句话木马 < ...

  8. Upload LABS Pass-7

    第七关在后端使用了黑名单 , 并过滤了大小写,空格 , 但未过滤点 , 我们使用代理拦截请求,将后缀名添加点. , 来绕过黑名单 准备一个 7.php 文件 , 内容为一句话木马 <?php e ...

  9. Upload LABS Pass-6

    第六关在后端使用了黑名单 , 并过滤了大小写和点 , 但未过滤空格 , 我们使用代理抓包在后缀名中添加空格,即可绕过黑名单 准备一个 6.php 文件 , 内容为一句话木马 <?php eval ...

  10. Upload LABS Pass-5

    第五关在后端使用了黑名单 , 并过滤了空格,点 , 但未过滤大小写 , 我们修改文件后缀大小写来绕过黑名单 准备一个 5.PHP 文件 , 内容为一句话木马 <?php eval($_POST[ ...

最新文章

  1. 机器学习中的聚类算法(2):Mean Shift算法
  2. Linux软件包命令
  3. java实验2词法分析程序设计
  4. C#实现Access导入导出Excel
  5. 【MapBox】5种地图(底图)样式自由切换附源码
  6. Github入门学习
  7. python编程快速上手第三章_Python编程快速上手 往让繁琐工作自动化-6.6 习题(示例代码)...
  8. python 分布式锁_Python分布式锁 Sherlock
  9. 【转】使用并口控制笔记本软驱中的电机
  10. QQ在线客服聊天功能
  11. NetCore3.1简单使用JWT
  12. 计算机id dns知识,DNS 事件 ID 4013 疑难解答 - Windows Server | Microsoft Docs
  13. 1000句英语经典口语 (1)
  14. mysql 按日期分组求和
  15. jupyter和spider;Anaconda、Python、Jupyter、Pycharm、Spyder、conda、pip
  16. 基于STM32F4单片机对步进电机的控制(有代码)
  17. 数据库配置口令复杂度策略和口令有效期策略
  18. RTSP安防网络摄像头/海康大华硬盘录像机网页无插件直播方案EasyNVR之主要功能模块及相关技术特点与性能指标分析
  19. 浪潮云海OS C位出道 融合开放基础设施呼之欲出
  20. 常见信息安全威胁与防范以及安全防御未来的发展趋势

热门文章

  1. 【AI视野·今日CV 计算机视觉论文速览 第206期】
  2. 【今日CS 视觉论文速览】3 Jan 2019
  3. win8.1除了应用界面的应用,其他系统程序都不能上网,包括IE
  4. this 关键字 java 1614781517
  5. 继承演练 动物 狗 哮天犬 c# 1613703354
  6. 字符缓冲流 读写数据
  7. html列表的三种形式 1128
  8. python-基本装饰器
  9. django-路由进阶-01
  10. Last_Errno: 1755 Last_Error: Cannot execute the current event group in the parallel mode错误解决