服务器端请求伪造(SsRF, Server-Side Request Forgery)是一种安全漏动,它允许公鸡者通过受信任的服务器发起恶意网络请求,从而获取内部网络资源、公鸡内部服务或执行非预期操作。SsRF检测、防御与绕过涉及到以下几个方面:
概述
服务器端请求伪造(Server-Side Request Forgery,简称SSRF)是一种网络安全漏动,它允许公鸡者通过受信任的应用程序发起恶意的网络请求。这种公鸡的特点在于,不是直接从公鸡者自身的机器发起请求,而是利用应用程序本身的服务器去发起这个请求。公鸡者能够利用这一漏动,访问原本从外部网络无法直接访问的内部系统或资源,如内部网络的服务、私有云环境、甚至同服务器的本地文件系统等。
SSRF漏动常见于那些具有动态获取远程数据功能的应用程序,例如图片加载、链接重定向、API调用、文件下载、XML外部实体注入(XXE)相关功能等。当应用程序未能充分验证用户提供的URL或者其他形式的请求参数时,公鸡者就可以构造特殊的请求,诱骗服务器访问非法或敏感的目标。
SSRF公鸡可能导致如下危害:
- 访问内部网络资源,如内网服务器、数据库和其他服务;
- 利用内部API获取敏感数据;
- 执行内部服务的命令或操作,如删除文件、修改系统配置等;
- 发现和利用内部系统的其他漏动;
- 通过结合其他漏动(如DNS rebinding)突破内外网隔离,实施更深层次的公鸡。
防御SSRF的主要策略包括:
- 对请求的目标地址进行严格的白名单或黑名单过滤,只允许访问特定的、安全的外部资源;
- 不信任用户提供的URL,并对URL进行规范化处理,剔除不安全的协议;
- 使用反向代理或防火墙规则限制服务器对外部网络的访问权限;
- 在需要服务器发起请求的场景下引入随机令牌验证机制,确保请求的合法性;
- 对于基于HTTP的请求,采用安全性更高的代理模式,而非直接让服务器与目标进行通信。
总之,SSRF漏动是一种非常重要的安全风险,要求开发者在设计和实现应用程序时,必须仔细考虑用户可控输入的处理,确保所有向外发起的请求均受到严格的控制和验证。
SsRF检测
检测方法与实例:
- 自动化扫描:使用安全扫描工具(如OWASP ZAP、Burp Suite等)针对Web应用程序的所有对外请求接口进行深度扫描,查找是否存在可通过用户输入控制请求目标的函数或模块。
示例:如果应用程序允许上传图片并通过服务器直接访问外部URL以获取图片,安全扫描工具会尝试注入各种类型的URL(如内网IP、文件协议、localhost等)来确认是否有不受限的请求。 - 人工审计:通过审查源代码或逆向工程,找出处理外部URL请求的地方,检查是否进行了充分的输入验证和过滤。
示例:查看代码逻辑,如果看到类似httpGet(request.getParameter("url"))
这样的语句,表明可能存在SsRF风险,因为用户可以控制要请求的URL。
SsRF防御
防御措施与实践:
- 严格的输入验证:确保所有的外部请求参数都经过严格的格式和内容验证,仅允许访问预定义白名单内的主机和端口。
示例:仅允许请求指向指定域名列表的HTTP/HTTPS资源,禁止任何内网IP、localhost、特殊协议(如file、gopher、dict等)。 - 限制请求范围:使用防火墙规则限制服务器对外部网络的访问权限,防止敏感资源暴露。
- 随机令牌验证:对于需要发起服务器端请求的操作,增加随机令牌作为请求的一部分,确保只有合法客户端才能发起有效的请求。
- 回源限制:对于CDN等场景,设置正确的回源策略,避免因回源请求而暴露内网。
SsRF绕过
绕过技术与案例:
- 协议转换:公鸡者可能会尝试使用特殊的协议(如file:///、ftp://、ldap://等)来绕过简单的URL过滤器。
示例:若服务器对URL的过滤不够严谨,允许了data:
、javascript:
等伪协议,公鸡者可能借此泄露内部数据或者执行恶意脚本。 - DNS解析漏动:利用DNS Rebinding公鸡,将恶意域名解析为内网IP地址,使得服务器请求最终到达内部网络。
示例:先将域名A解析为公网IP,待服务器连接时迅速将其改为内网IP,利用SsRF漏动访问内网资源。 - IP别名与端口转发:利用某些服务的特性,例如IPv6环回地址、IP别名或者端口转发,绕过内网IP的限制。
- CDN/代理漏动:利用CDN节点或者代理服务器的特性,间接达到访问内网资源的目的。
- 进制转换:转换8进制、16进制,[::]这个也是127.0.0.1的写法
- xip.io:临时dns
- 127.0.0.1.xip.io
- 替换协议:替换成http、dict/file/ldap/gopher/sftp
- 127。0。0。1
xip.io
是一个免费的 DNS (Domain Name System) 服务,提供了一种简单、即时的方式来为你的本地开发环境设置临时域名,以便在不修改 hosts 文件或配置正式 DNS 记录的情况下,通过浏览器或其他网络客户端访问到本地运行的应用程序。
工作原理: xip.io
基于一个创新的 DNS 解析规则,它允许你将任何 IP 地址与一个自定义域名关联起来,只需将 IP 地址作为子域名附加到 xip.io
域名后即可。具体格式如下:
1<IP_ADDRESS>.xip.io
例如,如果你在本地开发环境中运行了一个 Web 服务器,其 IP 地址为 192.168.1.100
,并且你想通过域名 myapp.local
访问它,可以构造如下域名:
1192.168.1.100.xip.io
然后,当你在浏览器中输入 http://myapp.local.192.168.1.100.xip.io
时,DNS 请求会被解析到 192.168.1.100
这个本地 IP 地址。这样,你就能够在本地网络中使用一个类似真实域名的 URL 来访问你的应用,而无需进行任何复杂的 DNS 配置。
主要优点:
- 便捷性:无需修改系统 hosts 文件或配置 DNS 服务器,只需按照特定格式构造域名即可。
- 灵活性:适用于任何 IP 地址(包括动态 IP),且支持多级子域名。例如,如果你想模拟一个子域名结构,如
api.myapp.local
,可以使用api.myapp.192.168.1.100.xip.io
。 - 跨平台兼容:由于基于标准 DNS 协议,
xip.io
在各种操作系统和设备上都能正常工作,便于团队成员间共享和测试本地开发环境。
应用场景:
- Web 开发:在开发 Web 应用时,使用
xip.io
可以方便地通过域名访问本地运行的服务器,有助于模拟生产环境,进行前端与后端的联调、跨域问题调试等。 - 移动应用开发:对于需要通过 URL 访问后端服务的移动应用,
xip.io
允许开发者在测试设备上直接使用域名访问本地开发服务器,无需额外的代理配置。 - 微服务架构:在开发涉及多个相互依赖的服务的项目时,
xip.io
可以帮助你为每个服务分配一个易于记忆的域名,便于在本地环境中进行集成测试。
需要注意的是,xip.io
主要适用于本地开发和测试场景,不建议在生产环境中使用。此外,由于其依赖于公共 DNS 服务,可能存在一定的延迟和稳定性风险。在需要长期稳定、安全的域名服务时,应选择配置正规的 DNS 服务。
实战案例
例如,在某Web应用中,用户可以通过输入URL来分享外部内容。假设应用对输入的URL未做严格过滤,公鸡者可能输入内网IP http://10.0.0.1/admin/
,试图访问内部管理界面。为了防御这种公鸡,开发者应当实施严格的输入验证,仅允许对外公开的、已知安全的域,并且禁用或者过滤掉不安全的协议类型。而对于绕过的防范,则需要不断跟进最新的公鸡手段和技术,及时更新安全策略和补丁。
SsRF和XSS结合
XSS(跨站脚本公鸡)和SsRF(服务器端请求伪造)是两种不同的公鸡类型,但在某些情况下可以结合使用以增强公鸡效果。
一种常见的结合方式是利用XSS漏动来执行SsRF公鸡,即通过注入恶意脚本,来触发服务器端发起的请求。
下面是一个简单的示例:
- XSS漏动注入: 公鸡者通过XSS漏动成功注入恶意脚本到目标网站。
<script>
// 在这里执行SsRF公鸡
</script>
- 发起SsRF公鸡: 公鸡者在注入的脚本中发起SsRF公鸡,例如向内部网络发起请求或者访问本地文件。
<script>
// 发起SsRF公鸡
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://内部服务器IP/敏感路径', true);
xhr.send();
</script>
通过这种方式,公鸡者可以利用受感染的用户的身份来发起对内部服务器的请求,可能导致敏感数据泄露或者进一步的公鸡。
要防止这种公鸡,应该加强对输入数据的过滤和验证,以及实施严格的安全策略,包括确保内部服务器不会受到来自外部的未经授权的访问。
2.
10.0.30.15:9001/vul/ssrf/ssrf_fgc.php?file=file:///etc/pssswd
就会显示出passwd