SQL注入主要有数字型注入、字符型注入、联合查询注入、报错注入、盲注、宽字节注入、二次注入、堆叠注入和搜索型注入等类型。
- 数字型注入:参数为数值,无需引号闭合。例如id=1 or 1=1能使条件恒真,从而获取所有数据。
- 字符型注入:参数含单/双引号,要先闭合引号。像name='admin' or '1'='1'这样的注入方式。
- 联合查询注入:使用UNION合并查询来获取其他表数据,要求字段数匹配,如UNION SELECT 1,version(),database()。
- 报错注入:构造错误语句,从报错信息中提取数据,例如extractvalue(1,concat(0x7e,version()))。
- 盲注:
布尔盲注:依据页面响应的真假来推断数据,例如and length(database())>5。
时间盲注:利用延时函数判断条件,如and sleep(5) if(1=1,1,0)。
- 宽字节注入:利用GBK编码特性,通过%df'绕过转义,%df%5c会变为汉字“运”。
- 二次注入:先将恶意数据存入数据库,后续查询时触发注入。
- 堆叠注入:用分号分隔多条SQL语句,如;drop table users;。
- 搜索型注入:针对like语句,例如keyword=%test%' or '1'='1。
SQL注入的核心原理是用户输入未经过滤就直接拼接进SQL语句,导致逻辑篡改或数据泄露,防御时需要采用参数化查询、输入验证等方法。