SSRF(Server-Side Request Forge, 服务端请求伪造),一般在一些请求url资源的时候会遇到,如?url=https://ip:prot/xxx.jpg请求别的站点的静态资源之类的。
SSRF在PHP中可能骚操作会比较多,主要是因为支持gopher协议,可利用的姿势大概有:
但是java中(高版本jdk)仅支持如下协议
file ftp mailto http https jar netdoc
而低版本的jdk是有gopher的(参考javasec.org)。
- # 构造方法
- new URL(String url)
- 表示一个URL对象
- # openConnection
- public URLConnection openConnection() throws IOException
- 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。
- 每次当调用此URL的协议处理程序的URLStreamHandler.openConnection(URL)方法时, 都会创建一个新的URLConnection实例。
- 应该注意的是,URLConnection实例不会在创建时建立实际的网络连接。 这只会在调用URLConnection.connect()时发生。
- protected URLConnection(URL url)
- 构造与指定URL的URL连接。
URLConnection 可以走邮件、文件传输协议,而HttpURLConnection 就单指浏览器的HTTP协议
也就是说,存在漏洞的代码比如在调用getInputStream时当前的对象为HttpURLConnection对象则只能走http协议去做一些探测内网ip存活/端口探测/打redis(有回显);而如果是URLConnection对象则可以利用file协议进行文件读取。
而对于http/https协议可利用的姿势就比较少,但是java默认在http/https协议会:
但是302跳转后会进行协议判断,总体来说java的SSRF利用姿势依然会很有限。
具体看下图

- BasicHttpRequest
- BasicHttpEntityEnclosingRequest
- DefaultBHttpClientConnection
- getParameter
- HttpURLConnection.getInputStream
- HttpClients.execute
- HttpClient.execute
- HttpClient.executeMethod
- HttpURLConnection.connect
- HttpServletRequest
- HttpClient
- HttpURLConnection
- ImageIO.read
- OkHttpClient.newCall.execute
- okhttp
- Request
- Request.Get.execute
- Request.Post.execute
- URLConnection.getInputStream
- URL.openStream
- URL
- URLConnection
- URI
这个类只能用http协议
@WebServlet("/ssrfServlet")
public class ssrfServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doGet(request, response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String url = request.getParameter("url"); //接收url的传参
String htmlC