作者:小金
本文已發表在chip
滲透是指入侵者直接用被入侵對象原有的功能來完成的入侵,它可以使用各種方法進行。無論是個人用戶、數據庫管理員還是網站管理員,要構造一個安全的網站論壇、數據庫服務器以及安全的SQL語句腳本,了解滲透技術潛在的危害都非常有必要。
很多用戶都有這樣一種感覺:計算機信息安全技術或者黑客關心的一些東西都比較高深,其實不然,比如滲透技術,可能僅僅是這個專業的技術名詞就已經讓你有點眩暈了,但是你知道嗎,在日常的計算機應用中,你常常會與滲透技術擦肩而過。
讓我們舉一個小例子來做個簡單的說明:如果我告訴你“’ or 1=1’”這是某個用戶在某個論壇注冊的用戶名或者密碼,你會想到些什么呢?如果你稍微有一點SQL語言的常識的話,就會明白這個用戶名意味著什么,你就會明白“Select u_name from userlst where u_name=xxx”與“Select u_name from userlst where u_name=xxx or 1=1”之間的巨大差異。對一個安全系數不高的網站來說,黑客可以輕松地利用類似的簡單SQL語句對網站 非法訪問或者攻擊,而這些,僅僅是滲透技術冰山之一角。
試探
“站住!干什么的?”守衛叫住這個在司令部門前徘徊了許久的年輕人。“游客。”年輕人看著守衛,眼神出奇地平靜,他似乎有意無意地看了不遠處的司令部一眼,落日余輝籠罩下的司令部顯得如此神秘。然后,年輕人在守衛警惕的目光下瀟灑離去。
滲透,或稱Penetrate,它不屬于某一種入侵方法,也不屬于某種工具。滲透是指入侵者直接用被入侵對象原有的功能來完成的入侵,它可以使用各種方法進行。這些原有的功能看起來是那么忠心,可是當它們被入侵者掌握后,卻成了入侵者得力的工具。
在一切工作開始之前,入侵者們需要試探。包括目標的功能、漏洞,這些信息在以后的工作中起著重要作用,這一過程稱為“掃描”。一般,入侵者們用的掃描器都能匯報大部分已經存在的漏洞和對方提供的服務。當收集到一定數據后,入侵者們就可以決定入侵還是放棄。
偷襲
前面已經提到,滲透有多種表現形式,目前流行的滲透技術表現方式有特殊權限目錄、論壇滲透、SQL注射等幾種。
突破特殊權限目錄
夜深了,守衛正在昏昏欲睡。突然間,一個黑影迅速翻越圍墻進了司令部,正是那個白天在司令部門前逗留過一段時間的年輕人,他戴著特制手套,圍墻上的玻璃也被弄了一些下來,散落在地上,在月光下閃爍著。年輕人無暇顧及這些,一個轉身躲進了暗處。他是一個特工,他的任務是竊取敵方最新的戰略分布圖。為此,他設法觀察這個司令部好幾天了,今天終于發現一處戒備疏松的入口。
一般,服務器都會設置一些擁有特殊功能的目錄,這些目錄用于擴充服務器提供的功能,它們能執行腳本程序,例如論壇。
正因為如此,這些目錄里的程序常常會做出異常的事情。服務器上的程序通過處理不同內容的數據請求來實現功能擴充和人機交互,但是,就連程序的編寫者也沒辦法考慮到對方可能會發出什么樣數據,而程序只會死板地接受指令干活,于是,危險隨時都可能發生。如果入侵者發送一個特殊格式的數據給服務器,由于服務器上處理數據的程序并沒有對這種數據做出處理,直接的結果就是程序被溢出,或者執行了入侵者的非法請求,例如要求進入未經允許的目錄、查看非授權文件等。因為程序根本不會思考,就乖乖實現了入侵者的心愿。
還記得那個最經典的目錄滲透嗎——“IIS的二次編碼漏洞”正是因為作者沒有考慮到一些特殊字符的作用,導致入侵者使用瀏覽器或別人開發的工具就輕松進入了服務器(圖1)。
圖1 IIS的“二次編碼漏洞”導致了目錄滲透。
當然,免費的午餐不一定都好吃,服務器雖然安排了特殊權限目錄,可是也不會給它們太多權限。用這種方法滲透的入侵者,充其量不過是個“客人”的角色,能做多少事情?可想而知,入侵者們絕不肯就此罷休。
脆弱的論壇
司令部的側門開了,也許因為天氣悶熱,一個戴眼鏡的軍官出來透氣。他看到墻邊那一堆閃亮的東西,忙走了過去。可是他還沒來得及細看,就倒在那堆玻璃上,年輕人的身影出現在他身后。潛入的特工換上軍官的軍服,連同帽子和眼鏡,然后拿了他的鑰匙串,踱著步子走進了司令部。
論壇建立在特殊權限目錄的基礎上,為服務器開擴了互動的功能,當然也成為入侵者喜愛的一塊“肥肉”。因為論壇是由多個文件組合起來的,只要某個文件的編寫出了問題,論壇就很可能成為入侵者的鑰匙。國內一些著名論壇如DVBBS和LB5000都是入侵者的最愛,因為這些論壇強大的功能讓他們能直接取得整個機器的控制權。入侵者甚至只要設法在LB5000的某個文件里寫下一行“@ARGV”就能直接進入系統內部。可以這么說:論壇是入侵者最大的“舞臺”。
究其原因,是論壇程序作者編寫的代碼不嚴密造成的。由于論壇程序的代碼是完全透明的,稍有用心的人分析了整個代碼就能知道哪一步會出問題——不要以為那些教程上的命令是作者亂按鍵盤得來的。一旦論壇被滲透,最輕的后果是入侵者坐上管理員的位置,嚴重的就是入侵者又多了一臺被控制的機器(圖2)。
圖2 黑客利用滲透技術提升LB5000用戶權限。
突破口令的防線
特工把帽檐壓得很低,司令部里居然沒人認出他。他走到深處空無一人的情報間前面,發現這里需要輸入一個四位數的密碼,鍵盤下還有一個打印機接口樣式的數據孔。特工從懷里拿出一個小機器和數據孔連接上了,然后就開始緊張地等待著什么。
有時候,一個論壇程序或者其他需要密碼的入口程序已經被修改得很安全,直接用以前出問題的代碼顯然是不可能了,難道入侵就這樣停止了?不,入侵者們當然不會輕易放棄。
現在最通用的服務器程序是微軟的IIS網絡信息服務器+ASP活動頁面的組合,而這兩者最主要的操作就是數據庫讀寫——IIS使用數據庫存儲資料已經成了標準,可正是這個標準又把服務器的安全推到了危險的邊緣。
SQL注射(SQL Injection)是最近比較熱的滲透方法,那么,SQL注射是什么?寫過數據庫程序的朋友都知道,數據庫操作需要用戶名和密碼,否則不允許打開。這些密碼通過固定的格式傳輸,這就是“結構化查詢語言”(Structured Query Language)。但是在這個環節上卻出了差錯:我們能直接閱讀到網站的資料是因為作者已經把密碼保存在某個文件里面讓系統自己提交了。因此,入侵者可以在某個涉及到數據庫調用的文件地址后增加一個SQL判斷語句來追查密碼長度,甚至推測具體密碼,例如“data.asp?id=1 and 1=(select id from admin where left(password,5)='lk007')”,如果密碼正好是“lk007”,文章就正常顯示,因為語句中的“and”查詢符兩邊相等了。這樣一步一步下來,入侵者就拿到了完整的密碼。這個手法在國外被稱為“駭客的SQL填空游戲”,有趣吧?網絡管理員可笑不出來。
打入核心
幾分鐘過去后,特工輸入了正確密碼,門開了。在他意料之外,里面還有個操作員!距離太近了,操作員認出他并非自己人。
“間諜……”操作員還沒說完話就被彈了起來,頭撞到了頂板,瞬間沒了氣息。原來特工按下了門旁的應急按鈕,它的設計初衷是把非法入侵者直接扼殺在里面。可是它不會認人,只要你輸入了正確密碼,它就能為你所用。
特工取到了他要的資料,壓低帽檐走了出去,情報間的門悄然關上了,就像什么都沒發生過。趁著夜色,特工逃離了司令部。
SQL太強大了,不過這次不是SQL語言,而是SQL服務器程序SQL Server,它給用戶提供強大功能的同時,也遞給入侵者一把“榔頭”。在SQL Server中有很多系統存儲過程,有些是數據庫內部使用的,還有一些就是通過執行存儲過程來調用系統命令。直接危害服務器的是系統存儲過程指令“xp_cmdshell”,它以操作系統命令行解釋器的方式執行給定的命令字符串,但是它有個致命弱點:它不認人,只要入侵者得到了賬號,他同樣可以執行很多命令,直接危害服務器。也許你會說,這點無所謂,賬號不是那么容易拿的。但是不爭氣的SQL Server卻存在多種能讓入侵者得到賬號的漏洞,然后(圖3)……
圖3 針對SQL服務器的xp_cmdshell入侵程序。
其實,入侵者直接在瀏覽器里輸入SQL指令就可以,例如“exec master.dbo.xp_cmdshell '命令行'”。
防范
深夜里,司令部響起了警報。一個士兵無意中發現了倒在地上的軍官,爾后人們看到了情報間里操作員的尸體。整個司令部立即進入A級警戒狀態,所有人都要經過嚴密身份識別才被批準進入。
然而,特工還會來嗎?
發現服務器被入侵的時候,入侵者已經絕塵而去,廣大網絡管理員最痛心疾首的事情莫過于此,如果上天給他們一個重來的機會,他們會祈禱入侵者進不來,如果要加一個期限,他們希望是——永遠。
話雖如此,但是,不見得每個Webmaster的技術都足夠抵擋一切入侵,也不是所有程序都不會有出錯的一天,我們應該如何預防滲透技術可能帶來的危害呢?看了上面的文章和理論分析,不難得出以下有效的防范措施:
1.確保操作系統、數據庫服務器、程序開發語言都打上了最新的補丁程序,如Service Pack以及相應服務器程序的補丁,并記得一定要時刻開啟防火墻功能;
2.時刻關注自己服務器的論壇程序最新情況,增加必要的字段過濾;
3.留意用戶組的變化,密切注意奇怪的用戶名,對用戶名和密碼注冊采取嚴格的限制策略;
4.定時分析操作系統和數據庫日志文件。