文章目录
- OWASP 2023 TOP 10
- SSRF 导图
- SSRF 概念
- SSRF的工作原理
- SSRF攻击场景
- SSRF防御策略
- 1. 严格验证用户输入
- 2. 禁用或限制对内部网络的访问
- 3. 强制使用外部API代理
- 4. 禁止直接访问敏感资源
- 5. 输入内容长度限制
- 6. 检测和监控
- 7. 确保对HTTP请求的处理安全
- SSRF防御实现方案
- 1. 白名单限制实现
- 2. 阻止私有IP地址的请求
- 3. 代理服务器中转外部请求
- 应用场景分析
- 测试方案:动态生成的URL安全性监控
- 1. 输入验证与限制
- 2. DNS解析监控与测试
- 3. 限速与黑名单
- 测试方案:代理请求监控
- 1. 代理安全性监控
- 2. 代理验证与认证
OWASP 2023 TOP 10
OWASP Top 10 概述
OWASP (Open Web Application Security Project) Top 10 是一份最常见和最危险的Web应用安全风险列表,由安全专家定期更新。 旨在提高开发人员、测试人员以及组织的安全意识并帮助他们预防这些漏洞。
2023年OWASP Top 10 列表
主流防范措施
-
Broken Access Control
- 描述:未能正确执行访问控制,允许用户访问他们不应该拥有的权限或资源。这可能导致数据泄露、数据篡改等问题。
- 防御措施:严格实施基于角色的访问控制(RBAC),并确保敏感操作具有足够的授权检查。
-
Cryptographic Failures
- 描述:不当的加密实践或加密算法的使用不当,可能导致敏感数据(如密码、信用卡信息)被暴露或窃取。
- 防御措施:使用最新的加密标准(如AES-256-GCM、RSA-2048),并避免使用弱或过时的加密算法。
-
A03:2023 - Injection
- 描述:应用未能对用户输入进行有效的验证或转义,导致恶意代码注入(如SQL注入、命令注入)并执行在服务器上。
- 防御措施:使用参数化查询、输入验证、输出转义技术,避免拼接SQL或动态代码。
-
** Insecure Design**
- 描述:系统在设计阶段未考虑安全问题,导致应用架构中的基本安全漏洞。
- 防御措施:在开发生命周期中引入威胁建模、攻击面分析等设计阶段的安全审查。
-
Security Misconfiguration
- 描述:错误的配置(如不安全的默认设置、过时的软件或未配置的安全功能),可能使应用程序面临攻击。
- 防御措施:定期审计和测试系统配置,使用自动化工具识别和修复配置问题。
-
Vulnerable and Outdated Components
- 描述:使用了具有已知漏洞或未及时更新的第三方库和组件,可能被攻击者利用。
- 防御措施:确保使用依赖管理工具(如Maven、npm),并定期更新组件,避免使用过时的版本。
-
Identification and Authentication Failures
- 描述:认证和身份验证流程中的缺陷,可能导致用户冒充、会话劫持等问题。
- 防御措施:实施强密码策略、使用多因素认证(MFA)和加固会话管理机制。
-
Software and Data Integrity Failures
- 描述:未能保证软件更新和数据的完整性,可能使攻击者篡改关键数据或上传恶意更新。
- 防御措施:使用签名机制来验证更新包的完整性,确保数据在传输和存储过程中的可靠性。
-
Security Logging and Monitoring Failures
- 描述:缺乏适当的日志记录和监控,无法有效检测、响应或追踪安全事件。
- 防御措施:实施集中化的日志记录、主动的监控和告警系统,确保能够及时发现并响应异常行为。
-
Server-Side Request Forgery (SSRF)
- 描述:攻击者通过伪造服务器端的请求来获取未授权的内部资源或数据,通常利用未受限制的服务器端请求机制。
- 防御措施:限制服务器端可以发起的请求范围,避免允许用户输入直接控制服务器端的请求参数。
重点风险与防御措施建议
-
Broken Access Control:最重要的防御措施是定期审查权限设计,确保每个用户只能访问必要的资源。建议结合应用的访问控制系统与自动化测试工具,确保权限配置不被篡改。
-
Cryptographic Failures:确保敏感数据加密和密钥管理机制符合行业标准,如使用硬件安全模块(HSM)来保护密钥。避免明文传输或存储敏感数据。
-
Injection:对于Web应用来说,防止注入攻击的最佳实践是始终使用参数化查询和预编译的语句。严禁直接拼接用户输入构建SQL或命令。
-
Security Misconfiguration:安全配置管理应作为持续改进的一部分,尤其是在引入新服务或更新系统时,保持自动化的安全配置审计机制至关重要。
-
SSRF:严格限制后端服务器能够访问的网络和资源,禁止对内部资源(如metadata或本地IP)发起请求。
SSRF 导图
SSRF 概念
SSRF(服务端请求伪造)是一种攻击类型,攻击者通过伪造服务器端请求来访问本不应该暴露的内部资源或外部资源。SSRF攻击的本质是利用服务器作为代理,发送请求到攻击者指定的目标(如内部网络资源、外部服务等),从而绕过客户端的防火墙、访问控制或认证机制。
SSRF的工作原理
-
输入控制不当:应用程序允许用户输入一个URL,然后服务器使用该URL发起请求。若未对该URL进行严格的验证,攻击者可以提供恶意的URL来访问内部或敏感资源。
-
目标资源访问:通常攻击者通过SSRF尝试访问的目标包括:
- 内部网络服务:如数据库、缓存系统(Redis、Memcached)、内部管理服务等。
- 本地主机:利用
127.0.0.1
或localhost
访问本地管理接口。 - 云服务元数据:如AWS、GCP等云服务的实例元数据服务(可通过访问
http://169.254.169.254
获取云实例的敏感信息,如访问凭证)。
SSRF攻击场景
-
内部资源扫描:攻击者可能利用SSRF对目标服务器的内部网络进行端口扫描,识别内部服务。
-
访问云服务元数据:在云环境下,SSRF攻击常用于获取云实例元数据,进而获取敏感信息,如访问凭证或配置文件。
-
强制认证服务:某些Web应用将对外服务作为身份验证的依赖(例如OAuth),SSRF攻击可以伪造服务器请求,以获取未授权的访问。
-
攻击内部应用程序:攻击者通过伪造请求访问内部管理应用(如Kubernetes管理端口、API网关等),进一步扩大攻击面。
SSRF防御策略
1. 严格验证用户输入
- 限制可访问的URL范围:对允许用户输入的URL或IP地址进行严格限制,仅允许服务器访问白名单中的域名或IP地址。
- DNS解析验证:禁止解析本地IP(如
127.0.0.1
、localhost
)或私有IP地址(如10.0.0.0/8
、192.168.0.0/16
、169.254.169.254
)。 - URL验证:解析用户输入的URL,确保其不指向内部网络或敏感资源。
2. 禁用或限制对内部网络的访问
- 防火墙规则:使用网络防火墙或安全组策略,限制服务器发出不必要的外部或内部请求。特别是禁止访问私有IP地址空间。
- 隔离内部网络服务:将关键服务(如数据库、缓存系统、管理接口等)置于隔离网络中,避免被SSRF攻击访问。
3. 强制使用外部API代理
- 如果应用程序需要访问外部服务,可以通过安全代理中转,而不是直接发起请求。代理可以集中控制、过滤和监控所有外部请求,并检测潜在的SSRF行为。
4. 禁止直接访问敏感资源
- 云实例元数据服务:在云环境下,禁用或限制实例对元数据服务的访问。AWS、GCP等云平台提供了防止元数据滥用的安全配置,如IAM角色权限限制。
5. 输入内容长度限制
- 限制用户输入的最大URL长度,并通过正则表达式过滤恶意的输入字符,确保URL中的协议、主机名等部分合法。
6. 检测和监控
- 日志记录:记录所有发出的外部请求,特别是那些通过用户输入生成的请求,帮助识别潜在的SSRF攻击。
- 异常行为检测:使用监控工具检测来自服务器的异常请求行为(如访问内部IP地址或未预期的URL模式)。
7. 确保对HTTP请求的处理安全
- 使用GET/POST参数处理库:确保处理URL时不允许恶意协议(如
file://
、ftp://
等)通过,从而限制URL的可能性。 - 第三方库安全审查:确保应用程序使用的HTTP请求库是安全的,且没有已知的漏洞,如HTTP协议走私攻击。
SSRF防御实现方案
基于Spring Boot的实现例子:
1. 白名单限制实现
可以通过自定义的URL验证器来限制URL的访问范围:
public boolean isValidURL(String url) {
// 允许访问的域名白名单
List<String> allowedDomains = Arrays.asList("https://trusted-domain.com");
try {
URL parsedUrl = new URL(url);
String host = parsedUrl.getHost();
return allowedDomains.contains(host);
} catch (MalformedURLException e) {
return false;
}
}
2. 阻止私有IP地址的请求
阻止访问私有IP地址,如127.0.0.1
、192.168.x.x
等:
public boolean isPublicIP(String ip) {
// 禁止访问私有IP
if (ip.startsWith("10.") || ip.startsWith("192.168.") || ip.startsWith("127.") || ip.equals("localhost")) {
return false;
}
return true;
}
3. 代理服务器中转外部请求
使用代理服务器来控制所有外部请求,防止直接暴露内部资源:
public String fetchContentThroughProxy(String url) {
String proxyUrl = "https://proxy-server.com/api?url=" + url;
RestTemplate restTemplate = new RestTemplate();
return restTemplate.getForObject(proxyUrl, String.class);
}
应用场景分析
-
动态URL生成场景
在许多Web应用中,URL是动态生成的。例如,用户可以提交外部资源URL进行抓取或使用,或者应用从数据库或外部服务获取并展示内容。这种场景下,攻击者可能通过伪造的URL引发SSRF攻击,进而访问服务器的内部资源。 -
代理请求场景
代理通常用于中转应用发出的HTTP请求。若代理未能正确过滤和验证请求内容,攻击者可能通过代理访问不受控制的资源,或借助代理规避安全限制。
测试方案:动态生成的URL安全性监控
1. 输入验证与限制
在接受用户提供的URL时,应严格限制输入源,并进行测试以确保任何伪造或恶意URL都被拒绝。
-
白名单测试:对应用允许的外部服务地址进行白名单配置,并测试仅允许白名单域名访问。例如,提交一个不在白名单中的域名,验证是否正确拒绝请求。
-
本地IP阻止测试:提交目标为本地IP地址(如
127.0.0.1
或localhost
)的URL,确保此类请求被阻止。例如:// 测试使用本地 IP assertFalse(isPublicIP("127.0.0.1")); assertFalse(isPublicIP("localhost")); assertFalse(isPublicIP("192.168.1.1"));
-
协议限制测试:确保仅允许HTTP和HTTPS协议,测试提交不支持的协议(如
file://
、ftp://
等),并验证这些请求是否被阻止。public boolean isValidProtocol(String url) { try { URL parsedUrl = new URL(url); String protocol = parsedUrl.getProtocol(); return protocol.equals("http") || protocol.equals("https"); } catch (MalformedURLException e) { return false; } } // 测试 assertTrue(isValidProtocol("https://example.com")); assertFalse(isValidProtocol("ftp://example.com"));
2. DNS解析监控与测试
确保应用程序在DNS解析时不允许私有地址返回,尤其是针对URL中可能解析到私有IP地址的情况。通过自动化测试工具模拟恶意DNS解析,以确保即使攻击者尝试使用恶意DNS服务器,私有IP的请求也会被阻断。
3. 限速与黑名单
针对多次重复请求或高频请求,可以设置限速机制,并监控是否有过多的失败访问行为。比如当某个IP地址频繁访问被禁止的URL或敏感资源时,自动将其列入黑名单。
- 限速测试:设置每个IP的请求频率,并测试超过阈值时,是否阻止进一步的请求。
- 黑名单测试:向系统提交恶意的IP地址,验证其能否自动加入黑名单。
测试方案:代理请求监控
1. 代理安全性监控
通过代理的外部请求必须经过严格验证,确保代理仅处理来自可信来源的请求。
-
代理URL验证:确保代理在处理请求前会对URL进行再次验证,包括协议、域名及IP地址等。针对URL中可能包含的恶意子域或重定向行为进行测试,确保代理正确过滤恶意请求。
-
代理限速测试:在代理服务器上,测试其是否能够在高负载或异常请求量的情况下,识别并阻止恶意用户。可以模拟大量伪造请求,监控代理的表现。
-
代理的日志与告警系统:在代理服务器上实施日志记录,测试日志是否能正确记录每次请求的详细信息,特别是失败请求的原因。同时,确保系统在发生异常行为时发出告警。例如,代理在处理本地IP请求时,触发安全告警。
2. 代理验证与认证
确保所有通过代理发起的请求都有验证机制。代理不仅仅是一个简单的中转站,它应该对客户端的每个请求进行身份认证。
-
身份认证测试:确保代理只允许认证用户访问外部资源,未认证的请求会被拒绝或跳转至认证页面。可以设计测试场景,模拟未认证的用户发起请求并检查代理行为。
-
密钥与令牌管理:对所有代理请求使用安全令牌或密钥验证,并模拟攻击者尝试绕过验证过程,确保代理可以识别并阻止非法请求。