2017-2018-2 20179302《網絡攻防》第十一周作業
研究緩沖區溢出的原理,至少針對兩種數據庫進行差異化研究
緩沖區溢出是指當計算機向緩沖區內填充數據位數時,超過了緩沖區本身的容量,溢出的數據覆蓋在合法數據上,理想的情況是程序檢查數據長度並不允許輸入超過緩沖區長度的字符,但是絕大多數程序都會假設數據長度總是與所分配的儲存空間相匹配,這就為緩沖區溢出埋下隱患。操作系統所使用的緩沖區 又被稱為"堆棧"。在各個操作進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩沖區溢出。
原理
緩沖區溢出(Buffer Overflow)是計算機安全領域內既經典而又古老的話題。隨著計算機系統安全性的加強,傳統的緩沖區溢出攻擊方式可能變得不再奏效,相應的介紹緩沖區溢出原理的資料也變得“大眾化”起來。其中看雪的《0day安全:軟件漏洞分析技術》一書將緩沖區溢出攻擊的原理闡述得簡潔明了。本文參考該書對緩沖區溢出原理的講解,並結合實際的代碼實例進行驗證。不過即便如此,完成一個簡單的溢出代碼也需要解決很多書中無法涉及的問題,尤其是面對較新的具有安全特性的編譯器——比如MS的Visual Studio2010。
在計算機內部,輸入數據通常被存放在一個臨時空間內,這個臨時存放的空間就被稱為緩沖區,緩沖區的長度事先已經被程序或者操作系統定義好了。向緩沖區內填充數據,如果數據的長度很長,超過了緩沖區本身的容量,那麽數據就會溢出存儲空間,而這些溢出的數據還會覆蓋在合法的數據上,這就是緩沖區和緩沖區溢出的道理。
oracle數據庫
Oracle數據庫系統是目前世界上應用最廣泛的數據庫之一,在數據庫市場上占有主要份額。鑒於Oracle數據庫系統在實際應用中舉足輕重的地位,其安全問題的研究就顯得尤為重要。緩沖區溢出是一種在各種操作系統應用軟件中廣泛存在且十分危險的漏洞,利用緩沖區溢出漏洞攻擊可以導致程序運行失敗,甚至系統崩潰等嚴重後果,它代表了一類極其嚴重而且常見的安全威脅。Oracle數據庫系統中出現的緩沖區溢出漏洞,給計算機網絡帶來了嚴重的危害。如何有效地消除基於緩沖區溢出漏洞的攻擊,就成為大家關註的一個焦點。基於緩沖區溢出漏洞的攻擊,一般采取如下步驟:首先編寫相關程序使緩沖區發生溢出,然後尋找溢出點,最後在溢出點註入惡意代碼。其中,尋找溢出點、編寫惡意代碼是完成攻擊的基礎,而跳轉到溢出點註入惡意代碼則是攻擊的重難點。
Oracle數據庫產品具有以下優良特性
兼容性:Oracle產品采用標準SQL,並經過美國國家標準技術所(NIST)測試。與IBM SQL/DS、DB2、INGRES、IDMS/R等兼容。
可移植性:Oracle的產品可運行於很寬範圍的硬件與操作系統平臺上。可以安裝在70種以上不同的大、中、小型機上;可在VMS、DOS、UNIX、Windows等多種操作系統下工作。
可聯結性:Oracle能與多種通訊網絡相連,支持各種協議(TCP/IP、DECnet、LU6.2等)。
高生產率:Oracle產品提供了多種開發工具,能極大地方便用戶進行進一步的開發。
開放性:Oracle良好的兼容性、可移植性、可連接性和高生產率使Oracle RDBMS具有良好的開放性。
mysql數據庫
MySQL是一款開放源代碼關系型數據庫系統。
MySQL包含的mysql_real_connect()函數不充分檢查用戶提供的參數值,本地或遠程攻擊者可以利用這個漏洞進行緩沖區溢出攻擊,可能用來破壞數據庫或執行任意指令。
攻擊者可以利用SQL註入攻擊,或者可上傳惡意腳本到服務器上,通過傳遞超長的字符串作為mysql_real_connect()函數參數,可觸發溢出,精心構建提交數據可能以數據庫進程權限在系統上執行任意指令。
針對不同數據類型,研究SQL註入點的發現與註入技術
SQL 註入原理
SQL 註入指黑客利用一些Web應用程序(如:網站、論壇、留言本、文章發布系統等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構造SQL語句,把非法的SQL語句指令轉譯到系統實際SQL語句中並執行它,以獲取用戶名、口令等敏感信息,從而達到控制主機服務器的攻擊方法。 SQL 註入漏洞是發生於應用程序與數據庫層的安全漏洞。簡而言之,是在輸入的字符串之中註入SQL指令,在設計不良的程序當中忽略了檢查,那麽這些註入進去的指令就會被數據庫服務器誤認為是正常的 SQL 指令而運行,因此遭到破壞或是入侵。
SQL 註入分類
按照註入點類型來分類
數字型註入點:在 Web 端大概是 http://xxx.com/news.php?id=1 這種形式,其註入點 id 類型為數字,所以叫數字型註入點。這一類的 SQL 語句原型大概為 select * from 表名 where id=1。
字符型註入點:在 Web 端大概是 http://xxx.com/news.php?name=admin 這種形式,其註入點 name 類型為字符類型,所以叫字符型註入點。這一類的 SQL 語句原型大概為 select * from 表名 where name=‘admin‘。註意多了引號。
搜索型註入點:這是一類特殊的註入類型。這類註入主要是指在進行數據搜索時沒過濾搜索參數,一般在鏈接地址中有“keyword=關鍵字”,有的不顯示在的鏈接地址裏面,而是直接通過搜索框表單提交。 此類註入點提交的 SQL 語句,其原形大致為:select * from 表名 where 字段 like ‘%關鍵字%‘。
研究緩沖區溢出的防範方法,至少針對兩種編程語言進行差異化研究
防範方法
目前有四種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響:
- 強制寫正確的代碼的方法
編寫正確的代碼是一件非常有意義但耗時的工作,特別像編寫C語言那種具有容易出錯傾向的程序(如:字符串的零結尾),這種風格是由於追求性能而忽視正確性的傳統引起的。盡管花了很長的時間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現。因此人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。雖然這些工具幫助程序員開發更安全的程序,但是由於C語言的特點,這些工具不可能找出所有的緩沖區溢出漏洞。所以,偵錯技術只能用來減少緩沖區溢出的可能,並不能完全地消除它的存在。除非程序員能保證他的程序萬無一失,否則還是要用到以下部分的內容來保證程序的可靠性能。 - 通過操作系統使得緩沖區不可執行,從而阻止攻擊者殖入攻擊代碼
這種方法有效地阻止了很多緩沖區溢出的攻擊,但是攻擊者並不一定要殖入攻擊代碼來實現緩沖區溢出的攻擊,所以這種方法還是存在很多弱點的。 - 利用編譯器的邊界檢查來實現緩沖區的保護
這個方法使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅,但是相對而言代價比較大。 - 在程序指針失效前進行完整性檢查
這樣雖然這種方法不能使得所有的緩沖區溢出失效,但它的確確阻止了絕大多數的緩沖區溢出攻擊,而能夠逃脫這種方法保護的緩沖區溢出也很難實現。
最普通的緩沖區溢出形式是攻擊活動紀錄然後在堆棧中殖入代碼。這種類型的攻擊在1996年中有很多紀錄。而非執行堆棧和堆棧保護的方法都可以有效防衛這種攻擊。非執行堆棧可以防衛所有把代碼殖入堆棧的攻擊方法,堆棧保護可以防衛所有改變活動紀錄的方法。這兩種方法相互兼容,可以同時防衛多種可能的攻擊。
剩下的攻擊基本上可以用指針保護的方法來防衛,但是在某些特殊的場合需要用手工來實現指針保護。全自動的指針保護需要對每個變量加入附加字節,這樣使得指針邊界檢查在某些情況下具有優勢。
最為有趣的是,緩沖區溢出漏洞--Morris蠕蟲使用了現今所有方法都無法有效防衛的方法,但是由於過於復雜的緣故卻很少有人用到。
根據緩沖區溢出攻擊的步驟, 可將常用的緩沖區溢出攻擊檢測技術分為以下 3 種類型
- 基於輸入字符串的檢測方法
- 基於保護堆棧中的返回地址的檢測方法
-
基於監視系統調用的檢測方法。
基於輸入字符串的檢測方法
對輸入的字符串進行檢測,確定其為溢出攻擊字符串時采取阻攔措施,使攻擊者無法註入攻擊代碼。一般有以下3 種方法構建溢出攻擊字符串
第1種溢出攻擊字符串適用於緩沖區大於ShellCode 長度的情況;第2種溢出攻擊字符串一般用於緩沖區小於ShellCode 長度的情況;第3種方法是將ShellCode 放在環境變量裏,是目前較為常用的方法。基於保護堆棧中返回地址的檢測方法
緩沖區溢出攻擊最關鍵的步驟是要通過修改函數返回地址來改變程序的流程, 因此, 在函數調用返回前, 通過檢查返回地址是否被修改可以判斷是否有緩沖區溢出攻擊發生。 該檢測的實現可以通過在源碼中插入一些約束和判斷的模塊, 然後在編譯後的程序運行期間對有關變量和堆棧區域進行監控,檢測是否有攻擊發生。 StackGuard 和StackShield 就是這一類型的工具,它們都是 gcc 編譯器的擴展工具,用於監控調用的函數返回地址是否正常。
目前有三種基本的方法保護緩沖區免受緩沖區溢出的攻擊和影響
- 通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼;
- 強制寫正確的代碼的方法;
-
利用編譯器的邊界檢查來實現緩沖區的保護,使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅。
基於監視系統調用的檢測方法
通過檢測是否有 ShellCode 運行可以檢測是否發生緩沖區溢出攻擊。攻擊者既希望 ShellCode 利用獲得的權限啟動一個交互式的 shell 進程來完成盡量多的事情,又希望 ShellCode 盡量短小從而更加隱蔽,所以絕大多數 ShellCode 都會調用系統函數。 由於監視所有系統調用會耗費大量系統資源, 因此只對 ShellCode 常用的系統調用進行監視, 根據某些特征判斷受監視的系統調用是否為非法調用就可確定被保護系統是否遭到緩沖區溢出攻擊。
至少使用兩種數據庫註入攻擊工具
Sqlmap
Sqlmap是一種開源的滲透測試工具,可以自動檢測和利用SQL註入漏洞以及接入該數據庫的服務器。它擁有非常強大的檢測引擎、具有多種特性的滲透測試器、通過數據庫指紋提取訪問底層文件系統並通過外帶連接執行命令.
sqlmap支持的數據庫有
MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB
檢測註入
基本格式
sqlmap -u “http://www.vuln.cn/post.php?id=1″
默認使用level1檢測全部數據庫類型
sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3
指定數據庫類型為mysql,級別為3(共5級,級別越高,檢測越全面)
跟隨302跳轉
當註入頁面錯誤的時候,自動跳轉到另一個頁面的時候需要跟隨302,
當註入錯誤的時候,先報錯再跳轉的時候,不需要跟隨302。
目的就是:要追蹤到錯誤信息。
cookie註入
當程序有防get註入的時候,可以使用cookie註入
sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11″ –level 2(只有level達到2才會檢測cookie)
從post數據包中註入
可以使用burpsuite或者temperdata等工具來抓取post包
sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username參數
sqlmap詳細命令
–is-dba 當前用戶權限(是否為root權限)
–dbs 所有數據庫
–current-db 網站當前數據庫
–users 所有數據庫用戶
–current-user 當前數據庫用戶
–random-agent 構造隨機user-agent
–passwords 數據庫密碼
–proxy http://local:8080 –threads 10 (可以自定義線程加速) 代理
–time-sec=TIMESEC DBMS響應的延遲時間(默認為5秒)
sqlsus
sqlsus是使用Perl語言編寫的MySQL註入和接管工具。它可以獲取數據庫結構,實施註入查詢,下載服務器的文件,爬取可寫目錄並寫入後門,以及復制數據庫文件等功能。它提供Inband和盲註兩種註入模式,獲取數據庫權限。
使用時,用戶首先使用該工具生成一個配置文件。在配置文件中,設置註入路徑以及註入的各項參數,然後再加載該文件,實施滲透測試。
2017-2018-2 20179302《網絡攻防》第十一周作業