绕过PHP图片上传转换实现远程代码执行(RCE)危险

我使用了一个特殊的图片上传技巧,绕过PHP GD库对图片的转换处理,最终成功实现了远程代码执行。

事情是这样的。当时我正在测试该网站上是否存在sql注入漏洞,不经意间我在网站个人页面发现了一个用于上传头像的文件上传表单。开始时我并没指望在上传功能处发现漏洞,但我决定试试。

我上传了一个图片文件,通过截断http数据包,修改jpg图片的文件名后缀为php,然后继续上传。我惊讶的居然上传成功了,我几乎不敢相信这么简单的漏洞居然存在。于是我复制了图片url并且在浏览器上打开。进入我眼帘的是图片的二进制代码,这意味着图片以php解析了,并根据响应包里的 content-type以text/html格式返回。

我现在要做的是在jpg文件中注入php代码以进行远程代码执行,于是我尝试将代码写入图片的EXIF头里,但是悲剧的是再次上传发现php代码没有被执行。

在本机进行了测试,结果仍然无效——代码没有被执行

在上传到服务器后,EXIF里的代码都被删除了,应用通过imagecreatefromjpeg()函数调用了PHP GD库(GD库,是php处理图形的扩展库),对图片进行了转换。那么如果不将代码注入EXIF头而是注入到图片里呢?

本机测试通过,但当我上传“1.jpg”到服务器上,返回以下结果:

报错上写着“文件必须是合法的图片(.gif, .jpg, .jpeg, 或.png)”,我惊叹于应用是怎么判断图片不合法的。我又测试了一些其他jpg文件,结果发现修改任何一个图片字符都会引起php-gd库的错误判断,进而造成上传失败。

接下来我又使用gif图片进行了同样的操作,结果是:图片上传成功了,但是图片中的php代码完全被删除了。

虽然这看起来不可思议,但是我不能放弃,因为现在距离成功利用远程代码执行(RCE)只有一步之遥,我必须绕过imagecreatefromgif()函数。我对图片的处理和php GD库的运行知之甚少,可是这不影响我使用一些传统渗透测试方法。

我想到一个方法:对比两张经过php-gd库转换过的gif图片,如果其中存在相同之处,这就证明这部分图片数据不会经过转换。然后我可以注入代码到这部分图片文件中,最终实现远程代码执行。连我自己都佩服我的机智!

如图,我用十六进制编辑器打开图片文件,找到了php转换前后仍然保持相同的十六进制串“3b45d00ceade0c1a3f0e18aff1”并修改它为。

保存图片,上传到服务器:

我的PHP代码被执行了,我最终成功实现了远程代码执行。

时间: 2024-12-27 13:45:35

绕过PHP图片上传转换实现远程代码执行(RCE)危险的相关文章

Android中使用七牛云存储进行图片上传下载的实例代码

Android开发中的图片存储本来就是比较耗时耗地的事情,而使用第三方的七牛云,便可以很好的解决这些后顾之忧,最近我也是在学习七牛的SDK,将使用过程在这记录下来,方便以后使用. 先说一下七牛云的存储原理,上面这幅图片是官方给出的原理图,表述当然比较清晰了. 可以看出,要进行图片上传的话可以分为五大步: 1. 客户端用户登录到APP的账号系统里面: 2. 客户端上传文件之前,需要向业务服务器申请七牛的上传凭证,这个凭证由业务服务器使用七牛提供的服务端SDK生成: 3. 客户端使用七牛提供的客户端

ie8本地图片上传预览示例代码

 ie8本地图片上传预览出现问题是因为限制浏览器造访本地文件,所以用到滤镜和div,下面有个不错的示例,希望对大家有所帮助 代码如下: imgpath= getRealPath(fileId):    document.getElementById("divSBTP").style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled ='true',sizingMethod='scale',sr

jquery 图片上传预览插件代码

<!doctype html public "-//w3c//dtd xhtml 1.0 transitional//en" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-

ie8本地图片上传预览示例代码_javascript技巧

复制代码 代码如下: imgpath= getRealPath(fileId): document.getElementById("divSBTP").style.filter="progid:DXImageTransform.Microsoft.AlphaImageLoader(enabled='true',sizingMethod='scale',src=\""+ imgpath + "\")";//使用滤镜效果 func

KindEditor图片上传的Asp.net代码实例_实用技巧

复制代码 代码如下: using System;using System.Globalization;using System.Collections;using System.Configuration;using System.Data;using System.Web;using System.Web.Security;using System.Web.UI;using System.Web.UI.HtmlControls;using System.Web.UI.WebControls;u

js 本地图片上传预览实现代码

//IE 浏览器下  代码如下 复制代码 document.getElementById("upload").onchange = function() {      document.getElementById("image").src = this.value; } //FF下有getAsDataURL的方法可以生成图片的DataURL  代码如下 复制代码 document.getElementById("upload").onchang

php 图片上传并生成缩略图代码

 if($_FILES['image']['size']){      if($_FILES['image']['type'] == "image/pjpeg"){       $im = @imagecreatefromjpeg($_FILES['image']['tmp_name']);       $n_bmp.='.jpg';      }elseif($_FILES['image']['type'] == "image/x-png"){       $im

jquery+php+ajax显示上传进度的多图片上传并生成缩略图代码_php技巧

本例用到其他2个php class.upload.php和 functions.php还有css和js以及img文件 完整实例代码点击此处本站下载. 效果图如下: 实现代码如下: JavaScript代码如下: 复制代码 代码如下: <script type="text/javascript">  $(document).ready(function() {      $("#filelist").niceScroll({          cursor

PHP实现多图片上传类实例

  这篇文章主要介绍了PHP实现多图片上传类实例,该类文件注释详细功能实用且具有一定的扩展性,需要的朋友可以参考下 本文所述为一个实用的PHP多图片文件上传类,其支持gif.jpg.jpeg.pjpeg.png格式的多图片上传功能,类中还可限制图片类型.上传图片的大小.设置上传目录.一些提交判断等功能.此外该类并不局限于图片的上传,也可以上传TXT/RAR等文件类型,只是需要对代码进行一下修改,感兴趣的读者可以自己尝试一下. php多图片上传类完整功能代码如下: class more_file_