一、場景
場景描述:請求包host字段跟目的ip端口不一致(客戶端設置了hosts)
測試方法:
a)、在xray配置文件config.yaml中設置漏洞掃描代理(其中8080是burp的代理端口),啟動xray監聽7878端口做代理
xray_windows_amd64.exe webscan --listen 127.0.0.1:7878 --html-output xray-testphp.html
b)、burp開啟攔截模式
c)、開啟wireshark,過濾攔截的流量host www.xxx.com || host 192.168.0.45(攔截hosts的主機跟ip)
d)、發包測試,代碼如下
import requests cobra_proxy_url = { "http": "http://127.0.0.1:7878", "https": "https://127.0.0.1:7878" } cobra_proxy_cert = 'D:/xray/ca.crt' url = "http://192.168.0.45/user/login" method = "GET" headers = { "User-Agent" : "Mozilla/5.0 (Linux; Android 9; V1913A Build/P00610; wv) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.84 Mobile Safari/537.36 newType/wifi", "Accept-Encoding" : "gzip", "Accept" : "*/*", "Connection" : "Keep-Alive", "Host" : "www.xxx.com", "Referer" : "http://www.xxx.com", } requests.request(method, url=url, headers=headers, proxies=cobra_proxy_url, verify=cobra_proxy_cert, timeout=5, allow_redirects=False)
e)、過程就不再詳細說了,直接說結果,通過分析發現:
1、xray會代理第一個請求,第一個請求不會走burp,並且會把hosts改成真實的目的ip(如果使用burp做代理還是www.xxx.com,如下圖)
(圖一、xray作為代理發送請求)
(圖二、burp作為代理發送請求)
2、xray好像只會掃描第一個代理請求返回碼為200的數據包
3、發送第一個請求不會走burp代理,xray再發送payload才會走config.yaml設置的代理,且這時候
host變回www.xxx.com 。。。?????絕望!
這會導致一個問題如果你只想在測試環境使用xray,設置hosts,但是部署xray的那台機器沒有設置hosts(因為xray要代理各種各樣的測試環境,甚至有時候要測試同一個域名對應不同的ip,所以在部署xray的服務器設置hosts不太可能),xray第一個代理包是會發到測試環境(192.168.0.45),但是后面涉及到payload的包都會發送到生產環境(www.xxx.com)
二、嘗試解決方案(還是沒解決)
1、在請求包頭字段設置真實ip端口(X-real-ip,X-real-port),然后在config.yaml設置代理服務器C,C可以做一個解析服務,解析請求包X-real-ip,X-real-port,並發送到真實ip。
這個方案的問題就是xray代理的第一個請求不走config.yaml設置代理服務器C。。。。崩潰
2、買商業版看看能不能提需求,哈哈哈
三、為啥不把請求頭Host字段改成真實ip端口
畢竟xray代理的第一個包就是這么做的,為啥我不直接把host字段改成真實ip呢?因為當一台nginx或者一個ip可以對應多個域名。如果都跟xray一樣直接把請求頭Host字段改成真實ip,請求包到達服務器或者nginx的時候根本不知道這個數據包發給哪個服務
打個廣告
字節跳動,深圳IT大量崗位招人,內推碼