web|安全 四、試圖控制Web網站主機
一些攻擊利用web伺服器上啟動並執行軟體的漏洞來讓伺服器執行攻擊者的代碼。一類臭名昭著的攻擊方法就是向緩衝寫入大量的資料從而使緩衝器崩潰。下面所摘錄的一段C++代碼就很容易受到這樣的攻擊,因為它沒有邊界檢查。
void ByYourCommand( char* pszData )
{ char szBuffer[ 255];
strcpy( szBuffer, pszData ); ...}
如果執行strcpy()過程使堆疊溢位,將會產生什麼結果呢?圖4向你展示了系統堆疊溢位後的情況。如果攻擊者在緩衝中寫入了太多的資料,它將覆蓋函數調用記錄。這是一個資料結構,它包含了儲存函數入口代碼的寄存器,還有函數的返回地址。如果攻擊者的代碼覆蓋了函數的返回地址,攻擊者就可以在你的電腦上執行任何代碼。
圖4 通過使緩衝溢出,攻擊者把攻擊代碼載入到記憶體,
代替函數的返回地址,從而執行攻擊代碼
攻擊者是如何把他的攻擊代碼移植到你的電腦上的呢?他使用的方法就是把代碼寫進資料緩衝,傳遞這個例子函數的字串很容易感染上“特洛伊木馬”這樣的駭客程式。有許多文章已經介紹過這類的攻擊方式。
駭客知道易攻擊的函數(例如上面所舉的函數例子)通常易被回應使用者輸入的代碼所調用。攻擊者發送一個不可能的長字串給伺服器。如果緩衝溢出,處理他的請求的線程將崩潰。攻擊者得到HTTP逾時的訊息提示就表明請求線程已被破壞。
如何阻止你Web網站的應用程式被利用呢?首先,給系統軟體添加最新的安全補丁。然後,檢查使用允許直接存取記憶體的語言(例如:C、C++和Delphi)編寫的程式碼,看是否有安全性漏洞。
檢查代碼可以給你無盡的信心,因為你可以發現一個應用程式並不是很容易就受到緩衝溢出這樣的攻擊的。如果你要完全避免這樣的問題,只能不使用直接存取記憶體的語言來編寫代碼。你可以使用一些指令碼語言(例如:JavaScript、Perl)或使用解釋性的語言(例如Java)。如果使用安全的語言來編寫代碼,Web網站的操作員就可以被解放出來,不用天天擔心緩衝溢出這樣的安全攻擊。
另外,你也不要盲目地相信各種安全技術,廠商雖然為了推銷自己的產品而做出了很好的安全品質承諾,但是你要知道沒有任何技術能夠保證你的Web不遭受攻擊。所以你需要一定的時間和精力去研究和發現Web的缺點,然後找出解決問題的方法。
Web的安全性問題非常複雜,範圍很廣,在本文中,我們只是從外部的攻擊角度出發,討論了如何避免Web應用程式和Web資料遭到破壞和竊取,來防止非法使用者對Web應用程式的越權訪問,提高Web網站的安全性。