挖洞姿势:特殊的上传技巧,绕过PHP图片转换实现远程代码执行(RCE)

2014-12-12 +20 648374人围观 ,发现 62 个不明物体 WEB安全

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

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

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

我现在要做的是在jpg文件中注入php代码以进行远程代码执行,于是我尝试将代码<? phpinfo(); ?>写入图片的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”并修改它为<?phpinfo()?>。

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

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

POC图片下载地址:

POC.rar 密码freebuf

[参考信息来源:http://www.secgeek.net/bookfresh-vulnerability/,]

这些评论亮了

  • cnseay 回复
    哎呀,第一次看到这么高档能与P7相提并论的技术,作者一定是94年的!
    )84( 亮了
  • phper 回复
    PHP是世界上最好的语言
    )30( 亮了
  • 父亲 (4级) 回复
    @ 阿不思  起初这个94在安全宝,安全宝刚开始由kaifuli投资,后来他没投资了,马洁就去找投资,刚开始也找到了投资人,再后来钱烧的差不多了,安全宝从alibaba挖走了刺,后alibaba看百度腾讯都有安全产品了,惟独我没有,合计着收购家安全公司,安全宝本身经营就不温不火,也想找个大树,alibaba有意收购,交易就达成了,收购合同里标注的有收购后安全宝员工变成alibaba员工,与是这个94后就变成了alibaba员工,由于这个94后在安全宝就是带团队的,去了alibaba后自然也是带团队,因为是lider,又因为alibaba有评级制度,结合收购关系+lider提成+技术,ali就给这个94评了个p7,因为alibaba很多老员工都没评到这个级别新员工又是94后还是p7,结果导致一部分人不满,然后就有了各种马甲,和94的传说。。 这些都是我猜的
    )24( 亮了
  • 云舒 回复
    能不要扯JB蛋么?
    我们内部好好儿的,一点问题没有。
    有问题的是外面一些瞎BB的人。
    如果觉得自己技术好,发简历给我。
    P多少都行啊。
    )15( 亮了
  • 回复
    @ cnseay 目测你不是那个高中没毕业就去安全宝的 注意啊 94年怎么了04年的更牛比 84年的技术沉淀更多.......老实点吧
    )14( 亮了
发表评论

已有 62 条评论

取消
Loading...
css.php