• 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

  • 相关阅读:
    【面试心得】C++ 线程池总结
    计算机毕业设计ssm基于SSM框架的体育馆限流预约管理系统96w25系统+程序+源码+lw+远程部署
    mybatis常见用法总结
    软件工程第七周
    springboot16:指标监控(线上指标监控,微服务,高级特性)
    network-tc-ebpf
    2023NOIP A层联测10 子序列
    ThreadLocal
    React 18 对 state 进行保留和重置
    java VR全景商城免费搭建 saas商城 b2b2c商城 o2o商城 积分商城 秒杀商城 拼团商城 分销商城 短视频商城
  • 原文地址:https://blog.csdn.net/m0_55772907/article/details/127859396