[转载]我的WafBypass之道(upload篇)

现在位置: 首页 > 文章 > Web安全 > 正文

我的WafBypass之道(upload篇)

2016 /11/30 15:20
4,901
沙发

0x00 前言

玩waf当然也要讲究循序渐进,姊妹篇就写文件上传好了,感觉也就SQLi和Xss的WafBypass最体现发散性思维的,而文件上传、免杀、权限提升这几点的Bypass更需要的是实战的经验。本文内容为沉淀下来的总结以及一些经典案例。想到哪写到哪,所以可能不是很全。创造姿势不易,且行且珍惜。(案例图不好上,毕竟是upload的Bypass,就直接上姿势)

阅读此文你会发现新老姿势都有,因为我是想系统的写一写,文件上无非就是结合各种特性或waf缺陷。辍写时想过一个问题,如何归拢哪些属于文件上传Bypass的范畴?打个比方:

  1. 上传正常.jpg的图片 #成功
  2. 上传正常.php #拦截
  3. 绕过.php文件的filename后进行上传 #成功
  4. 使用绕过了filename的姿势上传恶意.php #拦截

以上这么个逻辑通常来讲是waf检测到了正文的恶意内容。再继续写的话就属于免杀的范畴了,过于模糊并且跑题了,并不是真正意义上的文件上传Bypass,那是写不完的。

0x01 搞起

上传文件(歪脖骚)时waf会检查哪里?

  1. 请求的url
  2. Boundary边界
  3. MIME类型
  4. 文件扩展名
  5. 文件内容

常见扩展名黑名单:

  1. asp|asa|cer|cdx|aspx|ashx|ascx|asax
  2. php|php2|php3|php4|php5|asis|htaccess
  3. htm|html|shtml|pwml|phtml|phtm|js|jsp
  4. 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

1
IIS6.0两个解析缺陷:

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

2


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

3


有一点需要注意,如果程序会将上传的图片进行重命名的话就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解析漏洞

  1. IIS 7.0/7.5
  2. 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

4

请求正文格式问题:

  1. Content-Disposition: form-data; name="file1"; filename="shell.asp"
  2. Content-Type: application/octet-stream

正常的upload请求都是以上这样,然而这个格式也并非强制性的,在IIS6.0下如果我们换一种书写方式,把filename放在其他地方:
Win2k3 + IIS6.0 + ASP

5

结合.htaccess指定某些文件使用php来解析:

这个方法通常用于绕过waf黑名单的,配置该目录下所有文件都将其使用php来解析:
6

0x03 系统特性

Windows特殊字符:
当我们上传一个文件的filename为shell.php{%80-%99}时:

7

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

8

exee扩展名:
上传.exe文件通常会被waf拦截,如果使用各种特性无用的话,那么可以把扩展名改为.exee再进行上传。

NTFS ADS特性:
ADS是NTFS磁盘格式的一个特性,用于NTFS交换数据流。在上传文件时,如果waf对请求正文的filename匹配不当的话可能会导致绕过。

9

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

10

0x04 waf缺陷

匹配过于严谨:

一个空格导致安全狗被绕过:

Content-Type: multipart/form-data; boundary=---------------------------4714631421141173021852555099

尝试在boundary后面加个空格或者其他可被正常处理的字符:

boundary =---------------------------4714631421141173021852555099

Win2k3 + IIS6.0 + ASP

11

以上也能说明一个问题,安全狗在上传文件时匹配各个参数都十分严谨,不过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

12

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

13

ASCII > 127的字符:

14

数据过长导致的绕过:

waf如果对Content-Disposition长度处理的不够好的话可能会导致绕过,例如:

Win2k3 + IIS6.0 + ASP

15

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

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

17

特殊的长文件名:
文件名使用非字母数字,比如中文等最大程度的拉长,不行的话再结合一下其他的特性进行测试:

shell.asp;王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王王.jpg

0x05 End

文件上传Bypass可写的点不多,现有的姿势也不能拿出来讲(笑)重点在于上传文件时遇到waf能够准确判断所拦截的点,目光不能只盯在waf,更多的时注意后端的情况。往往是需要结合哪些语言/容器/系统*版本“可以怎样”、“不可以怎样”。

转载于:https://www.cnblogs.com/deen-/p/7277159.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/467989.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

吕布是不是英雄?

马中赤兔&#xff0c;人中吕布 如果要说什么马跑得最快&#xff0c;最久&#xff0c;那一定是赤兔马&#xff0c;但是要能和赤兔马能匹配的&#xff0c;当时那个时期就一定是吕布了&#xff0c;自古美女配英雄&#xff0c;好马配好鞍&#xff0c;好马也一定要有一个好的主人&am…

浙江省计算机二级aoa成绩,浙江省计算机二级AOAEXCEL函数列表

函数名 DAY功能 计算参数中指定日期或引用单元格中的日期天数。 从一个文本字符串的第一个字符开始&#xff0c;截取指定数 LEFT 目的字符。 仅当所有参数值均为逻辑“假(FALSE)”时返回结 OR 果逻辑“假(FALSE)”,否则都返回逻辑“真 (TRUE)”。 返回在指定方式下与指定数值匹…

Linux kernel中常见的宏整理

0x00 宏的基本知识// object-like #define 宏名 替换列表 换行符 //function-like #define 宏名 ([标识符列表]) 替换列表 换行符替换列表和标识符列表都是将字符串 token 化以后的列表。区别在于标识符列表使用,作为不同参数之间的分割符。每一个参数都是一个 token 化的列表。…

统计app用户在线时长_「云工作普及系列」2.如何实时统计工作时长,提高工作效率

记上节我们讲了【1.如何注册云工作平台】之后&#xff0c;接下来一起探索下该平台提供的各个产品功能。今天主要讲一下如何它的实时统计工作时长是怎么实现的&#xff1f;我们先来了解一下它的工作时长实时统计的功能。一&#xff0c;从web端的统计情况来看&#xff0c;用颜色代…

GPIO 使用 — Rockchip

昨天跟同事调试GPIO&#xff0c;用的就是Rockchip的板子&#xff0c;我们想把一个gpio口设置成阻塞状态&#xff0c;刚开始一直没有成功&#xff0c;然后我问了连总&#xff0c;连总是我原来的同事&#xff0c;是一个大牛&#xff0c;他跟我说&#xff0c;只要把gpio口设置成输…

倩女幽魂7月20日服务器维护,倩女幽魂手游7月20日更新什么?倩女幽魂手游7月20日更新一览...

倩女幽魂手游7月20日进行了版本大更新&#xff0c;那么倩女幽魂手游7月20日更新具体有哪些内容呢&#xff1f;接下来就由小编给大家带来倩女幽魂手游7月20日更新一览&#xff0c;希望对大家有所帮助。我们将于7月20日&#xff0c;进行较大规模的版本更新。届时将放出海量新内容…

Android-你真的懂AIDL的oneway嘛?

AIDL是Android Interface definition language的缩写,它是一种android内部进程通信接口的描述语言,通过它我们可以定义进程间的通信接口。android提供了很多进程间通信的组件&#xff0c;像Activity、BroadcastReceiver和ContentProvider都可以实现进程间的通信。为什么还要用A…

妖怪手帐获取服务器信息失败,妖怪手账闪退怎么办 卡在加载页面解决办法

妖怪手账闪退怎么办&#xff1f;很多玩家下载了游戏之后发现一直卡在加载页面&#xff0c;完全进不去怎么办呢&#xff1f;有什么办法可以解决这种情况呢&#xff1f;接下来就跟随小编一起来看看吧&#xff01;妖怪手账闪退怎么办 卡在加载页面解决办法很多玩家都发现自己下载游…

binder,hwbinder,vndbinder之间的关系

昨天发的那篇技术文之后&#xff0c;这篇文章我觉得可以给大家更加耳目一新&#xff0c;特别是因为其中的例子和白话文。昨天文章如下Android-你真的懂AIDL的oneway嘛&#xff1f;以下是正文1 前言先复制一段来自于android官方文档的文字https://source.android.google.cn/devi…

modbus协议手册_20种PLC元件编号和Modbus编号地址对应表

曾经做过单片机和以下20种PLC的Modbus RTU串口通信&#xff0c;现将这20种PLC输入、输出和寄存器元件与Modbus编号地址对应表分享出来。三菱FX3G-40MR/ES-A、西门子S7-200 CPU226 AC/DC/RLY、欧姆龙CP1H-X40DR-A、松下AFPX-C40R、台达DVP-12SA2、信捷XC5-48、永宏FBs-40MC、产电…

写代码获取全国疫情地图

今天在朋友圈看到一个同学写的python获取全国疫情地图&#xff0c;我觉得挺有意思的&#xff0c;这个分享给大家&#xff0c;如果喜欢python的&#xff0c;可以通过这个作为入门手段。1、安装python看这个链接来安装&#xff0c;非常的小白https://www.liaoxuefeng.com/wiki/10…

泛型类有什么作用_3 分钟带你彻底搞懂 Java 泛型背后的秘密

优质文章&#xff0c;及时送达作者 | 的一幕来源 | www.jianshu.com/p/dd34211f2565这一节主要讲的内容是java中泛型的应用&#xff0c;通过该篇让大家更好地理解泛型&#xff0c;以及面试中经常说的泛型类型擦除是什么概念&#xff0c;今天就带着这几个问题一起看下:举一个简单…

实现Linux系统的回收站

今天偶然看到一个有意思的shell脚本&#xff0c;用脚本实现Linux系统下的回收站&#xff0c;推荐给大家。今天我们利用简单的shell脚本实现Linux系统下的回收站机制。先提供脚本代码[rootqll251 ~]# vim /bin/delete1 #! /bin/bash2 [ ! -d /.recycle ] && mkdir -v /.…

RobotFramework自动化测试框架的基础关键字(五)

1.1.1 Run Keyword If判断的使用 Run Keyword If是一个常用的用来做逻辑判断的关键字&#xff0c;意思是如果满足了某一个判断条件&#xff0c;然后就会执行关键字&#xff0c;我们对list3中放入0,1,2三个元素&#xff0c;然后遍历list3&#xff0c;判断当取到元素为0时…

我看三国有感而发

三国到现在已经过去一千多年了&#xff0c;关羽先生应该还淹没在失去荆州的痛苦中&#xff0c;关羽先生出现的时候充满了一股傲气&#xff0c;这种站着向上仰望30度角的男人非常稀有&#xff0c;应该是几百年才出现一个&#xff0c;而且还要生于乱世&#xff0c;可惜啊可惜&…

pil库修改图片大小_Gvcode库:一个更简单的、华人开源的、自动生成验证码的python库...

1 说明&#xff1a;1.1 gvcode全称&#xff1a;graphic-verification-code。1.2 基本介绍&#xff0c;一秒搞懂。1.3 并对源码进行修改一个小bug&#xff0c;教您如何修改源码&#xff0c;解决bug。2 准备&#xff1a;2.1 官网&#xff1a;https://pypi.org/project/graphic-ve…

Android-AB系统OTA升级介绍

什么是OTA升级&#xff1f;OTA是Over-the-Air的简称&#xff0c;OTA升级可以理解为用户正常使用过程中进行升级&#xff0c;OTA 升级旨在升级基础操作系统、系统分区上安装的只读应用和/或时区规则。什么是Android AB系统更新A/B 系统升级&#xff0c;也叫做无缝更新&#xff0…

看完少年的你,想到少年的我

别人喜欢听故事&#xff0c;所以我就讲故事&#xff0c;我可以不是现在的我&#xff0c;但是我还是原来的我&#xff0c;我从一个很小的地方来&#xff0c;我小时候&#xff0c;家里赚钱很难&#xff0c;读书是一件很苦的事情&#xff0c;但是呢&#xff0c;读书又是一件非常光…

伤感网络验证系统_知网查重报告单能造假?验证报告单真伪时,知网只给了这一个办法...

这是论文屋推送的第5篇文章&#xff0c;论文代发寻渠道&#xff0c;就到论文屋。现在的修图功能太强大了有木有&#xff1f;除了专业的一点的AdobePhotoshop之外&#xff0c;任何的一款修图软件甚至手机软件都可以更改一张图的任何地方&#xff0c;最重要的是&#xff0c;技术高…

jQuery: 整理3---操作元素的内容

1.html("内容") ->设置元素的内容&#xff0c;包含html标签&#xff08;非表单元素&#xff09; <div id"html1"></div><div id"html2"></div>$("#html1").html("<h2>上海</h2>") …