我的WafBypass之道(upload篇)
0x00 前言
玩waf当然也要讲究循序渐进,姊妹篇就写文件上传好了,感觉也就SQLi和Xss的WafBypass最体现发散性思维的,而文件上传、免杀、权限提升这几点的Bypass更需要的是实战的经验。本文内容为沉淀下来的总结以及一些经典案例。想到哪写到哪,所以可能不是很全。创造姿势不易,且行且珍惜。(案例图不好上,毕竟是upload的Bypass,就直接上姿势)
阅读此文你会发现新老姿势都有,因为我是想系统的写一写,文件上无非就是结合各种特性或waf缺陷。辍写时想过一个问题,如何归拢哪些属于文件上传Bypass的范畴?打个比方:
- 上传正常.jpg的图片 #成功
- 上传正常.php #拦截
- 绕过.php文件的filename后进行上传 #成功
- 使用绕过了filename的姿势上传恶意.php #拦截
以上这么个逻辑通常来讲是waf检测到了正文的恶意内容。再继续写的话就属于免杀的范畴了,过于模糊并且跑题了,并不是真正意义上的文件上传Bypass,那是写不完的。
0x01 搞起
上传文件(歪脖骚)时waf会检查哪里?
- 请求的url
- Boundary边界
- MIME类型
- 文件扩展名
- 文件内容
常见扩展名黑名单:
- asp|asa|cer|cdx|aspx|ashx|ascx|asax
- php|php2|php3|php4|php5|asis|htaccess
- htm|html|shtml|pwml|phtml|phtm|js|jsp
- vbs|asis|sh|reg|cgi|exe|dll|com|bat|pl|cfc|cfm|ini
个人写的“稍微”全一点,实际上waf的黑名单就不一定这么全了。
测试时的准备工作:
- 什么语言?什么容器?什么系统?都什么版本?
- 上传文件都可以上传什么格式的文件?还是允许上传任意类型?
- 上传的文件会不会被重命名或者二次渲染?
0x02 容器特性
有些很老的特性其实也是最开始绕waf的基础,这里就一笔带过了。
- Apache1.X 2.X解析漏洞:
Apache在以上版本中,解析文件名的方式是从后向前识别扩展名,直到遇见Apache可识别的扩展名为止。
Win2k3 + APACHE2.0.59 + PHP

IIS6.0两个解析缺陷:
目录名包含.asp、.asa、.cer的话,则该目录下的所有文件都将按照asp解析。例如:

文件名中如果包含.asp;、.asa;、.cer;则优先使用asp解析。例如:

有一点需要注意,如果程序会将上传的图片进行重命名的话就gg了。
Nginx解析漏洞:
- Nginx 0.5.*
- Nginx 0.6.*
- Nginx 0.7 <= 0.7.65
- Nginx 0.8 <= 0.8.37
以上Nginx容器的版本下,上传一个在waf白名单之内扩展名的文件shell.jpg,然后以shell.jpg.php进行请求。
- Nginx 0.8.41 – 1.5.6:
以上Nginx容器的版本下,上传一个在waf白名单之内扩展名的文件shell.jpg,然后以shell.jpg%20.php进行请求。
PHP CGI解析漏洞
- IIS 7.0/7.5
- Nginx < 0.8.3
以上的容器版本中默认php配置文件cgi.fix_pathinfo=1时,上传一个存在于白名单的扩展名文件shell.jpg,在请求时以shell.jpg/shell.php请求,会将shell.jpg以php来解析。
多个Content-Disposition:
在IIS的环境下,上传文件时如果存在多个Content-Disposition的话,IIS会取第一个Content-Disposition中的值作为接收参数,而如果waf只是取最后一个的话便会被绕过。
Win2k8 + IIS7.0 + PHP

请求正文格式问题:
- Content-Disposition: form-data; name="file1"; filename="shell.asp"
- Content-Type: application/octet-stream
正常的upload请求都是以上这样,然而这个格式也并非强制性的,在IIS6.0下如果我们换一种书写方式,把filename放在其他地方:
Win2k3 + IIS6.0 + ASP

结合.htaccess指定某些文件使用php来解析:
这个方法通常用于绕过waf黑名单的,配置该目录下所有文件都将其使用php来解析:
0x03 系统特性
Windows特殊字符:
当我们上传一个文件的filename为shell.php{%80-%99}时:

waf可能识别为.php{%80-%99},就会导致被绕过。
Win2k8 + IIS7.0 + PHP

exee扩展名:
上传.exe文件通常会被waf拦截,如果使用各种特性无用的话,那么可以把扩展名改为.exee再进行上传。
NTFS ADS特性:
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。

Windows在创建文件时,在文件名末尾不管加多少点都会自动去除,那么上传时filename可以这么写shell.php......也可以这么写shell.php::$DATA.......。
Win2k8 + IIS7.0 + PHP

0x04 waf缺陷
匹配过于严谨:
一个空格导致安全狗被绕过:
Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
尝试在boundary后面加个空格或者其他可被正常处理的字符:
boundary =---------------------------4714631421141173021852555099
Win2k3 + IIS6.0 + ASP

以上也能说明一个问题,安全狗在上传文件时匹配各个参数都十分严谨,不过IIS6.0以上也变的严谨了,再看看其他的地方:
每次文件上传时的Boundary边界都是一致的
Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099
Content-Length: 253-----------------------------4714631421141173021852555099
Content-Disposition: form-data; name="file1"; filename="shell.asp"
Content-Type: application/octet-stream<%eval request("a")%>
-----------------------------4714631421141173021852555099--
但如果容器在处理的过程中并没有严格要求一致的话可能会导致一个问题,两段Boundary不一致使得waf认为这段数据是无意义的,可是容器并没有那么严谨:
Win2k3 + IIS6.0 + ASP

修改Content-Type的MIME类型:
Win2k3 + IIS6.0 + ASP

ASCII > 127的字符:

数据过长导致的绕过:
waf如果对Content-Disposition长度处理的不够好的话可能会导致绕过,例如:
Win2k3 + IIS6.0 + ASP

基于文件名:基于构造长文件名

如果web程序会将filename除了扩展名的那段重命名的话,那么还可以构造更多的点、符号等等。

特殊的长文件名:
文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性进行测试:
shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg
0x05 End
文件上传Bypass可写的点不多,现有的姿势也不能拿出来讲(笑)重点在于上传文件时遇到waf能够准确判断所拦截的点,目光不能只盯在waf,更多的时注意后端的情况。往往是需要结合哪些语言/容器/系统*版本“可以怎样”、“不可以怎样”。
我的WafBypass之道(upload篇)的更多相关文章
- [转载]我的WafBypass之道(upload篇)
现在位置: 首页 > 文章 > Web安全 > 正文 我的WafBypass之道(upload篇) 2016 /11/30 15:20 4,901 沙发 0x00 前言 玩waf当然 ...
- 我的WafBypass之道(Misc篇)
先知技术社区独家发表本文,如需要转载,请先联系先知技术社区授权:未经授权请勿转载.先知技术社区投稿邮箱:Aliyun_xianzhi#service.alibaba.com: Author:Tr3je ...
- [转载] 我的WafBypass之道(SQL注入篇)
我的WafBypass之道(SQL注入篇) Web安全 作者:先知技术社区 2016-11-23 7,566 [本文转自安全脉搏战略合作伙伴先知技术社区 原帖地址 安全脉搏编辑huan97 ...
- 我的WafBypass之道
0x00 前言 去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常谈的话题也没什么可写的.很多人一遇到waf就发懵,不知如何是好,能搜到的各种姿势也是然并卵.但是积累姿势的过程也 ...
- Web for pentester_writeup之File Upload篇
Web for pentester_writeup之File Upload篇 File Upload(文件上传) Example 1 直接上传一句话木马,使用蚁剑连接 成功连接,获取网站根目录 Exa ...
- 我的WafBypass之道(SQL注入篇)
原帖地址:https://xianzhi.aliyun.com/forum/read/349.html 0x00 前言 去年到现在就一直有人希望我出一篇关于waf绕过的文章,我觉得这种老生常 谈的话题 ...
- 32.我的wafBypass之道
0x01 搞起 当我们遇到一个waf时,要确定是什么类型的?先来看看主流的这些waf,狗.盾.神. 锁.宝.卫士等等...(在测试时不要只在官网测试,因为存在版本差异导致规则库并不一致) 1.云waf ...
- ELK修炼之道
看了ELK大半年了,现在就慢慢的总结一下对ELK的理解 参考资料 ELK stack中文指南 Elasticsearch权威指南 官方文档 Elasticsearch基础篇 此篇用于介绍Elastic ...
- 高并发高负载系统架构-php篇
首先呢,我罗列一下文章的目录,让大家有个整体轮廓的了解! 1.为什么要进行高并发和高负载的研究 2.高并发和高负载的约束条件 3.解决之道——硬件篇 4.解决之道——部署篇 5.解决之道——环境篇 6 ...
随机推荐
- 用DirectX实现多视图渲染
什么是多视图 一般的3D程序都只有一个视图,对应整个窗口的客户区.多视图就是在一个窗口中放置多个视图,以便从不同的角度观察模型或者场景.很多图形软件都有这个功能,比如大家熟知的3DMax就有四个视图, ...
- SpringBoot注解大全(转)
原文链接:[springBoot系列]--springBoot注解大全 一.注解(annotations)列表 @SpringBootApplication:包含了@ComponentScan.@Co ...
- 前端后台以及游戏中使用Google Protocol Buffer详解
前端后台以及游戏中使用Google Protocol Buffer详解 0.什么是protoBuf protoBuf是一种灵活高效的独立于语言平台的结构化数据表示方法,与XML相比,protoBuf更 ...
- [Python设计模式] 第14章 老板来了——观察者模式
github地址:https://github.com/cheesezh/python_design_patterns 题目 用程序模拟以下情景,在一个办公室里,当老板进门的时候,前台秘书就偷偷通知办 ...
- vs visual stdio 调试 显示指针为数组
假如有这样一个指针 int * idx16 那么要想在调试里面显示为数组并且要显示的数组元素个数为24的话,则要写成idx16,24 如下图
- MySQL技术内幕读书笔记(一)——Mysql体系结构和存储引擎
目录 MySQL体系结构和存储引擎 定义数据库和实例 MYSQL体系结构 MYSQL存储引擎 MySQL体系结构和存储引擎 定义数据库和实例 数据库:物理操作系统文件或者其他形式文件类型的结合.在MY ...
- Python之Simple FTP (一)
一.引言: 好久之前想写一个ftpserver的小daemon,但是一直拖着就没有写,这回正好处于放假的时候可以有时间来写写. 二.FTP需求功能: 1.用户认证系统 2.文件上传和下载功能 a.支持 ...
- linux 设备驱动概述
linux 设备驱动概述 目前,Linux软件工程师大致可分为两个层次: (1)Linux应用软件工程师(Application Software Engineer): 主要利用C库函数和 ...
- pandas.Dataframe复杂条件过滤
https://stackoverflow.com/questions/11418192/pandas-complex-filter-on-rows-of-dataframe mask = df.ap ...
- Atitit 支出分类表 会计科目(1)资产(2)负债(3)资本(4)收益(5)费用(成本) 资产分类表 attilax总结
Atitit 支出分类表 会计科目(1)资产(2)负债(3)资本(4)收益(5)费用(成本) 资产分类表 attilax总结 会计科目对一般不懂会计的管理人员,常会有莫测高深的感觉,因此不仅不愿去 ...