1. 研究緩衝區溢出的原理,至少針對兩種數據庫進行差別化研究 2. 針對不一樣數據類型,研究SQL注入點的發現與注入技術 3. 研究緩衝區溢出的防範方法,至少針對兩種編程語言進行差別化研究 4. 至少使用兩種數據庫注入攻擊工具
當計算機向緩衝區內填充數據位數時,超過了緩衝區自己的容量,溢出的數據覆蓋在合法數據上,理想的狀況是程序檢查數據長度並不容許輸入超過緩衝區長度的字符,可是絕大多數程序都會假設數據長度老是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患。操做系統所使用的緩衝區又被稱爲"堆棧"。 在各個操做進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩衝區溢出。
1.1 堆棧緩衝區
基礎知識
進程被分紅三個區域:文本, 數據和堆棧。html
**文本** 文本區域由程序肯定的, 包括代碼(指令)和只讀數據. 該區域至關於可執行文件的文本段. 這個區域一般被標記爲只讀, 任何對其寫入的操做都會致使段錯誤 **數據** 數據區域包含了已初始化和未初始化的數據. 靜態變量儲存在這個區域中. 數據區域對應可執行文件中的data-bss段. 它的大小能夠用系統調用brk(2)來改變.若是bss數據的擴展或用戶堆棧把可用內存消耗光了, 進程就會被阻塞住, 等待有了一塊更大的內存空間以後再運行. 新內存加入到數據和堆棧段的中間. **堆棧** 堆棧是一個在計算機科學中常用的抽象數據類型. 堆棧中的物體具備一個特性:最後一個放入堆棧中的物體老是被最早拿出來, 這個特性一般稱爲後進先處(LIFO)隊列.
爲何使用堆棧?sql
現代計算機被設計成可以理解人們頭腦中的高級語言. 在使用高級語言構造程序時最重要的技術是過程(procedure)和函數(function). 從這一點來看, 一個過程調用能夠象跳轉(jump)命令那樣改變程序的控制流程, 可是與跳轉不一樣的是, 當工做完成時,函數把控制權返回給調用以後的語句或指令. 這種高級抽象實現起來要靠堆棧的幫助. 堆棧也用於給函數中使用的局部變量動態分配空間, 一樣給函數傳遞參數和函數返回值也要用到堆棧.
Linux 下進程地址空間的佈局
1.2 Oracle數據庫緩衝區溢出攻擊
消除基於緩衝區溢出漏洞的攻擊的步驟
1 首先編寫相關程序使緩衝區發生溢出。
2 而後尋找溢出點。
其中,尋找溢出點、編寫惡意代碼是完成攻擊的基礎,而跳轉到溢出點注入惡意代碼則是攻擊的重難點。在尋找溢出點的過程當中,一般採用了使用兩次不一樣的參數填充肯定溢出點和二分法測試溢出點這兩種方法。
3 最後在溢出點注入惡意代碼。
在攻擊的過程當中,能夠根據實際狀況選取不一樣的方法。編寫的惡意代碼即一般所說的shellcode,它是一組能完成想要功能的機器代碼,一般以16進制數組的形式存在,能夠通俗的理解爲程序執行指令(也就是彙編指令)對應的機器碼。編寫shellcode的通常方法是先寫出C代碼,而後找出裏面用到的庫函數的地址,再把C代碼改編爲彙編代碼,利用調試器調試彙編代碼,最後從中提取機器代碼。接下來的問題就是如何跳轉到shellcode。
針對不一樣緩衝區溢出的類型,目前一般採用的是jmp esp和SEH這兩種跳轉方法。一樣,針對Oracle數據庫緩衝區溢出攻擊主要的問題就是如何寫出相關程序來使緩衝區發生溢出,以及尋找溢出點,而且在溢出點注入相關的惡意代碼,使之可以實如今正常訪問的狀況下所不能得到的權限或者相關效果。緩衝區溢出漏洞自己是在Oracle數據庫中廣泛存在的一種漏洞,目前絕大多數的Oracle數據庫緩衝區溢出漏洞已經被人們進行了一系列的深刻研究,可是隨着Oracle數據庫的不斷更新與發展,新的漏洞不斷出現並被人們所發現與研究。本文首先從發現緩衝區漏洞的基本問題入手,討論了緩衝區溢出漏洞的成因。在發現了相關的緩衝區溢出漏洞以後,選擇了其中一個緩衝區溢出漏洞——Oracle數據庫中自帶函數NUMTOYMINTERVAL在調用過程當中存在緩衝區溢出漏洞做爲切入點,對緩衝區溢出漏洞進行了深刻的研究,以此來發現溢出點,以後須要進一步解決如何在溢出點注入相關的惡意代碼。shell
在沒有源代碼的狀況下,並不知道函數局部變量的大小,因此定位溢出點的方法通常是利用不一樣大小的參數反覆調用該函數,直到系統報錯,再根據系
統的錯誤信息定位溢出點。若是系統沒有報錯,說明你的參數的大小尚未超過局部變量的大小,這時你要不斷地增長參數的大小,以達到溢出點定位的目的。
針對本文函數 NUMTOYMINTERVAL 中緩衝區溢出漏洞的特色,須要找到一個讓本文開始能夠控制程序流程的地方做爲溢出點。尋找溢出點,本文須要利用 Oracle 數據庫的數據庫操做日誌文件。這個文件(alert_數據庫名)存放在 Oracle數據庫安裝目錄下的「admin\數據庫名\cdump」文件夾中,全部對於數據庫的操做都會在這個日誌文件中記錄下來。利用這個日誌文件,能夠很直觀地觀察到溢出漏洞被觸發時當前的 PC 的值,從而肯定溢出點的位置。
編寫 shellcode 目前流行的有兩種方法:第一種是用 C 語言編寫,而後提取;第二種是用匯編語言編寫,而後提取。本文選擇第一種方法,由於直接使用 C語言編寫,方便編寫、修改、調試。先寫出 C代碼,再轉變爲彙編代碼,最後經過調試器提取機器代碼數據庫
靜態防範策略
靜態防範着重於經過對代碼的靜態分析消除可能引發緩衝區溢出的代碼漏洞,是一種預防策略。
這類防範策略中比較有表明性的方法有詞典分析、語義註釋、改造C語言編譯系統等。此外,已出現的靜態檢測緩衝區溢出的系統,還有Wagner等人開發的系統,它成功地從sendmail軟件中檢查出已知和未知的緩衝區溢出漏洞;CeogreG.Necula等人開發的Poor-carrying code等。
動態防範策略
動態策略經過對存在問題的軟件進行技術上的彌補來消除緩衝區溢出漏洞。
動態防範的策略主要體如今運行時檢測和阻止緩衝區溢出的攻擊.其中Crispin Cowan等人開發的堆棧衛士是到目前爲止最成功的方法.編程
Pangolin
Pangolin是一款幫助滲透測試人員進行SQL注入(SQL Injeciton)測試的安全工具。Pangolin與JSky(Web應用安全漏洞掃描器、Web應用安全評估工具)都是NOSEC公司的產品。Pangolin具有友好的圖形界面以及支持測試幾乎全部數據庫(Access、MSSql、MySql、Oracle、Informix、DB二、Sybase、PostgreSQL、Sqlite)。Pangolin可以經過一系列很是簡單的操做,達到最大化的攻擊測試效果。它從檢測注入開始到最後控制目標系統都給出了測試步驟。Pangolin是目前國內使用率最高的SQL注入測試的安全軟件。
Sqlmap
Sqlmap是一個自動SQL 注入工具。其可勝任執行一個普遍的數據庫管理系統後端指紋,檢索DBMS數據庫、usernames、表格、列、並列舉整個DBMS信息。Sqlmap提供轉儲數據庫表以及MySQL、PostgreSQL、SQL Server服務器下載或上傳任何文件並執行任意代碼的能力。後端
參考連接:http://www.cnblogs.com/coderzh/archive/2008/08/20/1272183.html 緩衝區溢出攻擊手段及防範策略分析_萬春