一个非常详细测试上传的姿势

【情况】
上传点界面:


这个上传点只有一个界面,且上传后会自动删除。成功突破会返回一串秘钥。

上传点抓包界面如下:

上传一个普通图片,返回路径upload/20160226222154_920.jpg

可以看到,整个上传包没有任何多余的参数。除了文件头+本地文件名+图片内容+按钮
就没别的东西了。

发现会自动重命名,然后下面就是想办法搞清楚它的上传验证机制,通过以下动作探测。

1.验证允许上传的文件后缀类型。
1-1.上传.jpg,成功上传并返回路径。
【得知】
上传文件被重命名

1-2.上传.gif,成功上传但是返回的是.jpg
1-2-1为了验证是否支持.gif,所以把文件头和文件类型都改为gif的,仍然返回后缀为jpg。
【得知】
除白名单以外的后缀类型(不识别的后缀类型),均提交为jpg后缀上传。

1-3.上传.php后缀则失败。
1-3-1.上传.php1或1php或pHp或1phP1同样失败。
1-3-2.考虑用冷格式代替脚本,故上传.cdx和.htr 上传成功但是返回后缀为jpg。
【得知】
匹配到后缀中含有php则上传失败,并且会转为小写。

1-4.把上传类型image/gif修改为php的application/octet-stream 上传.php上传失败,上传.jpg同样失败。
【得知】
验证了上传类型

1-5.上传x.php.jpg返回后缀为jpg。
【得知】
上传文件是从右边匹配的,反之应该上传失败的。

1-6 为了测试截断的支持情况。故;
1-6-1.上传x.jpg□.php返回正常jpg路径。
1-6-2.上传x.php□.jpg则上传失败。
【得知】
1-6-2上传失败说明被成功截断了。至于上传失败的原因在于1-3

1-7.上传x.php.返回jpg后缀。
【得知】
.作为特殊符号,不在后缀匹配范围内。所以.php.可以上传成功。是因为把.作为后缀的一部分,所以上传按照1-2的原则来上传。

1-8.上传x.j正常返回。上传x.正常返回。上传x正常返回。上传.正常返回。
.上传成功

通过以上分析得出此上传点;
1.支持截断,但是没什么卵用。因为截断后的x.php不给上传。
2.只要匹配到后缀有php,则上传失败。不识别的脚本格式均作为jpg上传。

附上传失败的截图:

了解了他的上传机制以后基本上就没有思路了,主要是无处下手。别说path改路径之类的了,就连一个多余的参数都没有。除了文件头+本地文件名+文件内容+按钮。再也没有多出一样东西。

然后想着既然确定了验证上传文件类型,那我们在添加个php的类型。
1.添加好以后是两个上传类型并存,我们先试试jpg能不能正常上传。测试定义两种类型对上传的影响。

可以看到,左边是image/gif(只要是图片类型都可以) 右边是php的类型application/octet-stream
可以正常上传。

接着上传php,如下图:

上传失败。
如果把文件类型定义为application/octet-stream 那么上传任何后缀都是失败的,但是gif和jpg的就可以。还是说明1.验证上传类型为图片 2.后缀验证。

虽然搞清了上传验证规则,但是没卵用。还是突破不了,非常遗憾。直到两天后,看到答案以后。整个人脑子都不好使了。

【突破方法】
将multipart/form-data的大小写改下就可以绕过了

参考资料:http://www.wooyun.org/bugs/wooyun-2015-0125982 这是逐浪CMS爆出的一个漏洞。

我看到突破方法以后很失望。首先是这种情况极少,对实际渗透的意义不大。再者就是也没有给出分析过程和原理。
这样我唯一的收获就是:遇到类似验证的上传点可以改下文件类型大小写试试。

又看了一下乌云给出的上传代码。

大概能看出来原理了。唉,还是有点失望。不过对以后突破上传还是有帮助的。

时间: 2024-08-24 19:45:59

一个非常详细测试上传的姿势的相关文章

dropzonejs中文翻译手册 DropzoneJS是一个提供文件拖拽上传并且提供图片预览的开源类库.

http://wxb.github.io/dropzonejs.com.zh-CN/dropzonezh-CN/ 由于项目需要,完成一个web的图片拖拽上传,也就顺便学习和了解了一下前端的比较新的技术:HTML5的api,作为一名前端的菜鸟,没什么可说的,直接分享自己学习的资料: 关于HTML5 的这些新的特性大家可以到Mozilla的开发者社区MDN https://developer.mozilla.org/zh-CN/ 上查HTML5的资料 还有就是发掘到的比较牛逼的一篇博客:http:/

基于Java的一个简单的文件上传下载功能

最近在公司给客户端做接口,有一个图片上传和文件下载的功能,本来想用Struts来做文件上传下载,但是看了下公司好像没有这个配置,然后看了下同事的代码,才发现原来Apache也可以简单的实现文件上传下载. 首先引入commons-io-2.2.jar FileUtils为我们提供了很多对文件的操作的方法,比如上传整个文件夹的文件.上传单个文件等 然后请看代码下载: public static void uploadFile(String targetDirectory,String targetF

Fiddler小技巧-测试上传文件接口&多参数并传情况

写了多年的API了,fidder还真是方便至极相对于postman来说. 两种常用方式: 抓包:app通过代理方式,就可以在pc端看到fidder的请求了 因为会监控好多跟我们需要的没关系的HTTP请求, 就要开启过滤了 主动调试API&上传文件参数&其它参数 拷贝点击"upload file"上传之后自动生成的body然后修改: ---------------------------acebdf13572468 Content-Disposition: form-da

测试上传附件

测试上传附件 http://images2015.cnblogs.com/blog/332907/201608/332907-20160828221233845-1455710267.jpg

jfinal初接触,一个简单的文件上传例子

写了个上传的小例子. 从jfinal官网下载jfinal-1.8_demo_for_jsp.zip 然后下载jfinal-1.8-lib.zip 按要求删掉该删除的,引入一些包,之后的项目结构: DemoConfig.java中配置路由,只留下了根路径: /** * 配置路由 */ public void configRoute(Routes me) { me.add("/", CommonController.class); //me.add("/blog", B

PHP安装FastDFS扩展,测试上传文件

PHP安装FastDFS扩展,测试上传文件 PHP所在服务器需先安装FastDFS.FastDFS安装方法如上,无需启动服务. 安装FastDFS扩展 # cd /usr/local/FastDFS/php_client/ # ls /opt/lampp/bin/phpize /opt/lampp/bin/phpize # /opt/lampp/bin/phpize Configuring for: PHP Api Version:         20121113 Zend Module Ap

文件上传插件 plupload ,上传一个,删除之前上传,才能继续上传

var uploader = new plupload.Uploader({ runtimes: 'html5,flash,silverlight,html4',//用来指定上传方式,指定多个上传方式请使用逗号隔开. browse_button: 'browse',//触发文件选择对话框的按钮,为那个元素id container: container, //用来指定Plupload所创建的html结构的父容器,默认为前面指定的browse_button的父元素.该参数的值可以是一个元素的id,也

DOS批处理器移动指定数量文件到一个临时文件夹,上传到linux服务器,并删除临时文件夹下的文件

DOS批处理器移动指定数量文件到一个临时文件夹,上传到linux服务器,并删除临时文件夹下的文件,上传需要依赖pscp.exe. 脚本如下: @echo off&setlocal enabledelayedexpansion #将400个xml文件从M:\dockerEPG\目录下移动到M:\scpepg\tmp\目录下 for /f "delims=" %%i in ('dir/a-d/b/s "M:\dockerEPG\*.xml"') do (set

SWFUpload一个强大的文件上传神器(学习二)实战

1.引入swfupload.js <script type="text/javascript" src="/assets/ueditor/third-party/swfupload/swfupload.js"></script> 2.实例化swfupload对象,并传入参数配置对象 封装image.load.js var ImageUpload = { swfUpload: function (btn, addr) { var $btn =