2017-2018-2 20179305《網絡攻防技術》 第十一週做業

研究緩衝區溢出的原理,至少針對兩種數據庫進行差別化研究

緩衝區溢出是指當計算機向緩衝區內填充數據位數時,超過了緩衝區自己的容量,溢出的數據覆蓋在合法數據上,理想的狀況是程序檢查數據長度並不容許輸入超過緩衝區長度的字符,可是絕大多數程序都會假設數據長度老是與所分配的儲存空間相匹配,這就爲緩衝區溢出埋下隱患。操做系統所使用的緩衝區 又被稱爲"堆棧"。在各個操做進程之間,指令會被臨時儲存在"堆棧"當中,"堆棧"也會出現緩衝區溢出。php

原理

緩衝區溢出(Buffer Overflow)是計算機安全領域內既經典而又古老的話題。隨着計算機系統安全性的增強,傳統的緩衝區溢出攻擊方式可能變得再也不奏效,相應的介紹緩衝區溢出原理的資料也變得「大衆化」起來。其中看雪的《0day安全:軟件漏洞分析技術》一書將緩衝區溢出攻擊的原理闡述得簡潔明瞭。本文參考該書對緩衝區溢出原理的講解,並結合實際的代碼實例進行驗證。不過即使如此,完成一個簡單的溢出代碼也須要解決不少書中沒法涉及的問題,尤爲是面對較新的具備安全特性的編譯器——好比MS的Visual Studio2010。
在計算機內部,輸入數據一般被存放在一個臨時空間內,這個臨時存放的空間就被稱爲緩衝區,緩衝區的長度事先已經被程序或者操做系統定義好了。向緩衝區內填充數據,若是數據的長度很長,超過了緩衝區自己的容量,那麼數據就會溢出存儲空間,而這些溢出的數據還會覆蓋在合法的數據上,這就是緩衝區和緩衝區溢出的道理。mysql

oracle數據庫

Oracle數據庫系統是目前世界上應用最普遍的數據庫之一,在數據庫市場上佔有主要份額。鑑於Oracle數據庫系統在實際應用中舉足輕重的地位,其安全問題的研究就顯得尤其重要。緩衝區溢出是一種在各類操做系統應用軟件中普遍存在且十分危險的漏洞,利用緩衝區溢出漏洞攻擊能夠致使程序運行失敗,甚至系統崩潰等嚴重後果,它表明了一類極其嚴重並且常見的安全威脅。Oracle數據庫系統中出現的緩衝區溢出漏洞,給計算機網絡帶來了嚴重的危害。如何有效地消除基於緩衝區溢出漏洞的攻擊,就成爲你們關注的一個焦點。基於緩衝區溢出漏洞的攻擊,通常採起以下步驟:首先編寫相關程序使緩衝區發生溢出,而後尋找溢出點,最後在溢出點注入惡意代碼。其中,尋找溢出點、編寫惡意代碼是完成攻擊的基礎,而跳轉到溢出點注入惡意代碼則是攻擊的重難點。程序員

Oracle數據庫產品具備如下優良特性

兼容性:Oracle產品採用標準SQL,並通過美國國家標準技術所(NIST)測試。與IBM SQL/DS、DB二、INGRES、IDMS/R等兼容。
可移植性:Oracle的產品可運行於很寬範圍的硬件與操做系統平臺上。能夠安裝在70種以上不一樣的大、中、小型機上;可在VMS、DOS、UNIX、Windows等多種操做系統下工做。
可聯結性:Oracle能與多種通信網絡相連,支持各類協議(TCP/IP、DECnet、LU6.2等)。
高生產率:Oracle產品提供了多種開發工具,能極大地方便用戶進行進一步的開發。
開放性:Oracle良好的兼容性、可移植性、可鏈接性和高生產率使Oracle RDBMS具備良好的開放性。sql

mysql數據庫

MySQL是一款開放源代碼關係型數據庫系統。
MySQL包含的mysql_real_connect()函數不充分檢查用戶提供的參數值,本地或遠程攻擊者能夠利用這個漏洞進行緩衝區溢出攻擊,可能用來破壞數據庫或執行任意指令。
攻擊者能夠利用SQL注入攻擊,或者可上傳惡意腳本到服務器上,經過傳遞超長的字符串做爲mysql_real_connect()函數參數,可觸發溢出,精心構建提交數據可能以數據庫進程權限在系統上執行任意指令。shell

針對不一樣數據類型,研究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 種類型

  • 基於輸入字符串的檢測方法
  • 基於保護堆棧中的返回地址的檢測方法
  • 基於監視系統調用的檢測方法。cookie

    基於輸入字符串的檢測方法

    對輸入的字符串進行檢測,肯定其爲溢出攻擊字符串時採起阻攔措施,使攻擊者沒法注入攻擊代碼。通常有如下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和盲注兩種注入模式,獲取數據庫權限。 使用時,用戶首先使用該工具生成一個配置文件。在配置文件中,設置注入路徑以及注入的各項參數,而後再加載該文件,實施滲透測試。

相關文章
相關標籤/搜索