Web View
This commit is contained in:
@@ -0,0 +1,84 @@
|
||||
### 单引号被过滤怎么绕过
|
||||
|
||||
**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 语句结构,但并非万能
|
||||
Reference in New Issue
Block a user