java代码审计-ssrf
描述
SSRF(Server-Side Request Forgery:服务器端请求伪造) 是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。一般情况下,SSRF攻击的目标是从外网无法访问的内部系统。
SSRF漏洞形成的原因大部分是因为服务端提供了可以从其他服务器获取资源的功能,然而并没有对用户的输入以及发起请求的url进行过滤&限制,从而导致了ssrf的漏洞。
常见漏洞地址
- 抓取用户输入图片的地址并且本地化存储
- 从远程服务器请求资源
- 对外发起网络请求
利用方式
-
利用file协议读取文件内容(仅限使用 URLConnection|URL 发起的请求)
-
利用http 进行内网web服务端口探测
-
利用http 进行内网非web服务端口探测(如果将异常抛出来的情况下)
-
利用http进行ntlmrelay攻击(仅限 HttpURLConnection 或者二次包装 HttpURLConnection 并未复写
-
AuthenticationInfo 方法的对象)
审计技巧
-
全局查找
URLConnection
、HttpURLConnection
、HttpClient
、Request
、okhttp
、OkHttpClient
、Request.Get
、Request.post
、URL.openStream
、ImageIO
等能够发起远程请求的类及函数,找到对应地址后打断点跟踪引用其的方法调用栈,从客户端传参开始,判断是否可控,及可控情况 -
SSRF漏洞URL中常出现url、f、file、page等参数。
漏洞防御
- 正确处理302跳转(在业务角度看,不能直接禁止302,而是对跳转的地址重新进行检查)
- 限制协议只能为http/https,防止跨协议
- 设置内网ip黑名单(正确判定内网ip、正确获取host)
- 设置常见web端口白名单(防止端口扫描,可能业务受限比较大)
参考地址:
-
山石JavaWeb靶场的sql注入相关页面,具体代码见
com.hillstone.controller.sqli
-
https://www.leavesongs.com/PYTHON/defend-ssrf-vulnerable-in-python.html)