• Java代码审计ssrf基础


    SSRF(Server-Side Request Forge, 服务端请求伪造),一般在一些请求url资源的时候会遇到,如?url=https://ip:prot/xxx.jpg请求别的站点的静态资源之类的。

    SSRF在PHP中可能骚操作会比较多,主要是因为支持gopher协议,可利用的姿势大概有:

    1. http协议+burp进行端口探测
    2. http协议进行主机存活探测
    3. file协议读取本地文件
    4. http/gopher/dict打内网redis
    5. gopher打内网其他脆弱服务
    6. 盲SSRF+gopher+302跳转打内网脆弱服务
    7. ......

    但是java中(高版本jdk)仅支持如下协议

    file ftp mailto http https jar netdoc
    

    而低版本的jdk是有gopher的(参考javasec.org)。

    回顾相关的常用类

    URL

    1. # 构造方法
    2. new URL(String url)
    3. 表示一个URL对象
    4. # openConnection
    5. public URLConnection openConnection() throws IOException
    6. 返回一个URLConnection实例,表示与URL引用的远程对象的URL 。
    7. 每次当调用此URL的协议处理程序的URLStreamHandler.openConnection(URL)方法时, 都会创建一个新的URLConnection实例。
    8. 应该注意的是,URLConnection实例不会在创建时建立实际的网络连接。 这只会在调用URLConnection.connect()时发生。

    URLConnection

    1. protected URLConnection(URL url)
    2. 构造与指定URL的URL连接。

    HttpURLConnection与URLConnection的区别

    URLConnection 可以走邮件、文件传输协议,而HttpURLConnection 就单指浏览器的HTTP协议
    

    也就是说,存在漏洞的代码比如在调用getInputStream时当前的对象为HttpURLConnection对象则只能走http协议去做一些探测内网ip存活/端口探测/打redis(有回显);而如果是URLConnection对象则可以利用file协议进行文件读取。

    而对于http/https协议可利用的姿势就比较少,但是java默认在http/https协议会:

    • 默认启用了透明NTLM认证
    • 默认跟随跳转

    但是302跳转后会进行协议判断,总体来说java的SSRF利用姿势依然会很有限。

    具体看下图

    可能存在漏洞的点

    1. BasicHttpRequest
    2. BasicHttpEntityEnclosingRequest
    3. DefaultBHttpClientConnection
    4. getParameter
    5. HttpURLConnection.getInputStream
    6. HttpClients.execute
    7. HttpClient.execute
    8. HttpClient.executeMethod
    9. HttpURLConnection.connect
    10. HttpServletRequest
    11. HttpClient
    12. HttpURLConnection
    13. ImageIO.read
    14. OkHttpClient.newCall.execute
    15. okhttp
    16. Request
    17. Request.Get.execute
    18. Request.Post.execute
    19. URLConnection.getInputStream
    20. URL.openStream
    21. URL
    22. URLConnection
    23. URI

    HttpURLConnection

    这个类只能用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

  • 相关阅读:
    IVF-PQ 基于量化的向量检索算法
    Qt 学习(四) —— QCommandLinkButton命令链接按钮
    油田勘探问题
    购买发票自动化软件(或者文档管理系统)需要注意的问题
    Flink CDC MySQL同步MySQL错误记录
    【组合计数】CF1866 H
    Linux ssh协议
    SSM前后端分离项目(后端:SpringBoot 前端:vue+elementui)
    coding_v3
    Xpansiv收购APX以扩大环保商品市场基础设施规模
  • 原文地址:https://blog.csdn.net/m0_55772907/article/details/127859396