Java编写代理服务器(Burp拦截Demo)一
大家都知道大名鼎鼎的BurpSuite代理神器,對(duì)于抓取HTTP請(qǐng)求非常好用,偶然,一朋友問我Java應(yīng)該如何去編寫代理服務(wù)器(因?yàn)樗胱瞿承〇|西),有沒有相關(guān)的API 去實(shí)現(xiàn),我想說,差不多你能想到的,JAVA都可以做到,沒有任何一門成熟的語言是垃圾的。
在編寫代理服務(wù)器之前,首先應(yīng)該明白一點(diǎn),Java的代理機(jī)制,如圖1-1所示。
那么Java就處于中間這層代理服務(wù)器,代理服務(wù)器所作的事情如下:
1、接收客戶端請(qǐng)求,進(jìn)行處理,然后發(fā)送給服務(wù)端
2、接收服務(wù)端響應(yīng),進(jìn)行處理,然后發(fā)送給客戶端
這樣,就更清晰了,Java給我們提供了代理的API為,java.net.Proxy類。此類表示代理設(shè)置,通常為類型(http、socks)和套接字地址。Proxy 是不可變對(duì)象。
也就是說Java可以制作高級(jí)協(xié)議的代理,如 HTTP 或 FTP。也可以制作SOCKS(V4 或 V5)代理。
在基本的概念說完之后,來實(shí)際操作一把,分為兩個(gè)步驟,第一部分,讓JAVA程序使用代理服務(wù)器,第二步部分,讓我們的Java程序像BurpSuite一樣,來做一個(gè)HTTP的代理服務(wù)器吧。
首先,使用到了URL類,HttpURLConnection類及其我們的代理類Proxy類。他們都位于java.net包中。
第一步:生成代理,指定端口為8888:
第二步:使用URLConnection類進(jìn)行連接www.moonsos.com
URL?url?=?new?URL("http://www.moonsos.com");??//實(shí)例化米安網(wǎng)URL類 HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網(wǎng)頁第三步:打開URL,并且讀取HTML源碼
HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網(wǎng)頁 InputStream?in?=action.getInputStream(); BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(in,"UTF-8")); StringBuilder?sb?=?new?StringBuilder(); String?lin?=?System.getProperty("line.separator")?; for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){ sb.append(temp+lin); } br.close(); in.close(); System.out.println(sb);效果執(zhí)行圖,如圖1-2所示。
完整代碼示例如下:
import?java.net.*?; import?java.io.*?; public?class?ProxyTest{ public?static?void?main(String?args[])throws?Exception{ Proxy?proxy?=?null?; proxy?=?new?Proxy(Proxy.Type.HTTP,new?InetSocketAddress("127.0.0.1",8888));??//?實(shí)例化本地代理對(duì)象,端口為8888 URL?url?=?new?URL("http://www.moonsos.com"); HttpURLConnection?action?=?(HttpURLConnection)url.openConnection(proxy);??//使用代理打開網(wǎng)頁 InputStream?in?=action.getInputStream(); BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(in,"UTF-8")); StringBuilder?sb?=?new?StringBuilder(); String?lin?=?System.getProperty("line.separator")?; for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){ sb.append(temp+lin); } br.close(); in.close(); System.out.println(sb); } }第一部分我們學(xué)會(huì)了Java如何使用代理程序,那么第二部分就看Java制作代理服務(wù)器。
第一步,生成Socket類,作為代理服務(wù)器
ServerSocket?server??=?new?ServerSocket(8888);??//建立本地代理服務(wù)器,端口為8888第二步,等待連接,也就是等待使用代理程序的用戶進(jìn)入,如果沒有用戶進(jìn)入那么,將會(huì)一直在此等待。
Socket socket =server. accept(); ? //等待客戶端連接
第三步,當(dāng)用戶進(jìn)來后,查看用戶數(shù)據(jù)發(fā)送的請(qǐng)求,這里新做了一個(gè)ActionScoket類,多線程,專門用來處理Scoket輸入流,代碼如下所所示。
ServerSocket?server??=?new?ServerSocket(8888); while(true){ Socket?socket?=?server.accept(); ActionSocket?ap?=?new?ActionSocket(socket); ap.start(); } ActionSocket代碼如下: class?ActionSocket?extends?Thread{ private?Socket?socket?=?null?; public?ActionSocket(Socket?s){ this.socket?=?s?; } public?void?run(){ try{ this.action()?; }catch(Exception?e){ e.printStackTrace(); } } public?void?action()?throws?Exception?{ if?(this.socket?==?null){ return?; } BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(this.socket.getInputStream())); for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){ System.out.println(temp); } br.close(); } }完成代碼如下:
import?java.net.*?; import?java.io.*?; class?ActionSocket?extends?Thread{ private?Socket?socket?=?null?; public?ActionSocket(Socket?s){ this.socket?=?s?; } public?void?run(){ try{ this.action()?; }catch(Exception?e){ e.printStackTrace(); } } public?void?action()?throws?Exception?{ if?(this.socket?==?null){ return?; } BufferedReader?br?=?new?BufferedReader(new?InputStreamReader(this.socket.getInputStream())); for(String?temp?=?br.readLine()?;?temp!=null;temp?=?br.readLine()?){ System.out.println(temp); } br.close(); } } public?class?ServerPrxoy{ public?static?void?main(String?args[])throws?Exception{ ServerSocket?server??=?new?ServerSocket(8888); while(true){ Socket?socket?=?server.accept(); ActionSocket?ap?=?new?ActionSocket(socket); ap.start(); } } }給火狐,搜狗等瀏覽器配置代理,如圖1-3所示:
OK,配置完畢,進(jìn)行訪問http://www.moonsos.com,可以發(fā)現(xiàn)我們寫的小程序已經(jīng)能夠進(jìn)行抓取到HTTP協(xié)議信息,如圖1-4所示。
當(dāng)獲取HTTP請(qǐng)求之后,我想后面的東西就不用說了吧。無非就是對(duì)HTTP請(qǐng)求進(jìn)行分析,封裝。然后在時(shí)候Socket發(fā)送。獲取到信息之后,在使用當(dāng)前的Socket以打印流的方式輸出到瀏覽器。
總結(jié)
以上是生活随笔為你收集整理的Java编写代理服务器(Burp拦截Demo)一的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Paxos算法是莱斯利·兰伯特(Lesl
- 下一篇: Rabbit MQ windows下安装