SSRF漏洞

SSRF(服务器端请求伪造)是一种安全漏洞,允许攻击者利用服务端发起请求。本文探讨了SSRF的原理、绕过方案,包括点分割符号替换、本地回环地址、IP进制转换等,并讲解了防御措施,如URL参数过滤和限制高危协议。还介绍了Fast-CGI协议的利用,以及如何利用Gopherus工具生成payload。同时,提到了Redis协议在未授权访问情况下的安全风险。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SSRF(Server-Side Request Forgery:服务器端请求伪造)
严正声明:本文仅限于技术讨论,严禁用于其他用途。

ssrf漏洞原理

  • 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞
  • SSRF漏洞形成的原因主要是服务端提供了从其他服务器应用获取数据的功能,并且未对客户端所传输过来的URL参数进行严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发起请求,并返回对该目标地址请求的数据
  • 数据流:攻击者----->服务器---->目标地址

绕过方案

  • 一般情况下利用URL解析导致SSRF过滤被绕过基本上都是因为后端通过不正确的正则表达式对URL进行了解析。而在2017年的Blackhat大会上,Orange Thai 在blackhat中发表的演讲《A New Era of SSRF - Exploiting URL Parser in Trending Programming Languages! 》中介绍了SSRF攻击的一个新的角度———利用不同编程语言对URL的处理标准来绕过SSRF过滤,从而实施攻击。该方式主要是利用URL解析器和URL请求器之间的差异性发起攻击,由于不同的编程语言实现URL解析和请求是不一样的,所以很难验证一个URL是否合法

很难验证一个URL是否合法的原因在于:

1.在 RFC2396/RFC3986 中进行了说明,但是也仅仅是说明。2.WHATWG(网页超文本应用技术工作小组)定义了一个基于RFC协议的具体实现,但是不同的编程语言仍然使用他们自己的实现。

下图展示了cURL请求函数与其他语言解析函数结合使用时,由于差异性造成的漏洞
image.png
可以得知,NodeJS url、Perl URI、Go net/url、PHP parser_url以及Ruby addressable解析函数与cURL libcurl请求函数差异性都可能造成漏洞的产生
下图的实例中,我们看到上述所述编程语言的解析函数得到的IP是google.com,而cURL请求得到的却是evil.com:80
image.png

curl—命令行工具

  • 命令行工具,可以从shell或者脚本中运行该工具。
  • 提供了130多种不同的“flags”
  • 通常被用来模拟浏览器的行为
  • 跨平台

libcurl—库

  • 用作其他程序的开发库
  • 可以与许多语言想结合,如PHP、C++
  • 跨平台
  • 提供了多种不同的使用它的APIs

相同点

  • curl和libcurl都可以利用多种多样的协议来传输文件,包括HTTP, HTTPS, FTP, FTPS, GOPHER, LDAP, DICT, TELNET and FILE等。

不同点

  • curl是命令行工具,可以通过shell或脚本来运行curl。curl底层所使用的库是libcurl。
  • libcurl是一个库,通常与别的程序绑定在一起使用,如命令行工具curl就是封装了libcurl库。所以我们也可以在你自己的程序或项目中使用libcurl以获得类似CURL的强大功能。接下来将要介绍的PHP扩展就是对curl的一个封装。

①点分割符号替换

在浏览器中可以使用不同的分割符号来代替域名中的.分割,可以使用来代替:

http://www。qq。com
http://www。qq。com
http://www.qq.com
无效的绕过方式

②本地回环地址

127.0.0.1,通常被称为本地回环地址(Loopback Address),指本机的虚拟接口,一些表示方法如下(ipv6的地址使用http访问需要加[]):

http://127.0.0.1 
http://localhost 
http://127.255.255.254 
127.0.0.1 - 127.255.255.254 
http://[::1] 
http://[::ffff:7f00:1] 
http://[::ffff:127.0.0.1] 
http://127.1 
http://127.0.1 
http://0:80

image.png

③IP的进制转换

IP地址是一个32位的二进制数,通常被分割为4个8位二进制数。通常用“点分十进制”表示成(a.b.c.d)的形式,所以IP地址的每一段可以用其他进制来转换。 IPFuscator 工具可实现IP地址的进制转换,包括了八进制、十进制、十六进制、混合进制。在这个工具的基础上添加了IPV6的转换和版本输出的优化。

在脚本对IP进行八进制转换时,一些情况下会在字符串末尾多加一个L。

image.png

④封闭式字母数字 (Enclosed Alphanumerics)字符

封闭式字母数字是一个由字母数字组成的Unicode印刷符号块,使用这些符号块替换域名中的字母也可以被浏览器接受。在浏览器测试中只有下列单圆圈的字符可用:

List:
① ② ③ ④ ⑤ ⑥ ⑦ ⑧ ⑨ ⑩ ⑪ ⑫ ⑬ ⑭ ⑮ ⑯ ⑰ ⑱ ⑲ ⑳ 
⑴ ⑵ ⑶ ⑷ ⑸ ⑹ ⑺ ⑻ ⑼ ⑽ ⑾ ⑿ ⒀ ⒁ ⒂ ⒃ ⒄ ⒅ ⒆ ⒇ 
⒈ ⒉ ⒊ ⒋ ⒌ ⒍ ⒎ ⒏ ⒐ ⒑ ⒒ ⒓ ⒔ ⒕ ⒖ ⒗ ⒘ ⒙ ⒚ ⒛ 
⒜ ⒝ ⒞ ⒟ ⒠ ⒡ ⒢ ⒣ ⒤ ⒥ ⒦ ⒧ ⒨ ⒩ ⒪ ⒫ ⒬ ⒭ ⒮ ⒯ ⒰ ⒱ ⒲ ⒳ ⒴ ⒵ 
Ⓐ Ⓑ Ⓒ Ⓓ Ⓔ Ⓕ Ⓖ Ⓗ Ⓘ Ⓙ Ⓚ Ⓛ Ⓜ Ⓝ Ⓞ Ⓟ Ⓠ Ⓡ Ⓢ Ⓣ Ⓤ Ⓥ Ⓦ Ⓧ Ⓨ Ⓩ 
ⓐ ⓑ ⓒ ⓓ ⓔ ⓕ ⓖ ⓗ ⓘ ⓙ ⓚ ⓛ ⓜ ⓝ ⓞ ⓟ ⓠ ⓡ ⓢ ⓣ ⓤ ⓥ ⓦ ⓧ ⓨ ⓩ 
⓪ ⓫ ⓬ ⓭ ⓮ ⓯ ⓰ ⓱ ⓲ ⓳ ⓴ 
⓵ ⓶ ⓷ ⓸ ⓹ ⓺ ⓻ ⓼ ⓽ ⓾ ⓿
ⓧⓘⓐⓝⓞⓤⓟⓔⓝⓖ.ⓒⓞⓜ 
①⑦②.①⑥.⑥⓪.①⑥⑥
经测试,不可行,也许有其他方式

浏览器访问时会自动识别成拉丁英文字符:

ⓔⓧⓐⓜⓟⓛⓔ.ⓒⓞⓜ  >>>  example.com

⑤URL十六进制编码

URL十六进制编码可被浏览器正常识别,编码脚本:

#-*- coding:utf-8 -*- 
data = "www.qq.com"; 
alist = [] 
for x in data: 
    for i in range(0, len(x), 2): 
        alist.append((x[i:i+2]).encode('hex')) 
print "http://%"+'%'.join(alist)

<think>嗯,用户让我介绍一下SSRF漏洞。好的,首先我得确保自己正确理解SSRF是什么。SSRF全称是Server-Side Request Forgery,也就是服务器端请求伪造。我记得这是指攻击者能够诱使服务器发送恶意请求的一种漏洞。对吧? 那用户可能需要知道SSRF的基本概念、原理、危害,还有如何防范。可能需要分步骤来讲解。首先,得解释SSRF的定义,然后讲讲它的工作原理,接着是常见的攻击场景,带来的危害,最后是防御方法。 不过,我得确认自己记得没错。比如,SSRF通常是利用服务器作为代理,去访问内部或外部的资源。比如,如果应用程序允许用户输入一个URL,然后服务器去获取那个URL的内容,攻击者可能构造一个指向内部系统的URL,比如访问内网的数据库管理界面,或者云服务器的元数据接口,这样就能获取敏感信息。 对了,云环境的元数据服务是一个常见的目标,比如AWS的169.254.169.254。攻击者通过SSRF访问这个地址,可能获取实例的临时凭证,进而控制整个实例。所以,这类漏洞的危害挺大的,特别是现在云服务普及的情况下。 接下来,攻击场景可能有几种:比如,用户上传图片时输入URL,服务器会去下载这个图片,但攻击者可能提交一个内网地址。或者,网页中有转码、预览功能,需要访问用户提供的链接,这时候可能被利用。 然后,关于危害,除了访问内网系统,还可能绕过防火墙,或者进行端口扫描,探测内网开放的服务。另外,如果服务器有权限访问某些外部系统,比如OSS,攻击者可能利用服务器身份进行未授权操作。 防御方面,通常需要限制服务器发起的请求。比如,禁止访问内网IP,或者只允许访问白名单域名。还有,过滤用户输入的URL,检查协议是否允许(比如只允许HTTP/HTTPS),禁止使用非标准端口或者危险协议如file://、gopher://等。此外,服务器在处理响应时,应该禁用重定向,因为攻击者可能利用重定向绕过某些限制。 另外,可能需要验证用户提供的URL是否在允许的范围内,比如使用正则表达式检查域名是否属于可信列表。同时,服务器发起请求时,应该设置适当的超时,避免被利用进行DoS攻击。 不过,有没有例外情况呢?比如某些应用确实需要访问内部服务,这时候可能需要更复杂的验证机制,或者使用中间层来代理请求,确保安全性。另外,网络层的防御,比如设置严格的出站规则,限制服务器只能访问必要的IP和端口,也是很重要的。 用户可能还需要知道如何检测SSRF漏洞,比如通过输入不同的URL,观察服务器的响应,或者检查是否有请求发出。工具方面,可以使用Burp Suite等拦截请求,修改参数测试是否存在漏洞。 还有,一些框架或库可能有内置的防护机制,需要开发者正确配置。例如,在Java中,使用HttpURLConnection时默认会跟随重定向,这可能被利用,所以要禁用自动重定向。 哦,对了,有时候SSRF还可以和其他漏洞结合,比如XXE(XML外部实体注入),因为处理XML时可能会解析外部实体,导致SSRF。这种情况下,防御需要同时处理这两种漏洞。 总结下来,SSRF的关键点在于控制服务器发起的请求,攻击者通过输入恶意URL让服务器访问不应暴露的资源。防御需要多层面,包括输入验证、网络限制、协议过滤等。 现在得把这些整理成结构清晰的回答,分步骤解释,确保用户能理解。可能还需要举一些例子,比如常见的漏洞场景,帮助用户更直观地认识问题。同时,强调危害性,让用户重视防御措施。</think>### SSRF漏洞介绍 #### 1. **基本概念** **SSRF**(Server-Side Request Forgery,服务器端请求伪造)是一种攻击者通过构造恶意请求,诱使服务器向内部或外部系统发起非预期网络请求的安全漏洞。其核心问题是服务器未对用户提供的URL或路径进行严格校验,导致攻击者可利用服务器作为代理访问受限资源。 --- #### 2. **漏洞原理** - **攻击链**: ``` 用户输入恶意URL → 服务器发起请求 → 访问内部/外部资源 → 返回敏感数据或执行未授权操作 ``` - **关键点**: - 服务器信任自身发起的请求(绕过防火墙)。 - 用户可控制请求的目标地址或参数(如URL、IP、协议)。 --- #### 3. **常见攻击场景** - **访问内部系统**: 例如:探测内网服务(数据库、Redis)、云服务器元数据(如AWS的`http://169.254.169.254`)。 - **绕过访问控制**: 通过服务器身份访问外部受限资源(如OSS存储桶)。 - **端口扫描**: 探测内网开放端口(如`http://example.com:8080`)。 - **协议滥用**: 利用`file://`读取本地文件,或`gopher://`构造任意TCP请求。 --- #### 4. **漏洞危害** - **敏感信息泄露**: 获取内网数据、云服务凭证、配置文件等。 - **内部服务攻击**: 攻击内网应用(如未授权访问管理界面)。 - **间接漏洞利用**: 结合其他漏洞(如XXE)扩大攻击面。 --- #### 5. **防御方法** - **输入过滤**: - 校验用户输入的协议(仅允许HTTP/HTTPS)。 - 禁止访问内网IP段(如`127.0.0.1`、`192.168.0.0/16`)。 - 使用正则表达式限制域名白名单(如`^.*example.com$`)。 - **协议控制**: - 禁用危险协议(如`file://`、`gopher://`)。 - **网络隔离**: - 服务器出站流量限制为必要的外网IP和端口。 - **响应处理**: - 禁用自动重定向(防止绕过过滤)。 - 不返回原始响应内容(避免信息泄露)。 - **代码层防护**: - 使用安全库(如Python的`requests`禁用`allow_redirects`)。 --- #### 6. **测试与验证** - **手工测试**: 输入`http://localhost:8080`或`http://169.254.169.254`,观察是否返回内部数据。 - **工具辅助**: 使用Burp Suite拦截请求,修改参数测试不同目标。 --- #### 7. **案例分析** - **云元数据泄露**: 攻击者通过SSRF访问`http://169.254.169.254/latest/meta-data/`,获取云服务器临时密钥,进而控制实例。 - **内网Redis未授权访问**: 构造`http://127.0.0.1:6379`,通过Redis写入SSH公钥实现权限提升。 --- #### 8. **总结** SSRF漏洞的防御需要结合输入校验、网络隔离、协议控制等多层措施。开发人员需严格验证用户输入的URL,并限制服务器的网络访问权限,以降低风险。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值