记实战下一些不一样的漏洞挖掘经历
字数 5887 2025-11-05 23:45:18
实战漏洞挖掘高级技巧教学文档
文档说明
本教学文档基于一篇真实的渗透测试经验总结,旨在深入剖析在复杂场景下(如存在签名校验、前端加密、严格WAF等)如何利用系统性的思维和方法挖掘高危漏洞。文档将按照漏洞类型分类,每个案例都包含漏洞背景、分析思路、技术细节、突破方法和总结反思,力求还原分析者的思考路径。
第一章:越权漏洞的深入利用
越权漏洞的核心在于绕过系统对用户权限的验证机制。本章重点讲解三种非典型的越权场景。
案例一:签名校验绕过导致的水平越权
- 漏洞背景: 测试一个小程序时,发现请求接口(如查询用户信息)需要携带
memberid参数。初步尝试修改memberid进行遍历时,请求被拒绝。分析请求包,发现存在一套自定义的安全校验机制,包括时间戳(timestamp)、随机数(nonce)、签名(mac)等字段。 - 分析思路:
- 判断校验点: 重放请求失败,说明服务端有防重放机制。修改
nonce后报时间戳错误,修改时间戳后报签名错误,由此确定校验逻辑为:验证时间戳新鲜度 -> 验证nonce唯一性 -> 验证mac签名正确性。 - 定位加密逻辑: 对小程序进行反编译,在得到的源码中,重点查看
app-service.js文件(通常包含核心业务逻辑和接口调用)。 - 逆向签名算法: 在
app-service.js中全局搜索关键词mac,定位到生成签名的JavaScript函数。
- 判断校验点: 重放请求失败,说明服务端有防重放机制。修改
- 技术细节:
- 破解时间戳与Nonce: 使用Python脚本动态生成当前时间戳和随机
nonce,解决前两个校验。 - 逆向签名函数: 分析定位到的签名函数,发现其使用特定算法(如HMAC-SHA256)将请求参数(包括
memberid、时间戳、nonce等)和一个静态密钥(Key) 进行加密生成mac。 - 关键突破: 该静态密钥(Key)硬编码在前端代码中,可被直接获取。这是因为开发错误地认为前端代码是安全的。
- 破解时间戳与Nonce: 使用Python脚本动态生成当前时间戳和随机
- 利用过程:
- 编写Python脚本,完全模拟前端的签名生成逻辑。
- 脚本自动生成有效的时间戳、
nonce和正确的mac签名。 - 通过遍历
memberid参数,成功越权获取所有用户的敏感信息。
- 核心要点:
- 签名 ≠ 鉴权: 签名校验旨在保证请求的完整性和不可否认性,但若签名密钥可被攻击者获取,则签名机制形同虚设,无法替代真正的身份鉴权。
- 前端加密不可信: 任何置于前端的加密逻辑和密钥都只能起到“防君子”的作用,在逆向工程面前是透明的。
案例二:签名绕过导致的敏感接口泄露与越权
- 漏洞背景: 在一个带有Token认证的系统中,发现一个接口
getUserByPhone,但以低权限身份请求时无信息返回,难以判断是否存在越权。 - 分析思路:
- 扩大攻击面: 首先尽可能多地收集系统接口。
- 寻找差异点: 在测试其他接口时,发现请求失败,原因是请求头中的
digest字段(签名)校验不通过。这表明该系统对接口访问有统一的签名校验。 - 逆向签名: 同样通过反编译前端代码,全局搜索
digest,定位签名生成函数。
- 技术细节:
- 分析签名算法: 逆向发现,
digest的生成规则相对简单:将接口URL路径和特定固定参数按特定格式拼接后,进行MD5哈希并转换为大写。 - 绕过鉴权: 由于签名算法不依赖动态或不可获取的密钥,攻击者可以为自己构造的任何请求(包括之前发现的敏感接口
getUserByPhone)生成合法的digest。
- 分析签名算法: 逆向发现,
- 利用过程:
- 编写脚本,自动化生成任意接口请求的合法
digest签名。 - 利用此能力,直接访问
getUserByPhone等敏感接口,通过穷举手机号实现用户信息的越权查询。
- 编写脚本,自动化生成任意接口请求的合法
- 核心要点:
- 接口鉴权模型: 系统的鉴权模型应为:身份认证(Token/Session)→ 接口权限校验 → 数据权限校验。本案例中,系统只做了第一步,并在第二步使用了脆弱的签名机制,导致越权。
- Token不是万能的: 即使请求携带了合法的Token,如果服务端没有在业务逻辑层严格校验“当前Token身份是否有权访问该接口/该数据”,越权依然会发生。
案例三:JS逆向破解参数加密实现的越权
- 漏洞背景: 在测试一个教育证书站时,发现查询用户订单的接口
user/getOrderList的请求体中的data参数被加密。 - 分析思路:
- 定位加密位置: 使用浏览器开发者工具的“全局搜索”功能,搜索接口URL或关键词,定位到发起请求的JavaScript代码段。
- 动态调试: 在疑似加密代码处设置断点,发起请求,使代码执行暂停在断点处。
- 调用栈分析: 使用开发者工具的“Call Stack”(调用堆栈)面板,从发起请求的代码向上回溯,找到加密发生的确切函数。
- 技术细节:
- 步进分析: 通过单步调试(Step Into)深入加密函数内部。
- 识别加密算法: 在代码中发现使用了
public key,从而判断出是RSA非对称加密。 - 获取密钥: 密钥(公钥)直接硬编码在前端JS中,可被直接提取。
- 利用过程:
- 从代码中提取RSA公钥。
- 分析出加密前的明文格式(例如是
userId=123&phone=456的拼接)。 - 使用该公钥和相同的加密库(如Python的
cryptography),编写脚本加密任意userId等参数,构造恶意请求,实现越权查询他人订单。
- 核心要点:
- 熟练使用开发者工具: “全局搜索”、“断点调试”、“调用堆栈”是前端逆向分析的三大神器。
- 理解加密类型: 识别是对称加密(AES、DES)还是非对称加密(RSA),对后续的利用脚本编写至关重要。
第二章:未授权访问漏洞
未授权访问是一种特殊的垂直越权,即从无权限用户直接提升为有权限用户。
案例一:HTTP方法滥用导致的未授权操作
- 漏洞背景: 在某学校资产系统中,发现一个查看资源状态的接口(如
/api/resource/status),返回资源详情。 - 分析思路:
- 信息收集: 这是漏洞挖掘的基础。通过目录扫描、JS文件分析、爬虫等方式尽可能多地收集接口。
- 测试不同HTTP方法: 对于发现的接口,不仅测试
GET/POST,还要测试PUT、DELETE、PATCH等方法。
- 技术细节:
- 方法滥用: 对
/api/resource/status接口使用GET方法时,只是查看信息。但尝试使用DELETE方法时,服务端返回了操作成功的提示,实现了资源的未授权下架。同理,PUT或POST方法可能用于未授权上线资源。
- 方法滥用: 对
- 利用过程: 直接使用Burp Suite等工具,重放请求并修改HTTP方法,观察响应结果,从而实现对系统资源的未授权管控。
- 核心要点:
- RESTful API风险: 遵循RESTful规范的API会根据HTTP方法来区分操作(GET查,POST增,PUT改,DELETE删)。如果服务端仅根据URL进行权限校验,而忽略了方法,就会导致此类漏洞。
- 自动化测试: 可将此测试过程集成到自动化扫描工具中。
案例二:前端响应拦截修改实现认证绕过
- 漏洞背景: 一个需要登录的系统,在未登录状态下访问后台,页面会短暂加载后跳转或消失。
- 分析思路:
- 推测机制: 这种现象通常是前端JavaScript在页面加载后,通过异步请求验证身份,验证失败则执行跳转。
- 拦截响应: 使用Burp Suite等代理工具的“拦截响应”(Intercept response)功能,在身份验证的JS代码返回时将其截获。
- 技术细节:
- 分析响应包: 在拦截到的HTML或JS响应体中,查找负责认证和跳转的代码段。例如,可能有一个
setTimeout函数在5秒后执行跳转检查。 - 修改逻辑: 修改响应体,可以有两种方式:
- 删除跳转代码: 直接删除或注释掉负责跳转的JavaScript代码。
- 延长定时器: 将
setTimeout的时间从5000(5秒)改为一个极大的值(如5000000),为操作争取足够时间。
- 分析响应包: 在拦截到的HTML或JS响应体中,查找负责认证和跳转的代码段。例如,可能有一个
- 利用过程: 拦截并修改响应包后,放行。浏览器将加载被“阉割”或“延迟”了认证逻辑的页面,从而允许未授权用户进入后台进行操作。
- 核心要点:
- 前端校验不可信: 与前端加密一样,前端进行的身份认证和权限控制可以被绕过。一切校验必须在服务端完成。
- 善用代理工具: “拦截响应”是一个常被忽略但极其强大的功能,可用于绕过客户端限制。
第三章:SQL注入漏洞
案例一:SQL Server注入与命令执行(RCE)
- 漏洞背景: 在某政府系统的人员信息添加功能中,对JSON参数尝试闭合时产生数据库报错。
- 分析思路:
- 识别数据库: 根据报错信息特征(如
Microsoft OLE DB Provider for SQL Server)确认数据库为SQL Server。 - 判断注入类型: 测试分号
;,发现支持堆叠查询,这意味着可以执行任意SQL语句。
- 识别数据库: 根据报错信息特征(如
- 技术细节:
- 利用存储过程: SQL Server提供了强大的系统存储过程,如
xp_cmdshell用于执行操作系统命令。 - 开启
xp_cmdshell: 默认情况下该功能可能关闭,需通过堆叠查询执行EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;来开启。 - 执行命令: 使用
EXEC xp_cmdshell 'whoami'执行系统命令。由于是Windows主机且权限较低,可能无法执行某些命令,但curl、ping等网络命令通常可用,可用于数据外带。
- 利用存储过程: SQL Server提供了强大的系统存储过程,如
- 核心要点:
- SQL Server的特性: 堆叠查询+
xp_cmdshell是SQL Server注入通往RCE的经典路径。 - 权限意识: 注入点所处的数据库用户权限决定了利用的上限。
- SQL Server的特性: 堆叠查询+
案例二:基于响应差异的布尔盲注
- 漏洞背景: 对某接口参数进行SQL注入测试时,添加单引号后,页面回显发生变化(非报错),但无明确错误信息。
- 分析思路:
- 确认注入点: 输入
1''(两个单引号)和1'(一个单引号)时,页面返回内容(如状态码、长度、HTML内容)存在可复现的差异。这表明参数被带入数据库查询,且语法错误导致了不同的返回结果。 - 判断注入类型: 由于没有显式报错信息,但存在布尔状态(真/假)的回显差异,故确定为布尔盲注。
- 确认注入点: 输入
- 技术细节:
- 构造Payload: 利用
and 1=1(真)、and 1=2(假)与注入点拼接,观察回显差异,确认“真/假”状态。 - 逐位提取数据: 使用
substring、len等函数和if/case when条件语句,结合and,通过判断单个字符的真假来逐步推测出数据库名、表名、数据内容。例如:id=1' and ascii(substring(database(),1,1))>100 --+,如果回显为“真”,则说明数据库名第一个字符的ASCII码大于100。
- 构造Payload: 利用
- 核心要点:
- 关注细微差异: 盲注的成功依赖于对HTTP响应包任何细微差异的敏锐观察。
- 自动化工具: 布尔盲注过程繁琐,应使用
sqlmap等自动化工具或编写自定义脚本进行。
第四章:XSS漏洞的绕过技巧
案例一:通用型XSS Payload绕过WAF
- 绕过策略由简到繁:
- 基础探测: 首先尝试最温和的
<h1>test</h1>,观察是否被渲染。 - 标准Payload: 尝试
<script>alert(1)</script>。 - 编码绕过: 如果
script标签被过滤,尝试HTML实体编码、JavaScript Unicode编码等。如:<script>alert(1)</script>。 - 利用黑名单缺陷: 尝试变体,如
<ScRiPt>alert(1)</sCrIpT>、``、<svg onload=alert(1)>。 - 利用标签属性: 案例中成功的Payload:
<a % herf="javascript:alert('a')">aa</a>。这里利用了标签内部属性的特殊解析规则,%和空格可能被WAF错误解析,从而绕过了对href属性中javascript:协议的检测。
- 基础探测: 首先尝试最温和的
案例二:文件上传导致的XSS
- 漏洞背景: 文件上传功能对文件后缀有严格校验,无法上传
.php、.jsp等后缀进行getshell。 - 分析思路:
- 寻找允许上传的文本类格式: 检查是否允许上传
.html、.svg、.xml、.txt等文件。 - 测试解析位置: 上传后,文件是被存储到web目录下可通过URL直接访问,还是仅作为附件下载?前者才能构成XSS。
- 寻找允许上传的文本类格式: 检查是否允许上传
- 技术细节:
- 构造恶意文件: 上传一个包含XSS Payload的SVG文件(SVG本质是XML)。
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"> <svg version="1.1" xmlns="http://www.w3.org/2000/svg" width="100" height="100"> <script type="text/javascript">alert('XSS');</script> </svg> - 利用: 获得此SVG文件的URL后,诱使受害者访问,浏览器会将其作为图像/XML文档解析并执行其中的JavaScript代码。
- 构造恶意文件: 上传一个包含XSS Payload的SVG文件(SVG本质是XML)。
- 核心要点:
- 拓宽思路: 文件上传点不仅是命令执行的突破口,也是存储型XSS的常见来源。
- Content-Type校验: 即使绕过后缀校验,服务端可能还会检查文件的
Content-Type,需要对应修改。
总结与反思
- 系统性思维: 漏洞挖掘不是孤立的点,而是一个系统性的过程。从信息收集、攻击面分析、到逆向调试、漏洞利用,每一步都至关重要。
- 深入理解技术原理: 理解签名、加密、鉴权、数据库、HTTP协议等底层原理,是突破各种防御机制的前提。
- 工具只是延伸: 熟练使用工具是必要的,但更重要的是背后的思考。为什么这里会有签名?这个参数可能代表什么?如果我是开发者,我会怎么实现这个功能?
- 耐心与积累: 正如原文所言,“漏洞挖掘不是一个一蹴而就的过程”。每一次尝试,无论成功与否,都是宝贵的经验积累。保持好奇心,多角度思考,方能成为破局的关键。
希望这份详尽的教学文档能对您有所帮助,祝您在漏洞挖掘的道路上不断精进!