血淋林的例子告诉你,为什么防“上传漏洞”要用白名单
一般来说,当你在写文件上传功能的代码时,你都需要使用”白名单”或“黑名单”来检查并限制用户上传文件的扩展名。
当我阅读了@Idionmarcil的【这篇文章】之后,我决定要深入了解一下当前热门的Web服务器是如何处理各种类型的扩展名的。
首先,我需要知道Web服务器在处理不同文件类型时所返回的content-type内容。一般来说,开发者只会在黑名单中添加某些“臭名昭著”的扩展名。但是在这篇文章中,我要分析的对象将是一些使用没那么广泛的文件类型。
在本文中,用于演示的PoC Payload如下:
1. 基础XSS Payload:
2. 基于XML的XSS Payload:
下面,我将给大家介绍我的研究成果。
ISS Web服务器
默认配置下,ISS针对文件类型所返回的content-type为text/html,具体请看下面的列表:
扩展名的基本向量:
.cer
.hxt
.htm
因此,我们就可以将基础XSS向量复制到上传文件中,当我们打开文档之后,浏览器中便会弹出一个对话框。对于下面的列表中所包含的扩展名,IIS服务器所响应的content-type将允许我们通过基于XML的攻击向量来执行XSS攻击:
.dtd
.mno
.vml
.xsl
.xht
.svg
.xml
.xsd
.xsf
.svgz
.xslt
.wsdl
.xhtml
默认配置下,IIS还会支持SSI,但是处于安全方面的考虑,Payload的执行可能会被禁止。
针对SSI的扩展:
.stm
.shtm
.shtml
如果你想了解更多关于SSI的详细信息,请参考@ldionmarcil的【这篇文章】。
除此之外,这里还有另外两个有趣的扩展名(.asmx和 .soap)同样能够允许我们实现任意代码执行,而这两个扩展名是Yury Aleinov发现的,感兴趣的同学可以访问@YuryAleinov的Twitter以获取更多信息。
asmx后缀
1. 如果你可以上传后缀名为.asmx的文件,那你也许就可以通过它来实现任意代码执行。比如说,我们来看看下面这个文件的内容:
2. 接下来,我们向上传的文档发送POST请求:
3. 大家可以看到,结果就是我们成功让IIS运行了“calc.exe”。
soap后缀
使用后缀.soap上传的文件内容如下:
SOAP请求:
Apache(httpd或Tomcat)
基础向量后缀:
.shtml
.html.de或.html.xxx (xxx 为任意字符)*
基于XML向量的后缀:
.rdf
.xht
.xml
.xsl
.svg
.xhtml
.svgz
如果“.html.”后面跟有任意字符的话,Apache的响应信息中content-type为text/html。
需要注意的是,在处理很多不同类型的文件后缀时,Apache所返回的响应信息中可能会不包含Content-type头,而这将有可能导致XSS攻击的发生。因为浏览器在处理这种页面时,不同浏览器的处理方法是不同的。比如说,Firefox对后缀为.xbl和.xml的文件所采用的处理方法非常类似,而这类响应中是不包含Content-type头的,所以我们就可以利用基于XML的攻击向量来对目标浏览器发动XSS攻击了。
Nginx
基础向量后缀:
.htm
基于XML的向量后缀:
.svg
.xml
.svgz
总结
本文对当前热门Web服务器处理各种文件后缀的方法进行了简单分析,如果你还想了解更多关于“利用文件后缀和Content-Type来发动XSS攻击”的详细内容,请参考原文链接。
- 总结---3
- Mac系统实现git命令自动补全
- [大数据之Yarn]——资源调度浅学
- Mac系统的终端显示git当前分支
- 不掌握这几个人工智能编程语言怎么能说懂AI
- Gulp实现css、js、图片的压缩以及css、js文件的MD5命名
- 大数据之Yarn——Capacity调度器概念以及配置
- 移动端web开发,click touch tap区别
- 大数据学习之路(持续更新中...)
- 如何养成良好的c++编程习惯(1)——内存管理
- 使用jOrgChart插件实现组织架构图的展示
- Spark源码分析 之 Driver和Excutor是怎么跑起来的?(2.2.0版本)
- webpack入门——webpack的安装与使用
- Portal-Basic Java Web应用开发框架V3.0正式发布(源码、实例及文档)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【实用】教你识别下载“全家桶”
- 【iOS】修改checkra1n+chimera环境(chimera1n)
- 在 istio 中限制 namespace 访问外部资源
- 【iOS】浅析近期越狱工具+“平刷”工具
- XGBoost Operator源码分析
- 【杂货】制作checkra1n启动盘思路
- 【iOS】chimera13指日可待,libhooker基板独立啦
- 类加载器之URLClassLoader
- 【iOS】较全的合并flex补丁教程
- R语言如何解决线性混合模型中畸形拟合(Singular fit)的问题
- spring代理对象都是代理对象吗
- R语言Markowitz马克维茨投资组合理论分析和可视化
- 支付业务优化else if 代码
- 在UBUNTU虚拟机上安装R软件包
- R语言逻辑回归和泊松回归模型对发生交通事故概率建模