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