堆叠及WAF绕过注入
1、堆叠注入
简介
引用大佬的解释:Stacked injections–堆叠注入。从名词的含义就可以看到应该是一堆 sql 语句(多条)一起执行。而在真实的运用中也是这样的,我们知道在 mysql 中,主要是命令行中,每一条语句结尾加 ; 表示语句结束。这样我们就想到了是不是可以多句一起使用。这个叫做 stacked injection。
在 SQL 中,分号(;)是用来表示一条 sql 语句的结束。试想一下我们在 ; 结束一个 sql 语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而 union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于 union 或者 union all 执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是 任意的语句。
例子:
mysql> select database();select * from users;
+------------+
| database() |
+------------+
| security |
+------------+
1 row in set (0.00 sec)
+----+----------+------------+
| id | username | password |
+----+----------+------------+
| 1 | Dumb | Dumb |
| 2 | Angelina | I-kill-you |
| 3 | Dummy | p@ssword |
| 4 | secure | crappy |
| 5 | stupid | stupidity |
| 6 | superman | genious |
| 7 | batman | mob!le |
| 8 | admin | 123 |
| 9 | admin1 | admin1 |
| 10 | admin2 | admin2 |
| 11 | admin3 | admin3 |
| 12 | dhakkan | dumbo |
| 14 | admin4 | admin4 |
| 15 | admin'# | 123456 |
+----+----------+------------+
14 rows in set (0.00 sec)
局限性
堆叠注入的局限性在于并不是每一个环境下都可以执行,可能受到 API 或者数据库引擎 不支持的限制,当然了权限不足也可以解释为什么攻击者无法修改数据或者调用一些程序。
虽然我们前面提到了堆叠查询可以执行任意的 sql 语句,但是这种注入方式并不是十分 的完美的。在我们的 web 系统中,因为代码通常只返回一个查询结果,因此,堆叠注入第 二个语句产生错误或者结果只能被忽略,我们在前端界面是无法看到返回结果的。
因此,在读取数据时,我们建议使用 union(联合)注入。同时在使用堆叠注入之前, 我们也是需要知道一些数据库相关信息的,例如表名,列名等信息。
应用场景
-
注入需要管理员帐号密码,密码是加密,无法解密
-
堆叠注入时插入数据,用户密码自定义的,可以正常解密登录
2、WAF绕过
SQL绕过思路
数据:
-
大小写
-
加密解密
-
编码解码,例如:
url编码: %23表示# %0a表示换行 %20表示空格 假如要绕过union select这个整体: union %23a%0a select 1,2,3# 分析: %23是为了屏蔽a,加a是为了让waf判断到#时,并没有结束,后面还有个字符a; %0a是为了换行躲避掉#的注释,从而可以执行后面的select语句
-
等价函数
-
特殊符号 ! ~
-
反序列化
-
注释符混用,例如:
mysql> select database/**/(); +-------------+ | database () | +-------------+ | security | +-------------+ 1 row in set (0.00 sec)
注释符/**/是mysql特有的,不影响查询。因为waf防护策略大多数都是基于整体验证,例如过滤“database()”这个字符串。
方式:
- 更改提交方式
- 变异
其他:
-
Fuzz大法
说白了就是批量测试进行爆破,不过通常是借助脚本自动爆破 这种方法在以后经常用到,核心是写好脚本,绕过语句可以网上查询获取,网上很多
-
数据库特性
用来分隔语句的符号: /*!*/ mysql> /*!select database()*/; +------------+ | database() | +------------+ | security | +------------+ 1 row in set (0.00 sec) 安全狗检测渗透脚本是采用整体验证,例如:unint select 这个整体 可以使用以上方法,使用unint/*!*/select可不触发waf
-
垃圾数据溢出
-
http参数污染
如果出现多个相同参数,不同的服务器搭建网站会出现参数接受的差别,从而令原有的参数失效。
结合注释符/**注入语句*/来绕过waf: ?id=1/**&id=-1%20union%20select%201,2,3$23*/ 分析: 1、waf匹配的时候匹配的是1/**&id=-1%20union%20select%201,2,3$23*/,其中/***/起到注释作用, 正常情况下没有执行后面的语句,waf直接不管; 但是参数污染导致接收的真实数据是id=-1%20union%20select%201,2,3$23,能正常执行sql语句