WWW服務是因特網上最重要的服務之一,提供給客戶各種各樣的信息資源,而把這種信息資源組織起來的一個很重要的東西就是Html超文本語言,然后經過應用的發展就出現了其他的如UBB等標簽但是最終都是以Html代碼來實現的。經過研究發現,即使是最安全的安全代碼(已經排除了通常所說的Xss漏洞)也無法避免另外一種惱人的攻擊方式,配合不嚴格的程序,可能被人利用產生更大的威脅。
我們就以現在廣泛存在于論壇,文章系統,Blog系統等腳本程序中的[img]標簽也就是轉化后的
[IMG]/xkerfiles/uppic/2006-6/4/loveshell.jpg[/IMG] |
然后通過腳本程序的轉換成為了
<img src=/xkerfiles/uppic/2006-6/4/loveshell.jpg>。<img>標簽 |
是在當前的頁面嵌入一個圖片,現在的論壇程序在發帖子以及個人頭像那里都有這個功能,當瀏覽器遇到這個Html標記的時候就會根據src的地
址,這里是/xkerfiles/uppic/2006-6/4/loveshell.jpg去尋找網絡資源,當找到這個圖片的時候就會訪問并且下載這個資源然后在本地進行解析,
在瀏覽器里顯示出這個圖片,如果找不到這個資源就會顯示一個紅叉表示出錯了。這里/xkerfiles/uppic/2006-6/4/loveshell.jpg是個很正常的圖
片,所以一切都順利進行,但是不知道大家想過沒有,如果這個資源是其他類型的資源譬如一個網頁一個eXe文件或者是一個asp頁面,當不是圖片類型文件的時候,結果會怎么樣呢?
答案很明顯,是圖片顯示一個紅X,我們的Exe文件也沒有下載,Html頁面也沒有執行,這是理所當然的東西,因為IE或者其他瀏覽器會把取得的資源當作圖片解析,這樣就會產生錯誤從而顯示紅X了。到這里大家也許還覺得沒有什么用,但是如果我們把圖片的地址改成
http://127.0.0.1:88/imgtest/test.asp?user=shell這樣的形式呢?其中test.asp里有如下內容的話
<% |
大家可以測試看看,我們的訪問被記錄了,甚至還得到了提交的參數,但是這對于瀏覽器來說是未知的,因為我們只看到了一個紅X。到這里我們也許知道我們可以用這個東西做什么了!就是可以以瀏覽者的身份悄悄去訪問一個頁面,甚至支持Get的參數請求,這很重要,理解了這個就可以在后面發揮我們的想象力來利用這個來做什么!
1、刷流量:我們可以在一個流量大的論壇把自己的圖象設置成要刷的頁面,然后每一個瀏覽者都會去訪問下我們的頁面,不管他是否看到了,但是他訪問了,不是么?//web學習吧www.webstudy8.com
2、破壞:這個讓人很惱火,對于動網論壇如果把你的圖象設置成logout.asp的話,呵呵,所有看了你的帖子的人都會被T了,很爽吧!
呵呵,至于幻影論壇,大家可以試試,但是這是很不道德的!
3、黑客:這個是我們最感興趣的,可以跨越權限做一些事情,因為現在很多的程序對于前臺都是防守較好,但是后臺就不是那么嚴密了。如果程序中取得數據的時候是用request("id")這樣的方法取得的話,那么我們就可以利用標簽向Cgi腳本提交數據了,注意必須不能是request.form("username2")這種嚴格指定了取得的變量來源的方式,因為我們的變量只能通過URL提交也就是上面說的QUERY_STRING方式。這對于寫法不嚴密的程序是很致命的,要例子的話動網就是一個,動網Sql版本后臺的messages.asp里取得數據的方式就是request,代碼如下:
這本來是后臺的必須要有后臺管理權限才能訪問的,但是我們構造這樣一個Url:
或者類似的語句了,然后放到[Img]標簽里。大家也許覺得管理員看自己帖子的可能性也不大,但是要知道論壇短信也是支持和發帖子一樣的[img]標簽的,所以如果能給管理員發個短信,在里面構造我們的Img標簽只要他一打開短信就會種招的哦!如果可以和社會工程學聯一塊,殺人不沾血啊,呵呵!有點遺憾的是仿佛動網對&等符號做了轉換,大家可以嘗試突破,更何況網絡上寫法不嚴密的程序何止千萬。 4 想象力 大家賺錢都這么辛苦,如果把IMG標簽里的地址改成附件下載地址的話,呵呵,說說而已,沒有測試。 5 ...... 再說說對這個問題如何防御,如果想保留這個[IMG]標簽但是又不想出問題的話,是需要轉換的,譬如限定后綴必須是jpg,呵呵這可以通過URL編碼加#JPG饒過,反正我覺得如果有限制的話一般都是能饒過的,即使你限制了IMG,那好,還有Flash標簽呢,還有Rm標簽呢?......
......
Sub Del()
Dim Dnum
If Request("username") = "" Then
Body = Body + "
" + "請輸入要批量刪除的用戶名。"
Exit Sub
End If
Sql = "select COUNT(*) FROM Dv_Message where Sender = '" & Request("username") & "'"
Set Rs = Dvbbs.Execute(Sql)
......
http://bbs.dvbbs.net/admin/messages.asp?action=del&user=';update/**/Dv_User/**/set/**
/UserEmail=(select/**/top/**/1/**/
[Username]/
**/from/**/Dv_admin)/**/where[UserName]='loveshell';--
防御和利用都是艱難的。