一、研究緩衝區溢出的原理,至少針對兩種數據庫進行差別化研究php
緩衝區溢出是指當計算機向緩衝區內填充數據位數時,超過了緩衝區自己的容量,溢出的數據覆蓋在合法數據上,理想的狀況是程序檢查數據長度並不容許輸入超過緩衝區長度的字符,可是絕大多數程序都會假設數據長度老是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患。操做系統所使用的緩衝區 又被稱爲"堆棧"。在各個操做進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩衝區溢出。mysql
1.一、原理:程序員
經過往程序的緩衝區寫超出其長度的內容,形成緩衝區的溢出,從而破壞程序的堆棧,使程序轉而執行其它指令,以達到攻擊的目的。形成緩衝區溢出的緣由是程序中沒有仔細檢查用戶輸入的參數。例以下面程序:sql
void function(char *str) {shell
char buffer[16]; strcpy(buffer,str);數據庫
}編程
上面的strcpy()將直接把str中的內容copy到buffer中。這樣只要str的長度大於16,就會形成buffer的溢出,使程序運行出錯。存在像strcpy這樣的問題的標準函數還有strcat()、sprintf()、vsprintf()、gets()、scanf()等。安全
固然,隨便往緩衝區中填東西形成它溢出通常只會出現分段錯誤(Segmentation fault),而不能達到攻擊的目的。最多見的手段是經過製造緩衝區溢出使程序運行一個用戶shell,再經過shell執行其它命令。若是該程序屬於root且有suid權限的話,攻擊者就得到了一個有root權限的shell,能夠對系統進行任意操做了。服務器
緩衝區溢出攻擊之因此成爲一種常見安全攻擊手段其緣由在於緩衝區溢出漏洞太廣泛了,而且易於實現。並且,緩衝區溢出成爲遠程攻擊的主要手段其緣由在於緩衝區溢出漏洞給予了攻擊者他所想要的一切:植入而且執行攻擊代碼。被植入的攻擊代碼以必定的權限運行有緩衝區溢出漏洞的程序,從而獲得被攻擊主機的控制權。cookie
在1998年Lincoln實驗室用來評估入侵檢測的的5種遠程攻擊中,有2種是緩衝區溢出。而在1998年CERT的13份建議中,有9份是是與緩衝區溢出有關的,在1999年,至少有半數的建議是和緩衝區溢出有關的。在ugtraq的調查中,有2/3的被調查者認爲緩衝區溢出漏洞是一個很嚴重的安全問題。
1.二、MySQL
MySQL是最受歡迎的開源SQL數據庫管理系統,它由 MySQL AB開發、發佈和支持。MySQL AB是一家基於MySQL開發人員的商業公司,它是一家使用了一種成功的商業模式來結合開源價值和方法論的第二代開源公司。MySQL是MySQL AB的註冊商標。
MySQL是一個快速的、多線程、多用戶和健壯的SQL數據庫服務器。MySQL服務器支持關鍵任務、重負載生產系統的使用,也能夠將它嵌入到一個大配置(mass- deployed)的軟件中去.與其餘數據庫管理系統相比,MySQL具備如下優點:
(1)MySQL是一個關係數據庫管理系統。
(2)MySQL是開源的。
(3)MySQL服務器是一個快速的、可靠的和易於使用的數據庫服務器。
(4)MySQL服務器工做在客戶/服務器或嵌入系統中。
(5)有大量的MySQL軟件可使用。
1.三、Oracle
提起數據庫,第一個想到的公司,通常都會是Oracle(甲骨文)。該公司成立於1977年,最初是一家專門開發數據庫的公司。Oracle在數據庫領域一直處於領先地位。 1984年,首先將關係數據庫轉到了桌面計算機上。而後,Oracle5率先推出了分佈式數據庫、客戶/服務器結構等嶄新的概念。Oracle 6獨創行鎖定模式以及對稱多處理計算機的支持……最新的Oracle 8主要增長了對象技術,成爲關係—對象數據庫系統。目前,Oracle產品覆蓋了大、中、小型機等幾十種機型,Oracle數據庫成爲世界上使用最普遍的關係數據系統之一。
Oracle數據庫產品具備如下優良特性。
(1)兼容性
Oracle產品採用標準SQL,並通過美國國家標準技術所(NIST)測試。與IBM SQL/DS、DB二、INGRES、IDMS/R等兼容。
(2)可移植性
Oracle的產品可運行於很寬範圍的硬件與操做系統平臺上。能夠安裝在70種以上不一樣的大、中、小型機上;可在VMS、DOS、UNIX、Windows等多種操做系統下工做。
(3)可聯結性
Oracle能與多種通信網絡相連,支持各類協議(TCP/IP、DECnet、LU6.2等)。
(4)高生產率
Oracle產品提供了多種開發工具,能極大地方便用戶進行進一步的開發。
(5)開放性
Oracle良好的兼容性、可移植性、可鏈接性和高生產率使Oracle RDBMS具備良好的開放性。
二、針對不一樣數據類型,研究SQL注入點的發現與注入技術
SQL 注入指黑客利用一些Web應用程序(如:網站、論壇、留言本、文章發佈系統等)中某些存在不安全代碼或SQL語句不縝密的頁面,精心構造SQL語句,把非法的SQL語句指令轉譯到系統實際SQL語句中並執行它,以獲取用戶名、口令等敏感信息,從而達到控制主機服務器的攻擊方法。 SQL 注入漏洞是發生於應用程序與數據庫層的安全漏洞。簡而言之,是在輸入的字符串之中注入SQL指令,在設計不良的程序當中忽略了檢查,那麼這些注入進去的指令就會被數據庫服務器誤認爲是正常的 SQL 指令而運行,所以遭到破壞或是入侵。
2.二、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 '%關鍵字%'。
三、研究緩衝區溢出的防範方法,至少針對兩種編程語言進行差別化研究
3.一、防範方法
目前有四種基本的方法保護緩衝區免受緩衝區溢出的攻擊和影響:
一、強制寫正確的代碼的方法
編寫正確的代碼是一件很是有意義但耗時的工做,特別像編寫C語言那種具備容易出錯傾向的程序(如:字符串的零結尾),這種風格是因爲追求性能而忽視正確性的傳統引發的。儘管花了很長的時間使得人們知道了如何編寫安全的程序,具備安全漏洞的程序依舊出現。所以人們開發了一些工具和技術來幫助經驗不足的程序員編寫安全正確的程序。雖然這些工具幫助程序員開發更安全的程序,可是因爲C語言的特色,這些工具不可能找出全部的緩衝區溢出漏洞。因此,偵錯技術只能用來減小緩衝區溢出的可能,並不能徹底地消除它的存在。除非程序員能保證他的程序萬無一失,不然仍是要用到如下部分的內容來保證程序的可靠性能。
二、經過操做系統使得緩衝區不可執行,從而阻止攻擊者殖入攻擊代碼
這種方法有效地阻止了不少緩衝區溢出的攻擊,可是攻擊者並不必定要殖入攻擊代碼來實現緩衝區溢出的攻擊,因此這種方法仍是存在不少弱點的。
三、利用編譯器的邊界檢查來實現緩衝區的保護
這個方法使得緩衝區溢出不可能出現,從而徹底消除了緩衝區溢出的威脅,可是相對而言代價比較大。
四、在程序指針失效前進行完整性檢查
這樣雖然這種方法不能使得全部的緩衝區溢出失效,但它的確確阻止了絕大多數的緩衝區溢出攻擊,而可以逃脫這種方法保護的緩衝區溢出也很難實現。
最普通的緩衝區溢出形式是攻擊活動紀錄而後在堆棧中殖入代碼。這種類型的攻擊在1996年中有不少紀錄。而非執行堆棧和堆棧保護的方法均可以有效防衛這種攻擊。非執行堆棧能夠防衛全部把代碼殖入堆棧的攻擊方法,堆棧保護能夠防衛全部改變活動紀錄的方法。這兩種方法相互兼容,能夠同時防衛多種可能的攻擊。
剩下的攻擊基本上能夠用指針保護的方法來防衛,可是在某些特殊的場合須要用手工來實現指針保護。全自動的指針保護須要對每一個變量加入附加字節,這樣使得指針邊界檢查在某些狀況下具備優點。
最爲有趣的是,緩衝區溢出漏洞--Morris蠕蟲使用了現今全部方法都沒法有效防衛的方法,可是因爲過於複雜的緣故卻不多有人用到。
在本文中,咱們詳細描述和分析了緩衝區溢出的原理,並簡單介紹了幾種防衛方法。因爲這種攻擊是目前常見的攻擊手段,因此進行這個方面的研究工做是有意義和成效的。
3.二、根據緩衝區溢出攻擊的步驟, 可將經常使用的緩衝區溢出攻擊檢測技術分爲如下 3 種類型:
(1)基於輸入字符串的檢測方法
(2)基於保護堆棧中的返回地址的檢測方法
(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。
目的就是:要追蹤到錯誤信息。
當程序有防get注入的時候,可使用cookie注入
sqlmap -u 「http://www.baidu.com/shownews.asp」 –cookie 「id=11″ –level 2(只有level達到2纔會檢測cookie)
可使用burpsuite或者temperdata等工具來抓取post包
sqlmap -r 「c:\tools\request.txt」 -p 「username」 –dbms mysql 指定username參數