SSRF 漏洞简介
漏洞描述
SSRF(全称Server-Side Request Forgery),即服务器端请求伪造。SSRF是一种由攻击者构造请求,服务端发起请求的漏洞。SSRF攻击的目标是外网无法访问的内部系统(服务端可以请求到与自身相连而与外网隔离的内部系统)。SSRF形成的原因是服务端提供了从其他服务器获取数据的功能,但没有对目标地址做过滤与限制,导致攻击者在服务端从指定URL地址获取内部系统的数据(文件、图片等)。
漏洞危害
1.1、利用漏洞探测其他应用,如对服务器所在的内网环境进行端口扫描、指纹识别、资源访问等。
1.2、利用漏洞攻击其它内网应用(如内网web应用、redis服务等),特定情况可结合内网RCE等漏洞突破互联网边界。
1.3、利用file协议读取服务器本地文件,造成信息泄露风险。
1.4、云上SSRF漏洞可读取云主机的元数据信息。
常见漏洞函数
2.1
Java中的SSRF
2.1.1、HttpURLConnection
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
2.1.2、httpClient
当使用httpClient获取图片二进制流时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
2.1.3、Socket
当使用Socket建立链接判断ip对应端口的联通性,如果host和port参数是由用户输入,且没有对可访问的host和port进行限制,此时就会存在SSRF漏洞,利用SSRF进行端口扫描,漏洞代码示例如下:
String host = request.getParameter("host");
String port = request.getParameter("port");
socket = new Socket(host, port);
2.1.4、OkHttpClient
当使用OkHttpClient发起http请求时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
return response.body().string();
2.1.5、ImageIO
当使用ImageIO读取远程图片时,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
return image;
2.2
Python中的SSRF
python中可以造成SSRF漏洞的库有pycurl、urllib、urllib3、requests等,如urllib库请求一个url,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
print(req.read())
2.3
PHP中的SSRF
2.3.1、curl_exec()
通过get传参变量url,然后再把这个变量url代入curl函数,通过curl_exec发起一个请求,如果url参数可控且没有对url参数进行校验,此时就可能存在SSRF漏洞,可以通过修改url参数来探测、攻击其他应用,漏洞代码示例如下:
?>
2.3.2、file_get_contents()
file_get_content函数从用户指定的url获取内容,并展示给用户。当url参数可控就可能存在SSRF漏洞,此时可以利用file协议读取服务器上任意文件,漏洞代码示例如下:
?>
2.3.3、fsockopen()
fsockopen 函数实现对用户指定url数据的获取,该函数使用socket(端口)跟服务器建立tcp连接,传输数据。变量host为主机名,port为端口,当host和port可控时就可能存在SSRF漏洞,通过遍历host和port进行内网端口扫描,漏洞代码示例如下:
}?>
漏洞案例
3.1
利用SSRF探测攻击其他应用
SSRF漏洞形成的原因大多是由于服务端提供了从其他服务器获取数据的功能但没有对目标地址做过滤与限制。很多网站提供了从其他的服务器上获取数据的功能。通过指定的URL,网站可以从其他地方获取图片、下载文件、读取文件内容等。
3.2
利用file协议读取本地文件
3.3
云上SSRF读取云主机的元数据
ECS实例元数据是指实例ID、VPC信息、网卡信息等实例属性信息,支持在ECS实例内部通过访问元数据服务(Metadata Service)获取。通过该获取方式,您无需登录控制台或调用API,在实例内部即可访问实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。例如,运行在ECS实例中的应用程序,可以通过访问实例元数据服务获取绑定到实例上的RAM角色身份凭证(STS),以在不硬编码凭证的情况下访问授权资源(如OSS、KMS、其他ECS等)。
各个云厂商都有自己的元数据metadata服务,下面的部分云厂商的元数据访问地址:
访问图片地址即可获取读取到的数据
当实例授予了RAM角色时,访问元数据服务就会存在一个ram路径
访问/latest/meta-data/ram/security-credentials/<实例RAM角色名称> 即可获取临时凭据
最终利用临时凭据即可获取实例控制权限
漏洞修复建议
1、屏蔽或过滤返回的详细信息
2、仅允许HTTP和HTTPS请求,禁用高危协议如:file://、gopher://、ftp://、dict://等
3、限制请求的端口为http请求,如:80、443等
4、设置请求的URL白名单或者限制内网IP
5、统一错误信息,避免攻击者可以根据错误信息来判断远端服务器的端口状态
6、针对云上SSRF读取元数据可以设置元数据访问模式为加固模式,即通过token鉴权访问元数据接口
END
参考链接
https://github.com/Cryin/Paper/blob/master/JAVA%E4%BB%A3%E7%A0%81%E5%AE%A1%E8%AE%A1%E4%B9%8BSSRF%E6%BC%8F%E6%B4%9E.md
https://github.com/MisakiKata/python_code_audit/blob/master/SSRF.md
https://www.cnblogs.com/0x7e/p/14463234.html
https://www.cnblogs.com/zpchcbd/p/17839539.html
原文始发于微信公众号(搜狐安全):SSRF 漏洞简介
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论