我的web服務-Proxy Checker現在正式上線了!你可以使用它來測試代理伺服器的安全性。原始碼將會在稍後公佈出來。
由於我於2013年所發表的文章《為什麼免費的代理會是免費的?》在Reddit網上收到了廣泛的好評,所以我決定我將繼續發表一篇相關文章。這一次,我將會嘗試尋找一種使用了我在文章中所描述技術的代理服務。
所以,我寫了一個非常簡易的指令碼(實際上是一個php函式),這個指令碼會從不同的地方呼叫各種Javascript指令碼檔案,並且通過這些檔案來檢查修改過的內容。
如果你對程式碼不感興趣,你可以跳轉至掃描部分。
我所說的“非常簡易”,是真的非常簡易,因為下面的程式碼就是整個函式:
1 2 3 4 5 6 7 8 9 10 11 12 |
function scanProxy($proxy,$url,$socks=true,$timeout=10) { $ch = curl_init($url); $headers["User-Agent"] = "Proxyscanner/1.0"; curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_HEADER, 0); //we don't need headers in our output curl_setopt($ch, CURLOPT_HTTPPROXYTUNNEL, 0); curl_setopt($ch, CURLOPT_CONNECTTIMEOUT ,$timeout); curl_setopt($ch, CURLOPT_TIMEOUT, $timeout); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return output as string $proxytype = ($socks?CURLPROXY_SOCKS5:CURLPROXY_HTTP); //socks or http proxy? if($proxy) { curl_setopt($ch, CURLOPT_PROXY, $proxy); curl_setopt($ch, CURLOPT_PROXYTYPE, $proxytype); } $out = curl_exec($ch); curl_close($ch); return trim($out); } |
如果你需要檢視我在掃描時所使用的完整指令碼檔案,你可以點選這裡獲取。我沒有為大家提供一個代理服務的列表,但是獲得這樣的一個列表並不是什麼難事。
我最近正在開發一個開源的web端服務,該服務名為Proxy Check,它正是基於這個函式而開發的。在網站上,你可以測試你在網上所找到的代理。我計劃過幾天將這個服務上線。
如果需要測試代理服務,你僅僅需要將代理的檔案/指令碼/圖片/頁面等資料的URL地址遞交上去,然後它將會把測試資料返回給你。
下面是一個簡單的使用示例:
1 2 3 4 5 6 7 8 9 10 |
//requesting a JS file from this blog $proxy_data=scanProxy('127.0.0.1:9050','https://blog.haschek.at/js/blog.js'); //requesting reference data so we can check if something is altered $reference_data=scanProxy(false,'https://blog.haschek.at/js/blog.js'); if(($proxy_data!=$reference_data) && $reference_data) //if the data is different but the proxy has sent something echo "[!] Proxy modified the content!\n"; else if(!$reference_data) echo "[-] Proxy is down\n"; else echo "[+] Proxy did not modify the content\n"; |
你可以通過使用這個函式,來完成各種各樣的分析和測試
- 你可以通過訪問網站http://ip.haschek.at來檢視代理是否隱藏了你的IP地址,該網站會顯示出你的IP地址,並且你可以通過查詢相關參考資料來確定這個IP地址是否與你的公共IP地址相同。
- 檢查代理是否使用了HTTPS隧道通訊。如果沒有使用,那麼可能是因為伺服器的所有者只需要得到明文資訊,以便於他們從你的通訊資訊中提取出相關的資料。
- 檢測代理是否向靜態網站中新增了任何的資料資訊(例如:廣告)
讓我們來對443個免費代理進行檢測
我從各種地方收集到了大量的代理,但我通過Google搜尋發現,所有的這些代理都指向了某些固定站點。
我們到底需要檢測什麼?
- 是否允許使用HTTPS?
- JS指令碼是否被修改?
- 靜態網站頁面內容是否被修改?
- 代理會隱藏我的IP地址嗎?
檢測結果
測試 結果
測試數量 443(100%)
線上 199(44.9%)
線下 244(55.1%)
未使用HTTPS 157(79%)
JS檔案被修改 17(8.5%)
HTML頁面被修改 33(16.6%)
沒有隱藏IP地址 0(0%)
網頁內容沒有修改 149(75%)
所以,75%的代理都是安全的,對嗎?
代理沒有修改你的資料內容,並不意味著它就是安全的。如果你想要安全地使用一個免費代理,唯一的方法就是使用支援HTTPS的代理,並且只訪問強制使用HTTPS的網站。但是,目前僅有21%的代理支援HTTPS通訊。
結果
網上免費的代理伺服器往往是離線的,這並不令人驚訝,但是我並不希望這麼多的代理伺服器都將HTTPS通訊禁止了。他們禁止HTTPS通訊是有原因的,因為他們想要使用者去使用HTTP進行通訊,這樣他們便可以分析你的通訊資訊,並且竊取你的登入資訊了。
在上述的199(8.5%)個代理裡面,僅有17個代理修改了JS指令碼,而且其中大多數的代理是為了向客戶頁面注入廣告。但是其中有兩個網站的修改資訊卻是錯誤資料或者網頁過濾器的警告資訊。
有33個代理伺服器(16.6%)修改了靜態HTML網頁資訊並且 注入了廣告。其中,大多數的代理伺服器在指令碼結束標籤之前注入了下列的程式碼:
<link rel="stylesheet" type="text/css" href="http://ads.adt100.com/css/bottom.css" /><div id="center_xad" class="cwindow_xad"><div class="center_title_xad" id="center_title_xad"><img onclick="closeWindow()" width="39px" id="cwindow_xclose" height="11px" src="http://ads.adt100.com/images/close_btn.gif"></div><div id="center_xad_cnt" class="injection_content"></div></div><div id="right_xad" class="window_xad"><div class="right_title_xad" id="right_title_xad"><img onclick="closeWindow()" id="cwindow_rclose" width="39px" height="11px" src="http://ads.adt100.com/images/close_btn.gif"></div><div id="right_xad_cnt" class="injection_content"></div></div><script src="http://ads.adt100.com/js/bottom.js"></script>
這絕對是惡意廣告軟體,而且還有可能會導致cookie被竊取。我並沒有對這些程式碼進行進一步的研究,但是如果你想要對它們進行研究,那麼當你有任何發現的時候,請你告知我。
其他代理服務的廣告注入則顯得更加的隱蔽。他們在頁面頭部插入了一個指令碼標籤,如下所示:
<script type="text/javascript" charset="utf-8" mediaproAccountID="0" mediaproSlotID="0" usermac="" src="/7b26d4601fbe440b35e496a0fcfa15f7/00212600d7e6/w1/i.js" async="async" defer></script><meta charset="utf-8">
在這裡,有趣的事情就是這些程式碼看似指向一個本地的JS指令碼檔案。當瀏覽器通過代理請求呼叫這個檔案的時候,代理會劫持這個請求,並且以受感染的JS檔案進行回應。正如其他的連結一樣,這並不是一個跨域JS連結,這樣做非常的聰明。
如果你依舊認為你必須使用這些免費的代理服務,那麼請你嘗試使用支援HTTPS通訊的代理服務,並且儘量只瀏覽那些安全效能夠得到保障的網站。