未经许可,不得转载。
文章目录

阅读本文时,请同时参阅:【Java代码审计 | 第十一篇】SSRF漏洞成因及防范
跨协议
“跨协议”指的是代码能够通过多种协议(如http、https、ftp、file等)访问资源。
例如:
http://example.com:通过HTTP协议访问网页。file:///etc/passwd:通过文件协议访问本地文件。ftp://example.com/file.txt:通过FTP协议下载文件。
在SSRF漏洞中,攻击者可以利用“跨协议”特性,诱使服务器访问本地文件、内网服务或其他非预期的资源。
HTTP请求
在Java中,发送HTTP请求的常见方式有以下几种。
InputStream inputStream = u.openStream();
功能:直接通过URL对象打开一个输入流,读取URL指向的资源内容。
特点:这是一种简单的发起请求的方式。支持跨协议,即可以通过http、https、ftp、file等协议访问资源。
风险:如果URL是用户输入的,攻击者可以利用它访问本地文件(如file:///etc/passwd)或内网服务,导致SSRF漏洞。
URLConnection urlConnection = u.openConnection();
功能:通过URL对象创建一个URLConnection对象,用于更灵活地发起请求。
特点:URLConnection是一个抽象类,支持多种协议(如http、https、ftp、file等)。可以通过urlConnection设置请求头、超时时间等。同样支持跨协议。
风险:如果URL是用户输入的,攻击者可以利用它访问任意协议的资源,导致SSRF漏洞。
HttpURLConnection httpURLConnection = (HttpURLConnection)urlConnection;
功能:将URLConnection对象强制转换为HttpURLConnection对象。
特点:HttpURLConnection是URLConnection的子类,专门用于处理HTTP/HTTPS请求。转换后,只能使用http或https协议,其他协议(如file、ftp)会抛出异常。例如:
- http://example.com(允许)
- https://example.com(允许)
- file:///etc/passwd(不允许,会抛出异常)
优点:通过限制协议类型,可以有效减少SSRF攻击的风险。
InputStream inputStream = urlConnection.getInputStream();
功能:通过URLConnection对象获取输入流,读取响应内容。
特点:如果使用的是HttpURLConnection,则只能读取HTTP/HTTPS的响应内容。如果使用的是普通的URLConnection,则可以读取任意协议的资源内容。
防范
1、限制协议
使用HttpURLConnection,强制限制为HTTP/HTTPS协议。不使用URL.openStream()或URLConnection,除非明确需要支持其他协议。
2、输入验证
对用户输入的URL进行严格的验证,确保其符合预期的格式和范围;使用白名单机制,只允许访问特定的域名或IP地址。
3、禁用危险协议
在代码中检查URL的协议,禁止使用file、ftp等危险协议。

被折叠的 条评论
为什么被折叠?



