一、緩沖區溢出攻擊的原理
程序運行時,其在內存中的存儲可划分為四個區:代碼區、數據區、棧區、堆區,除了代碼區,其他三個區都是緩沖區。棧保存了當前正在執行的函數的相關信息:
其中,返回地址是調用程序指令保存在內存中的地址,計算機執行完當前函數以后,將根據返回地址找到下一個程序指令並執行。
棧存儲內容時是從下往上填充的,所以函數傳參時,如果傳遞的數據大於參數緩沖區所准備的空間,超出空間的部分數據會覆蓋下一個可用的內存地址,即返回地址緩沖區。緩沖區溢出攻擊就是通過設置攻擊步驟,使得參數緩沖區溢出,並在返回地址緩沖區中填充惡意代碼的特定地址,這可能是同一台服務器上的其他內存地址或者保存在遠程服務器上的程序指令,這樣計算機執行完當前函數以后,就會根據返回地址緩沖區中的惡意代碼地址找到惡意代碼並執行,攻擊者目的即可達成。
二、緩沖區溢出的后果
1. 注入式攻擊:允許黑客插入代碼、SQL語句或者任何可以注入應用程序的數據。
2. 特定代碼攻擊:在這種攻擊中,黑客可以獲得服務器操作系統的直接和根用戶級別的訪問,這樣他們可以完全控制服務器。
3. 拒絕訪問攻擊:可以導致服務器在執行惡意代碼后陷入困境(通常是一個無限循環或其他沒有意義的指令),這樣服務器就沒有資源去執行其他正常任務。
4. 遠程探索:也就是你的服務器被作為中間轉接點來攻擊其他服務器。
三、PHP規避緩沖區溢出攻擊的理論基礎
設計PHP本來是用於規避緩沖區溢出攻擊的,那么其理論基礎是什么呢?之所以會出現緩沖區溢出,是因為存儲在參數緩沖區中的變量有數據大小的限制,當傳遞接收的數據超出大小限制,就發生緩沖區溢出,從而為攻擊者提供了機會。而PHP本身並沒有設置能夠保存的數據大小限制,所以也就不會發生溢出。
但這只是在理論上行得通,現實中並沒有這種無大小限制的變量。變量大小是有限制的,這些限制源自服務器上的可用內存以及PHP解釋器所依賴的C語言和函數庫。
四、如何規避緩沖區溢出攻擊
1. 關注最新的安全警告
例如安全監察組織的安全公告,並做出相關應對措施,例如系統升級、語言版本升級、數據庫版本升級等等。
2. 通過變量整理預防緩沖區溢出攻擊
對變量數據進行整理、驗證,其中,防止緩沖區溢出攻擊最重要的檢查是對數據長度的檢查。
需要檢查的主要數據來源:
(1)用戶輸入
(2)外部數據源,例如遠程數據庫、RSS、data feeds甚至命令行
(3)系統函數