外鏈圖片也有風(fēng)險(xiǎn)嗎?
一直以來,各大論壇和郵箱都允許使用外鏈圖片。一方面解決了上傳和保存帶來的資源消耗,更重要的是方便用戶轉(zhuǎn)載圖片。然而,簡(jiǎn)單的背后是否暗藏著什么風(fēng)險(xiǎn)呢?大多或許認(rèn)為,不就是插入了一張外部圖片而已,又不是什么腳本或插件,能有多大的安全隱患。
曾經(jīng)也有過外鏈圖片泄漏cookie那樣的重大隱患,不過那都是很久以前的事了。在如今瀏覽器日新月異的年代里,這樣的bug已經(jīng)很難遇到了。不過利用正常的游戲規(guī)則,我們?nèi)阅芡娉鲆恍┌踩系男』ㄕ小?/p>
No.1 —— HTTP401
(嚴(yán)重程度:低)
大家都見過,打開路由器的時(shí)候會(huì)彈出個(gè)登錄框。
如果了解HTTP協(xié)議的話,這是服務(wù)器返回401,要求用戶名密碼認(rèn)證。
不過,如果是一個(gè)圖片的請(qǐng)求,返回401又會(huì)怎樣呢?很簡(jiǎn)單,我們就用路由器的URL測(cè)試下:
<img src="http://192.168.1.1/">
居然依舊跳出了一個(gè)對(duì)話框!
如果將一個(gè)HTTP401的圖片插入到論壇里,是不是也會(huì)如此呢?我們用ASP寫個(gè)簡(jiǎn)單的腳本,并且能自定義提示文字:
<%Response.Status = "401"Response.AddHeader "WWW-Authenticate", "Basic realm=IP IC IQ卡,統(tǒng)統(tǒng)告訴我密碼!"%>然后將URL插入到論壇或空間(如果拒絕.asp結(jié)尾的url圖片,那就在后面加上個(gè)?.png)。
先在QQ空間里測(cè)試下:
不出所料,彈出了對(duì)話框。不過在ie外的瀏覽器下,漢字成了亂碼,即使設(shè)置了ASP以及HTTP的編碼也不管用。
我們只好換成英文字符,再百度貼吧里用各種瀏覽器測(cè)試下:
ie678:
ie9:
firefox:
safari:
除了Opera和Chrome沒有彈出來,其他的瀏覽器都出現(xiàn)。不過部分瀏覽器截?cái)嗔丝崭窈蟮淖址?/p>
當(dāng)然,你也可以擴(kuò)展這個(gè)功能,記錄用戶輸入了什么內(nèi)容。不過,估計(jì)也沒有那個(gè)傻子會(huì)在這里輸入帳號(hào),所以這招也沒多大的實(shí)用性。
因?yàn)槭菑?qiáng)制彈出的,往往給人一驚,所以在論壇,貼吧或空間里,倒是可以?shī)蕵穵蕵贰?p#
No.2 ———— GZip壓縮炸彈
( 嚴(yán)重程序:中)
在之前的一篇文章里,談到使用兩次deflate壓縮,將數(shù)百兆的圖片文件壓縮到幾百字節(jié)。http://www.cnblogs.com/index-html/archive/2012/06/22/2558469.html
原理很簡(jiǎn)單,大量重復(fù)數(shù)據(jù)有很高的壓縮率。之前不清楚的deflate算法的最大壓縮率有多少,一直不敢確定是不是最優(yōu)的。后來大致了解了下算法,由于受到lz77算法的最大匹配長(zhǎng)度限制,deflate的最大壓縮率確實(shí)只有1:1000多點(diǎn)。雖然和rar相比相差甚遠(yuǎn),不過1000倍也意味著,1M的數(shù)據(jù)可以翻到1G了。
所以我們可以利用一個(gè)超高的壓縮的HTTP報(bào)文,做幾件事:
1.消耗內(nèi)存
2.消耗CPU
3.消耗緩存
對(duì)于現(xiàn)在的硬件配置,內(nèi)存已經(jīng)足夠支撐瀏覽器,多核的CPU也沒法完全耗盡,唯獨(dú)硬盤是個(gè)瓶頸。
我們用C程序創(chuàng)建個(gè)1G的內(nèi)存數(shù)組,將圖片數(shù)據(jù)放在其首,后面用'\0'填充。然后使用zlib進(jìn)行壓縮,得到1M左右的結(jié)果,保存為x.jpg.gz
接著用ASP讀取壓縮文件,并給返回的頭部加上Content-Encoding字段。
簡(jiǎn)單的測(cè)試下:
View Code
Dim streamSet stream = Server.CreateObject("ADODB.Stream")With stream .Type = 1 .Open .LoadFromFile _ Server.MapPath(Request.QueryString("File") & ".gz")End WithDim agentagent = Request.Servervariables("HTTP_USER_AGENT")With Response If Instr(agent, "Firefox") > 0 Or Instr(agent, "AppleWebKit") > 0 Then .AddHeader "Content-Encoding", "deflate" Else .AddHeader "Content-Encoding", "gzip" End If .AddHeader "Content-Length", stream.Size .BinaryWrite stream.ReadEnd With 由于部分瀏覽器的Content-Encoding只支持deflate.所以特意做了判斷,以免失效。
先用ie測(cè)試。打開GZip.ASP?file=x.jpg(測(cè)試地址:http://www.etherdream.com/Test/bomb.html),正常顯示出圖片,緊接著硬盤燈狂閃。關(guān)閉網(wǎng)頁(yè)之后,打開瀏覽器緩存文件夾。果然,1G大小緩存已產(chǎn)生!
接著用火狐測(cè)試。不過沒等圖片出來,瀏覽器已經(jīng)卡死了。等了數(shù)分鐘仍然沒有響應(yīng),只得結(jié)束任務(wù)。
用Chrome測(cè)試。內(nèi)存暴漲,最終圖片倒是正常顯示出來了,不過頁(yè)面經(jīng)常崩潰。
Opera一切正常,也沒產(chǎn)生特別大的緩存文件。當(dāng)然,不同版本的瀏覽器大不相同,可以自己測(cè)試。
不過,幾個(gè)最常用的瀏覽器有效果就行了。
我們可以將圖片插入到郵件里,或論壇貼圖,如果不幸被火狐用戶點(diǎn)中,那將當(dāng)場(chǎng)炸死;webkit內(nèi)核的瀏覽器則嚴(yán)重拖慢了系統(tǒng)速度;最杯具當(dāng)屬ie用戶了,不知不覺被吞走了1G的硬盤空間,如果插入多個(gè)的話則更多倍,只要url參數(shù)不同!如果配合HTTP重定向,定向到帶有隨機(jī)參數(shù)的url,那么每次訪問頁(yè)面又會(huì)加載并緩存一次!#p#
No.3 ———— 收郵件時(shí)暴露IP
(嚴(yán)重程序:高)
這一招其實(shí)沒有任何技術(shù)含量,也不是什么BUG,連缺陷也算不上。僅僅是一種小技巧而已。
既然網(wǎng)頁(yè)里的圖片可以外鏈,那就意味著可以訪問任何服務(wù)器,包括我們自己的。在服務(wù)器上稍作記錄,就可以輕易獲得訪問者的ip。
這對(duì)于論壇來說沒多大意義。因?yàn)檎搲锩嬖L客眾多,很難知道哪個(gè)ip是誰的。但電子郵件就不一樣了,很少會(huì)有其他人來用你的郵箱。
當(dāng)我們向某個(gè)人發(fā)送一封郵件,里面有個(gè)不起眼的圖片,外鏈到我們的cgi程序上。當(dāng)他打開郵件時(shí),cgi程序接收到了他的請(qǐng)求,自然也就探測(cè)到了ip。為了防止圖不裂開,返回一個(gè)微小的圖片,以防發(fā)現(xiàn)破綻。
對(duì)于QQ郵件這類有推送提示的郵箱,對(duì)方很快就會(huì)打開郵件,尤其是寫一個(gè)比較真實(shí)的郵件標(biāo)題。
利用這點(diǎn),我們可以寫個(gè)郵件群發(fā)的腳本,向多個(gè)QQ發(fā)送探測(cè)郵件。我們把每個(gè)email對(duì)應(yīng)圖片的url里帶上唯一參數(shù),以區(qū)分不同的郵箱。
不出一時(shí)半日,當(dāng)接收者陸續(xù)打開郵件,他們的ip也隨之暴露。即使用代理上網(wǎng),也能通過HTTP的HTTP_X_FORWARDED_FOR字段獲得真實(shí)ip地址。
通過ip地理定位,很快就可以知道他們最近在哪里。如果有相同的ip,說不定他們正在一個(gè)內(nèi)網(wǎng)里呢:)
防范措施
因?yàn)閳D片保存在外部,所以完全不在自己的可控范圍里。即使用戶外鏈的是合法的圖片,也只能意味的是當(dāng)前,而不是以后,因?yàn)橛脩艨梢愿峦怄湹膬?nèi)容,甚至可以針對(duì)不同的ip返回不同的內(nèi)容。因此要完全防住,只能在客戶端上分析圖片的內(nèi)容,后臺(tái)最多起到輔助作用。
在目前版本的百度貼吧里,因?yàn)閳D片會(huì)顯示在貼吧的主頁(yè)面上,所以對(duì)外鏈的安全性已極大的增強(qiáng)。當(dāng)用戶使用外鏈的形式插入圖片時(shí),后臺(tái)服務(wù)器會(huì)不定期的檢查圖片的合法性,如果存在異常則會(huì)刪除此圖片。如果同樣的站點(diǎn)出現(xiàn)多次異常情況,則會(huì)進(jìn)入黑名單。雖然仍有部分疏漏,但相比沒有要好的多。對(duì)于空間相冊(cè),或者可信站點(diǎn)的圖片,則不會(huì)反復(fù)的掃描檢測(cè)。
類似的,像微博這類傳播性極強(qiáng)的應(yīng)用,則完全不能使用外鏈。即使需要,也是由代理服務(wù)器讀取,再返回給用戶,因此就從根本上排除了安全隱患。