首页 > 编程语言 >java基础漏洞学习----SSRF漏洞

java基础漏洞学习----SSRF漏洞

时间:2023-10-29 15:55:05浏览次数:28  
标签:java javax ---- 漏洞 import http servlet response

java基础漏洞学习----SSRF漏洞

JAVA的SSRF常见利用协议

仅支持sun.net.www.protocol下所有的协议:http,https,file,ftp,mailto,jar及netdoc
传入的URL必须和重定向后的URL协议一致,JAVA中的SSRF不能和PHP中一样使用gother协议来扩展攻击面

常见的可以发起网络请求,并且会导致SSRF漏洞的写法

1.urlConnection

package com.example.servletdemo;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URL;
import java.net.URLConnection;
import java.io.BufferedReader;
import java.io.InputStreamReader;

public class SSRF1 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        try {
            String url = request.getParameter("url");
            URL u = new URL(url);
            URLConnection urlConnection = u.openConnection();
            BufferedReader reader = new BufferedReader(new InputStreamReader(urlConnection.getInputStream()));
            StringBuilder result = new StringBuilder();
            String line;
            while((line = reader.readLine())!=null){
                result.append(line).append("\n");
            }
            response.getWriter().print(result.toString());
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

web.xml中加入相关路由

    <servlet>
        <servlet-name>SSRF1</servlet-name>
        <servlet-class>com.example.servletdemo.SSRF1</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SSRF1</servlet-name>
        <url-pattern>/SSRF1</url-pattern>
    </servlet-mapping>

造成SSRF漏洞

2.HttpURLConnection
HttpURLConnection继承自URLConnection
修改部分代码

import java.net.HttpURLConnection;
...
            URLConnection urlConnection = u.openConnection();
            HttpURLConnection httpUrl = (HttpURLCommection)urlConnection;
            BufferedReader reader = new BufferedReader(new InputStreamReader(httpUrl.getInputStream()));
            StringBuilder result = new StringBuilder();


3.Request
主代码

package com.example.servletdemo;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.hc.client5.http.fluent.Request;

public class SSRF3 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        try {
            String url = request.getParameter("url");
            String content = Request.get(url).execute().returnContent().toString();
            response.getWriter().print(content);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

pom.xml

        <dependency>
            <groupId>org.apache.httpcomponents.client5</groupId>
            <artifactId>httpclient5-fluent</artifactId>
            <version>5.1.4</version>
        </dependency>


4.openStream
主代码

package com.example.servletdemo;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.google.common.io.Files;

public class SSRF4 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        InputStream inputStream = null;
        OutputStream outputStream = null;

        try {
            String url = request.getParameter("url");
            String downLoadImgFileName = Files.getNameWithoutExtension(url) + "." + Files.getFileExtension(url);
            response.setHeader("content-disposition", "attachment;filename=" + downLoadImgFileName);
            URL u = new URL(url);
            int length;
            byte[] bytes = new byte[1024];
            inputStream = u.openStream();
            outputStream = response.getOutputStream();
            while ((length = inputStream.read(bytes)) > 0) {
                outputStream.write(bytes, 0, length);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                inputStream.close();
            }
            if (outputStream != null) {
                outputStream.close();
            }
        }
    }
}

pom.xml中添加

        <dependency>
            <groupId>com.google.guava</groupId>
            <artifactId>guava</artifactId>
            <version>30.1-jre</version>
        </dependency>

web.xml中添加

    <servlet>
        <servlet-name>SSRF4</servlet-name>
        <servlet-class>com.example.servletdemo.SSRF4</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>SSRF4</servlet-name>
        <url-pattern>/SSRF4</url-pattern>
    </servlet-mapping>


5.HttpClient
主代码

package com.example.servletdemo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;

public class SSRF5 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        response.setContentType("text/html;charset=UTF-8");

        try {
            String url = request.getParameter("url");
            CloseableHttpClient client = HttpClients.createDefault();
            HttpGet httpGet = new HttpGet(url);
            BufferedReader reader = new BufferedReader(new InputStreamReader(client.execute(httpGet).getEntity().getContent()));
            StringBuilder result = new StringBuilder();
            String line;
            while((line = reader.readLine())!=null){
                result.append(line).append("\n");
            }
            response.getWriter().print(result.toString());
            reader.close();
            client.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

pom.xml中添加依赖

            <dependency>
                <groupId>org.apache.httpcomponents</groupId>
                <artifactId>httpclient</artifactId>
                <version>4.5.13</version>
            </dependency>

代码审计

搜索urlConnection,url,Request.HttpClient等

标签:java,javax,----,漏洞,import,http,servlet,response
From: https://www.cnblogs.com/thebeastofwar/p/17767486.html

相关文章

  • 2023/10/29 学习笔记
    学习安装yum源仓库与编译安装Linux中安装软件分三大类:rpm:类似360软件管家红帽公司开发出来的工具编译安装:将源代码编译成可执行文件(二进制包安装)自由度高yum:最后用的还是rpm,它是rpm的升级版本rpm:——查询、安装、卸载查询rpm-q 软件查询h指定软件包是否......
  • python面向对象-学习笔记(三、类方法、实例方法、静态方法)
    方法相关方法的概念描述一个目标的行为动作和函数相似封装了一系列行为动作。比如一个人怎么吃,怎么喝,怎么玩...都可以被调用最主要区别:调用方式方法的划分实例方法:默认第一个参数是一个实例类方法:默认第一个参数是类静态方法:没有默认参数注意划分的依据:方法的第一......
  • 万字长文 | 业内 MySQL 线程池主流方案详解 - MariaDB/Percona/AliSQL/TXSQL/MySQL企
    作者:卢文双资深数据库内核研发本文首发于2023-05-0422:07:40http://dbkernel.com/2023/05/04/mysql-threadpool-main-solutions-details/#本文主要从功能层面对比percona-server、mariadb、阿里云AliSQL、腾讯TXSQL、MySQL企业版线程池方案,都基于MySQL8.0。至于源......
  • 2023-2024-1 20231406 《计算机基础与程序设计》第5周学习总结
    2023-2024-120231406《计算机基础与程序设计》第5周学习总结作业信息这个作业属于哪个课程<班级的链接>(如[2023-2024-1-计算机基础与程序设计](https://edu.cnblogs.com/campus/besti/2023-2024-1-CFAP)这个作业要求在哪里<作业要求的链接>(如2023-2024-1计算机基础......
  • 2023辽宁省赛记
     第一次队里没大腿抱独立参赛,拿下铜奖,可喜可贺!粗略数了一下打星队,去掉打星队是50名!按有效参赛队伍百分之三十算银牌线是46名,所以是铜首,痛失银牌感觉这次题目区分度不是很够,四题从银牌到铜尾脱离疫情的第一次半线下赛,气氛还是很欢乐的,来帮忙的老师和打印的志愿者都很棒中间......
  • python面向对象-学习笔记(四、类相关的补充)
    元类创建类对象的类对象怎么产生的?由类创建出来的。类是不是对象?是所以类对象是不是由另外一个类创建出来的?是,元类创建类对象的另外一种方式#创建类对象的另外一种方式defrun(self):print("run",self)dog=type("Dog",(),{"count":1,"run":run})prin......
  • 数据结构之树(二叉树)
    什么是二叉树(binarytree)?在树结构的基础上,要求其中每个节点最多有两个子节点(一个节点最多有2个边)。二叉树由根节点和若干个左子树和右子树构成,这些子树也都是二叉树。二叉树可以为空树,也可以只包含一个根节点。为什么树形结构常用二叉树呢?就是为了省空间。n叉树,n越大就需要更......
  • python面向对象-学习笔记(五、属性相关的补充)
    私有化属性注意python并没有真正支持私有化,但是可以使用下划线完成伪私有的效果类属性(方法)和实例属性(方法)遵循相同的规则公有属性a在类的内部可以访问在子类的内部可以访问在模块其他地方类的属性可以访问子类的属性可以访问类的实例的属性可以访问子类的......
  • css 多列布局
    1.1多列布局这里感谢小甲鱼,毕竟编程是小甲鱼带入坑了鱼C-Web-CSS-速查1.1.1column-count定义:column-count属性指定某个元素应分为的列数。column-count:number|auto;值说明number列的最佳数目将其中的元素的内容无法流出auto列数将取决于其他属性。......
  • CSS 动画
    1.1过渡transitiontransition:background-size2scubic-bezier(0,.98,.33,1.1);steps()函数可以配合使用steps(5,end)1.2变形transform1.2.1旋转rotate()函数可以配合使用transition:2s;transform:rotate(-180deg);向左旋转,2s旋转1180deg(度)transit......