背景介绍

一次普通的 WEB 测试过程,遇到了一个上传点,可以上传固定图片格式但是可以任意名字+任意后缀名的文件。

一个比较好玩的 webshell 上传检测的绕过

环境

 IIS 7.5/ ASP.NET – Windos SERVER 2008 R2

过程

0×1 测试

看起来怼这个好像没有任何技术含量,直接扔图片马就是了。

一个比较好玩的 webshell 上传检测的绕过

但是呢,一般的图片马是不行的,回顾一下我们经常用也是流传最广的做图片马的方式。

1: 直接在 shell 头加 gif89a

2: 使用 Copy 大法 

3: 没了

相信大多数人都是用的都是以上的几种方式,平常来说图片马不能用都是直接放弃的这个点的。

那么这里介绍另外一种,拓展信息插一句话。

先说说上传点的检测机制:程序采用 GDI+ 插件将用户上传的图片处理后保存。

一个比较好玩的 webshell 上传检测的绕过

作者的脑子很简单,当然这个思路也没什么错,毕竟只要是正常的图片文件没必要拦截。

而作者写的这个程序也的确很牛逼,copy 大法是完全失效的。

经过 copy 的图片马在程序过滤后都被剔除干净了。

一个比较好玩的 webshell 上传检测的绕过

一个比较好玩的 webshell 上传检测的绕过

可以看到用 Copy 打发做出来的被过滤的啥也不剩了,尝试了各种混合模式都不行。

所以看起来理论上这玩意能拦截除了图片本身的信息之外的任何额外附加信息。

0×2 绕过

但是呢, 程序作者好像漏了什么,图片本身的信息也是大有作为的。

前面提到的拓展信息插一句话,右键属性然后添加就行。

一个比较好玩的 webshell 上传检测的绕过

而这种手段,基本上四肢健全不需要像我一样定期去看兽医的一看就会,不需要写代码也不需要额外的工具。

一个比较好玩的 webshell 上传检测的绕过

用 BurpSuite 怼上去。

一个比较好玩的 webshell 上传检测的绕过

一个比较好玩的 webshell 上传检测的绕过

总结:

不要相信用户输入的任何信息,也不要对自己的编码水平有太高的期望。

在本次案例中,首先是未对上传文件的名称做任何校验就写入硬盘这明显是不可取的。

其次就是对 GDI+ 插件的过分信任,并没有对扩展信息内容做校验便立即放行了。

更加厉害的是,通过查询服务器进程发现,服务器是裸奔状态。

*本文作者:a.tm.k