1. 项目概述一次从攻击者视角出发的实战演练最近在复盘一些经典的Web安全漏洞时我又把目光投向了Apache Shiro这个老朋友。Shiro作为Java领域广泛使用的安全框架其历史漏洞一直是安全研究和渗透测试中的重点。今天我们不谈那些已经被自动化工具扫烂了的反序列化而是聚焦于一个需要手动挖掘和利用的认证绕过漏洞CVE-2020-1957。这个漏洞的特别之处在于它不像反序列化那样“一键getshell”而是需要你理解Shiro的URL路径处理逻辑并利用BurpSuite这样的手动测试工具像真正的攻击者一样去思考和构造请求。对于想深入理解Web安全、提升手动测试能力的朋友来说这是一个绝佳的练手案例。通过这次演练你不仅能掌握一个具体漏洞的利用更能学会一种“攻击者思维”——如何从框架的行为中寻找逻辑缺陷。2. 核心漏洞原理与Shiro路径匹配机制深度解析要理解CVE-2020-1957我们必须先吃透Shiro1.5.2版本及之前处理Web请求路径的机制。这不仅仅是知道漏洞存在更要明白它为什么存在。2.1 Shiro的权限拦截与路径匹配Shiro的核心功能之一是通过配置的过滤器链来对访问请求进行权限校验。我们通常在shiro.ini或Spring配置文件中看到类似以下的规则[urls] /index anon /admin/** authc /api/** authc, roles[admin]这里的/admin/**是一个Ant风格的路径模式。当用户请求/admin/user/list时Shiro的PathMatchingFilterChainResolver会尝试将这个请求路径与配置的模式进行匹配。如果匹配到/admin/**且该模式关联了authc认证过滤器那么Shiro就会要求用户先登录。关键在于Shiro是如何进行路径匹配的。在受影响版本中Shiro使用的org.apache.shiro.util.AntPathMatcher类其doMatch方法在处理包含特定字符的路径时逻辑存在瑕疵。2.2 漏洞触发的关键分号;的处理漏洞的核心在于Shiro和底层Servlet容器如Tomcat、Jetty对URL路径中分号;的处理差异。在HTTP标准中分号;有时被用作路径参数Path Parameters的分隔符。例如在JSR-315规范中对于URL/admin/user/list;jsessionid12345Servlet容器在解析时通常会将分号及其后的内容视为路径参数并将其从路径中剥离。因此容器传递给应用程序的request.getServletPath()或request.getPathInfo()很可能就变成了/admin/user/list。然而在受影响的Shiro版本中AntPathMatcher在进行模式匹配前没有对请求路径进行同样的规范化处理。它可能直接拿着原始的、包含分号的路径或仅做了简单处理去匹配模式/admin/**。由于/admin/user/list;xxx并不完全等于/admin/user/list在某些精心构造的情况下可能会导致匹配失败。更具体地说攻击者可以构造这样一个请求/admin/../admin/user;bypass。Servlet容器在处理时先解析路径遍历..可能将其标准化。将;bypass视为路径参数并剥离。 最终到达Shiro过滤器链的路径可能变成了/admin/user。但Shiro在匹配时如果其匹配逻辑没有妥善处理这种“先标准化再剥离参数”的综合情况就可能导致预期拦截路径/admin/**与实际处理路径出现偏差从而绕过认证检查。注意这里描述的是一种简化的原理模型。实际利用链可能更复杂涉及Shiro对URI的解码顺序、路径标准化normalization的时机、以及AntPathMatcher模式匹配的具体实现细节。不同版本的Servlet容器行为也可能有细微差别这正是手动测试需要探测的地方。2.3 为什么自动化扫描器容易遗漏这个漏洞的利用条件相对苛刻需要满足特定的路径配置和请求构造方式。全自动的漏洞扫描器通常基于已知的Payload字典进行模糊测试如果字典里没有覆盖到这种需要结合路径遍历和分号参数的特定变形就很容易漏报。其次扫描器难以智能判断认证绕过是否成功它需要识别登录后的状态如跳转、特定响应内容而这在复杂的应用交互中很难用固定规则判定。因此这类漏洞的挖掘和验证极大地依赖于测试人员的手动分析、逻辑推理和上下文判断。3. 手动挖掘与利用实战BurpSuite操作指南理论讲完了我们进入实战环节。假设我们现在面对一个使用了Shiro 1.5.2版本的应用目标是未授权访问其管理后台假设后台路径为/admin目录下。我们将完全使用BurpSuite进行手动探测和利用。3.1 环境准备与BurpSuite配置首先你需要一个测试环境。可以在本地搭建一个包含漏洞版本Shiro的Web应用务必在授权和隔离的环境中进行例如本地虚拟机或者使用一些在线的安全演练平台提供的相关靶场。接着确保你的BurpSuite已正确配置并拦截浏览器流量。浏览器代理设置将浏览器代理指向BurpSuite默认的127.0.0.1:8080。BurpSuite证书安装访问http://burp下载并安装CA证书以便拦截HTTPS流量。Target作用域设置在Target-Scope中添加你的目标网站地址如http://vuln-app:8080这样可以避免BurpSuite拦截和发送大量无关流量。3.2 信息收集与漏洞探测手动挖掘的第一步是信息收集和初步探测。识别Shiro框架发送任意请求观察响应头。Shiro应用通常会在响应头中留下rememberMedeleteMe的Cookie即使未登录这是一个强烈的Shiro框架标识。观察登录页面的特征或者通过报错信息判断。使用BurpSuite的Repeater模块发送一个请求查看原始响应。定位受保护的端点通过爬虫BurpSuite的Spider功能或手动浏览尽可能多地收集应用的所有URL路径。重点关注那些看起来像管理功能的路径如/admin,/manage,/api/admin等。直接访问这些路径确认它们确实受到了重定向到登录页或返回401/403等状态的保护。构造绕过Payload进行探测 假设我们找到了一个受保护路径/admin/index。在BurpSuite的Proxy-HTTP history中找到访问/admin/index的请求右键发送到Repeater。在Repeater中我们将对请求路径进行篡改尝试多种绕过Payload。以下是一些经典的测试向量路径参数绕过GET /admin/index;bypass HTTP/1.1路径遍历参数GET /admin/../admin/index;bypass HTTP/1.1多重路径遍历GET /admin/./../admin/./index; HTTP/1.1URL编码变体尝试对斜杠/、点.、分号;进行URL编码%2f,%2e,%3b或双重编码。结合空字节需看容器处理GET /admin/%00/index HTTP/1.1(注意空字节注入在很多现代容器中已失效但仍可测试)。每次修改后点击Send发送请求并仔细观察响应长度Length响应体长度是否突然变大了这可能意味着返回了后台页面而非登录页。状态码Status是否从302跳转或403变成了200响应内容Response切换到Render视图或直接看HTML是否包含了后台管理的界面元素重定向Redirect是否不再跳转到/login页面3.3 利用链构造与验证当发现某个Payload例如/admin/..;/admin/index返回了疑似绕过成功的响应时我们需要进行严谨的验证。功能验证不要只看一个页面。尝试用这个绕过后的“会话”状态可能不需要Cookie因为绕过了认证检查去访问其他受保护的管理功能接口例如/admin/user/list或/admin/config/update。在Repeater中修改路径为这些地址使用相同的请求格式发送看是否都能成功获取数据或执行操作。排除误报静态资源误判确认你访问的不是一个静态文件如/admin/static/main.css。静态资源本身可能就不需要认证。默认页面误判有些应用在未登录时访问后台根路径可能会展示一个不同的“未登录”提示页而非登录表单。需要与真正的登录后页面进行对比。使用对比法在BurpSuite的Comparer工具中分别载入“绕过Payload的响应”和“正常未登录访问的响应”进行单词或字节对比找出实质性差异。利用BurpSuite的Intruder进行模糊测试 如果手动测试了几个Payload没成功可以系统性地进行测试。将可疑路径发送到Intruder。位置标记在路径中设置两个Payload位置例如/admin/§§/admin/index§§。Payload集合第一个位置加载包含..;,;..,/%2e%2e;等各种路径遍历和分隔符变体的Payload列表。第二个位置可以尝试null,bypass,test,a等参数值或留空。攻击类型选择Cluster bomb进行组合攻击。结果筛选攻击完成后根据状态码、响应长度排序快速定位那些返回200且长度与众不同的请求这些就是潜在的绕过成功案例。4. 漏洞挖掘中的高级技巧与深度思考掌握了基础操作后想要提升手动挖掘的效率和深度你需要一些进阶的思维和技巧。4.1 理解上下文与配置推断一个优秀的攻击者或测试者会尝试推断后端的配置。分析shiro.ini的可能配置通过观察哪些路径被拦截哪些路径公开可以反向推测Shiro的过滤规则。例如如果你发现/admin/user被拦但/admin/user/profile没被拦可能规则是/admin/user authc而非/admin/** authc。那么你的绕过尝试就应该更精细地针对/admin/user这个端点。关注过滤器的顺序Shiro过滤器链是有顺序的。如果authc过滤器前面有anon匿名过滤器并且路径匹配逻辑有误可能导致请求被anon处理而跳过authc。你的Payload构造可以朝着“让路径匹配到更前面的、权限更宽松的规则”这个方向思考。4.2 利用BurpSuite插件提高效率手动不意味着完全不用工具。合理使用BurpSuite插件能事半功倍。Logger记录所有请求和响应到数据库方便你事后搜索、分析和对比每一次测试的细微差别。Autorize虽然主要用于越权测试但你可以用它来管理“已认证”和“未认证”的会话自动重放请求并对比响应快速识别哪些请求在未认证状态下本应失败却成功了。Custom Payloads在Intruder中精心构建自己的Payload字典将理论上的各种变形编码、大小写、特殊字符组合都囊括进去进行系统性的Fuzz。4.3 绕过WAF/防护设备的思路在实际环境中应用前端可能有WAF。它们会检测常见的路径遍历如../或分号字符。畸形Payload/admin/..;/admin/index可能被拦尝试/admin/..%3b/admin/indexURL编码或者/admin/..%252f../admin/index双重URL编码。Unicode混淆某些WAF对Unicode字符解析不一致。尝试使用全角字符或特殊Unicode表示需视容器解码能力而定。HTTP参数污染HPP虽然此漏洞主要针对路径但可以尝试结合查询参数如/admin/index;bypass?foo../admin/index扰乱解析逻辑。请求方法转换尝试将GET请求改为POST、PUT、DELETE等有时权限校验逻辑可能因请求方法不同而有差异。4.4 从利用到防御给开发者的启示通过攻击视角的演练我们更能理解如何防御。及时升级最根本的措施是将Apache Shiro升级到1.5.3及以上版本官方已修复此路径匹配问题。严格路径规范在Shiro配置中尽量避免使用过于宽泛的Ant通配符**而是使用更精确的路径定义。虽然这增加了配置成本但减少了攻击面。多层防御不要仅仅依赖Shiro进行权限校验。在关键的业务控制器Controller方法上应使用Spring Security的PreAuthorize注解或进行额外的会话/角色校验实现纵深防御。输入净化在应用层对传入的请求路径进行严格的标准化和验证移除任何非法的路径遍历序列和特殊字符。5. 实战中常见的坑与排查记录在实际手动测试中我踩过不少坑这里分享出来希望能帮你节省时间。问题1BurpSuite拦截不到浏览器的请求。排查首先检查浏览器代理设置是否正确指向了BurpSuite的监听端口默认8080。其次检查BurpSuite的Proxy-Intercept是否处于Intercept is on状态。如果是HTTPS网站确保已正确安装BurpSuite的CA证书到浏览器的受信任根证书颁发机构。有时浏览器扩展或系统代理设置也会冲突。问题2发送的Payload毫无效果所有尝试都返回登录页。可能原因目标应用使用的Shiro版本已修复该漏洞1.5.3。目标路径的拦截规则并非你想象的那样。可能拦截的是/admin/*而不是/admin/**导致你的/admin/xxx/yyy路径本身就不匹配规则。Servlet容器对路径的标准化处理非常严格你的Payload在到达Shiro前就被容器“修复”了。应对回归信息收集。尝试寻找更“像”后台的路径。使用更简单的Payload开始测试比如仅仅在路径末尾加一个分号/admin/index;。查看服务器日志如果有权限观察容器实际接收到的路径是什么。问题3Intruder攻击结果太多难以分析。技巧善用Intruder的结果过滤和排序功能。先进行一次攻击找出一个“正常被拒”请求的响应长度比如302跳转到登录页的长度。在结果表中点击Length列进行排序重点关注那些长度与“正常被拒”响应显著不同无论是大还是小的请求。使用Filter功能隐藏所有返回302状态码的请求只展示200、401、403、404等状态码的请求。对可疑请求右键发送到Repeater进行手动深入验证。问题4疑似绕过成功但返回的是错误页面或空白页。分析这可能是“半成功”状态。认证被绕过了但请求因为其他原因如缺少必要参数、请求方法不对、触发了其他业务逻辑异常未能正确执行。检查响应内容看是否有堆栈跟踪信息这能提供宝贵线索。尝试将请求方法从GET改为POST或添加一些基本的参数。问题5在测试过程中应用会话突然失效或被封禁IP。预防在BurpSuite的Project options-Sessions中可以配置会话处理规则自动从浏览器获取新的会话Cookie。对于IP封锁可以使用BurpSuite的Collaborator客户端或设置上游SOCKS代理来轮换IP需在合法授权范围内进行。更重要的是控制测试的请求速率在Intruder的Resource pool中设置请求间隔避免暴力请求。手动挖掘CVE-2020-1957这类漏洞更像是一场与应用程序逻辑的对话。你需要不断提出“如果路径这样变你会怎么处理”的问题并通过BurpSuite观察它的“回答”。这个过程没有一键通吃的神器考验的是你对协议、框架、工具的理解深度以及最重要的——耐心和细心。每一次成功的绕过带来的不仅是漏洞本身的成就感更是对Web安全底层逻辑认知的一次巩固。