欧美乱码精品一区二区三区,风流少妇又紧又爽又丰满,被债主在夫面前人妻被强,国产精品视频永久免费观看

?
內容中心
按關鍵字查找
數(shù)據(jù)庫SQL注入分類及防護思路
作者:思成 發(fā)布時間:2016-06-29

一. 背景

數(shù)據(jù)庫憑借其強大的數(shù)據(jù)存儲能力和卓越的數(shù)據(jù)處理性能,在各行各業(yè)的信息化建設中發(fā)揮著關鍵的作用。隨著數(shù)據(jù)庫在各行業(yè)的大規(guī)模應用,數(shù)據(jù)泄露事件也頻繁發(fā)生,這就使數(shù)據(jù)庫安全問題也日益凸顯,逐漸變成用戶越來越擔心的問題。雖然數(shù)據(jù)庫廠商已經(jīng)做了許多有效的措施來盡量解決數(shù)據(jù)庫存在的安全問題,但至今為止數(shù)據(jù)庫的安全漏洞仍然不斷增加。下圖為近5年數(shù)據(jù)庫漏洞數(shù)量圖。

在數(shù)據(jù)庫漏洞中最為常見的漏洞類型是SQL注入漏洞。安華金和數(shù)據(jù)庫攻防實驗室結合多年的實踐結果總結出了數(shù)據(jù)庫注入的分類分享給大家,以便大家對SQL注入型漏洞有一個更加全面的了解。

SQL注入漏洞不僅出現(xiàn)在WEB端,也出現(xiàn)在數(shù)據(jù)庫的自定義或標準庫的存儲過程、函數(shù)、觸發(fā)器中。數(shù)據(jù)庫自身的SQL注入漏洞比WEB端的注入漏洞對數(shù)據(jù)庫的威脅性更大。本文對SQL注入的分類是從數(shù)據(jù)庫的角度來劃分,不考慮WEB端的角度,這兩者在分類上有著不同的角度。

首先在解釋不同的數(shù)據(jù)庫SQL注入漏洞之前先簡要說明一下數(shù)據(jù)庫攻擊者能夠進行SQL注入的主要原理:SQL注入漏洞是用戶在輸入中混入了程序命令。最直接的例子就是攻擊者在正常的 Web 頁面中把自己的 SQL 代碼通過用戶輸入傳輸?shù)较鄳膽贸绦蛑?從而執(zhí)行一些非授權的 SQL 代碼,以達到修改、竊取或者破壞數(shù)據(jù)庫信息的目的。SQL 注入攻擊甚至可以幫組攻擊者繞過用戶認證機制,使其可以完全的操控遠程服務器上的數(shù)據(jù)庫。如果應用程序使用一些用戶輸入的數(shù)據(jù)來構造動態(tài)的SQL語句去訪問數(shù)據(jù)庫,將可能遭受到 SQL 注入攻擊。同樣的如果在代碼中使用了存儲過程,并且這些存儲過程缺乏對用戶輸入的合理限制也很容易發(fā)生 SQL 注入。

二. SQL注入分類

1) 注入途徑分類

SQL注入漏洞按照注入的物理途徑可以分成兩大類:通過WEB端對數(shù)據(jù)庫進行注入攻擊和直接訪問數(shù)據(jù)庫進行注入攻擊。

直接訪問數(shù)據(jù)庫進行注入攻擊是以數(shù)據(jù)庫用戶的身份直接連接數(shù)據(jù)庫進行SQL注入攻擊。在這種攻擊方式中,攻擊者可以通過SQL注入來執(zhí)行SQL語句從而提高用戶權限或者越權執(zhí)行。而那些在PL/SQL程序中在給用戶授權的時候沒有使用authid current_user進行定義的存儲過程、函數(shù)、觸發(fā)器、程序塊將更容易受到SQL注入攻擊。

通過WEB應用程序的用戶對數(shù)據(jù)庫進行連接并進行SQL注入攻擊。在這種類型的SQL注入攻擊中,攻擊者多采用拼接語句的方法來改變查詢的內容。獲取該賬號權限下的全部信息。

一些高級的攻擊手段往往結合這兩種方式,先利用WEB應用程序上的SQL注入漏洞獲取數(shù)據(jù)庫和數(shù)據(jù)庫所在服務器的基本信息。再利用數(shù)據(jù)庫自身SQL注入漏洞對獲取的數(shù)據(jù)庫賬號進行提權、越權等操作已達到對數(shù)據(jù)庫進行破壞或者獲取敏感信息的目的。

2) 注入方式分類

根據(jù)入侵方式,針對數(shù)據(jù)庫的SQL注入攻擊可以分為四種類型,分別是SQL Manipulation、Code Injection 、Function Call Injection以及Buffer Overflows 。前兩種SQL注入攻擊較為常見,多出現(xiàn)在WEB端的SQL注入上,而后兩種攻擊類型是直接針對數(shù)據(jù)庫自身的攻擊方式,所以對數(shù)據(jù)庫的安全威脅更加致命。

1.針對 SQL 操作的注入攻擊(SQL manipulation)是在所有的 SQL 注入攻擊類型中最常見的一種類型。這種攻擊的原理在于攻擊者會試圖在已經(jīng)存在的SQL 語句中通過集合運算符(SET Operator)比如 UNION、INTERSECT 或者MINUS 來添加一些內容在 WHERE 子句中使其功能產生變化。當然還有可能會有其他的很多變化存在。最經(jīng)典的 SQL manipulation 攻擊就存在于登錄驗證過程中。一個簡單的 Web 應用程序就可以通過執(zhí)行以下的 SQL 語句來檢查用戶認證是否有返回值:

SELECT * FROM users WHERE username = 'admin' and PASSWORD = 'guess'而攻擊者就可以嘗試修改 SQL 語句使其變?yōu)椋?/p>

SELECT * FROM users WHERE username = 'admin' and PASSWORD = 'xxxx'or 'a' = 'a'

通過以上對于 WHERE 子句的修改操作可以使用戶登錄的判定恒為真,這樣攻擊者便繞過了用戶驗證獲得了進入后臺的權利。集合運算符 UNION 也常常被用在 SQL 注入攻擊中,其最主要的目的就是通過操作 SQL 語句來從另外一個表中返回某些行。一個WEB 窗體可以執(zhí)行以下SQL 語句從一個存在的 product 表中返回一個需要的表單:

SELECT product_name FROM all_products WHERE product_name like '%ddd%'

而攻擊者可以修改 SQL 語句使其變?yōu)椋?/p>

SELECT product_name FROM all_products WHERE product_name like '%ddd%' UNION SELECT username,password FROM dba_users WHERE username like ‘%’

這種情況下在執(zhí)行完這個SQL語句以后所返回的web表單中的結果就會包括

所有的產品名以及所有的數(shù)據(jù)庫用戶名和密碼(當然需要鏈接賬號具備查詢表dba_users權限)。

2.代碼注入攻擊(CODE INJECTION)就是嘗試在已經(jīng)存在的 SQL 語句中添加額外的SQL語句或者命令。這種類型的攻擊會經(jīng)常的被應用在微軟的SQLServer 應用程序里。在 SQL Server 中EXECUTE 語句經(jīng)常會成為 這種SQL 注入攻擊的目標。雖然Oracle 這類數(shù)據(jù)庫中沒有相應的語句,在 PL/SQL 和 Java中,也不支持單個數(shù)據(jù)庫的多條SQL 語句的請求,但一些程序語言或者 API 可能允許多個 SQL 語句同時執(zhí)行。PL/SQL 和Java 應用程序可以動態(tài)的執(zhí)行那些容易受到代碼注入攻擊的匿名 PL/SQL 塊。所以在特定情況下代碼注入攻擊對即便不支持多SQL請求的數(shù)據(jù)庫依舊有效。

3.函數(shù)調用注入(FUNCTION CALL INJECTION)是因為在數(shù)據(jù)庫函數(shù)或者自定義函數(shù)中存在某些漏洞,攻擊者對問題函數(shù)進行 SQL 語句注入從而使此函數(shù)可以執(zhí)行非預期功能而達到攻擊者的目的。嚴格講不光數(shù)據(jù)庫中的函數(shù)可能存在這些漏洞存儲過程、觸發(fā)器等也存在類似漏洞。這些函數(shù)調用可以被用來在數(shù)據(jù)庫中生成數(shù)據(jù)或者系統(tǒng)調用。

以Oracle為例,Oracle 數(shù)據(jù)庫允許自定義函數(shù)或者包中的函數(shù)作為 SQL 語句的一部分來執(zhí)行。同時 Oracle 數(shù)據(jù)庫在 175 個標準數(shù)據(jù)庫包中提供了 1000 多個函數(shù),其中有一小部分有可能遭到 SQL 注入攻擊,而那些用作網(wǎng)絡通信的函數(shù)同樣可以被攻擊者利用。任何的自定義函數(shù)或者那些存在于自定義包中的函數(shù)都可以在 SQL語句中執(zhí)行。當函數(shù)作為 SQL SELECT 語句中的一部分來執(zhí)行的時候對于數(shù)據(jù)庫 來 說 不 會 造 成 任 何 變 化 除 非 這 個 函 數(shù) 被 標 記 成 了 “PRAGMATRANSACTION”。只有極少數(shù)的標準數(shù)據(jù)庫函數(shù)會被自動執(zhí)行,而那些在插入、更新、刪除語句中執(zhí)行的函數(shù)會對數(shù)據(jù)庫中的數(shù)據(jù)進行修改。當攻擊者使用那些有漏洞的標準

Oracle 函數(shù)的時候就可以將數(shù)據(jù)庫中的信息發(fā)送到遠程計算機或者在其他的數(shù)據(jù)庫服務器執(zhí)行攻擊。許多基于 Oracle 的應用程序都可能會使用那些有漏洞的數(shù)據(jù)庫軟件包,而這些自定義的軟件包里就有可能會包括那些可以修改密碼或執(zhí)行那些敏感的應用程序的函數(shù)。

對于函數(shù)調用注入攻擊來說,任何動態(tài)生成的 SQL 語句都是脆弱的,即使是最簡單的 SQL 語句都可以被攻擊者利用。
例如創(chuàng)建存儲過程test說明

用DBA權限建立自定義存儲過程

create or replace procedure test (putin varchar2) as

type c_type is ref cursor;

cv c_type;

buffer varchar2(200);

begin

dbms_output.enable(1000000);

open cv for ‘select object_name from all_objects where owner =’’’||putin||’’’and object_type=’’library’’’’;

close cv;

End;

/

這個 SQL 語句不容易遭到其它類型的注入攻擊,但是卻很容易遭受到函數(shù)注入攻擊。這是因為在這個函數(shù)中缺乏對輸入變量的約束。攻擊者可能會輸入的是一個想要執(zhí)行的命令。例如 grant dba to public;

低權限用戶構造一個含有想要執(zhí)行的命令的函數(shù)

Create or replace function get_dba return varchar authid current_user is

Pragma autonomous_transaction;

Begin

Execute immediate ‘grant dba to scott’;

End;

/

在這個例子中本來存儲過程test是用來查詢用戶所擁有的庫的,但是為了方便其他用戶使用test的執(zhí)行,這一權限被賦予了所有用戶,導致任何用戶都可以執(zhí)行test存儲過程。但是函數(shù)中由于采用了定義者權限定義test,所以造成所有用戶在執(zhí)行test的時候都獲得了DBA權限。

這一過程是低權限用戶創(chuàng)建注入函數(shù)get_dba。通過test把任意低權限賬號提權到DBA權限。

Exec sys.test(‘AAAA’||username.get_dba()—‘);

至此低權限用戶通過漏洞把自身提權到DBA權限可以對整個數(shù)據(jù)庫進行非法控制。數(shù)據(jù)庫廠商的解決方案一般是通過刪除存在漏洞函數(shù)的public執(zhí)行權限來解決

4.許多的標準數(shù)據(jù)庫函數(shù)都很容易受到緩沖區(qū)溢出(BUFFER OVER FLOWS)攻擊,這是因為只需要對那些沒有及時打補丁的數(shù)據(jù)庫做 SQL 注入攻擊就可以很容易利用到緩沖區(qū)溢出漏洞。緩沖區(qū)溢出漏洞危害很大,往往最終會造成攻擊者直接控制數(shù)據(jù)庫或數(shù)據(jù)庫所在操作系統(tǒng)。

以Oracle為例,在某些版本的標準數(shù)據(jù)庫軟件包和標準數(shù)據(jù)庫函數(shù)中

TZ_OFFSET,TO_TIMESTAMP_TZ, BFILENAME, FROM_TZ, NUMTOYMINTERVAL, andNUMTODSINTERVAL 等函數(shù)存在緩沖區(qū)溢出漏洞。而要使用這些存在緩沖區(qū)溢出漏洞的標準數(shù)據(jù)庫包和函數(shù)來做緩沖區(qū)溢出漏洞攻擊就需要利用到之前所介紹的函數(shù)注入的方法;當攻擊者通過 SQL 注入攻擊來利用緩沖區(qū)溢出漏洞的時候,就可以實現(xiàn)遠程連接操作系統(tǒng)。此外,一些應用程序和 WEB 服務器都不能夠正常處理由于緩沖區(qū)溢出所造成的數(shù)據(jù)庫連接中斷;通常,Web 進程將會被掛起,甚至導致發(fā)生拒絕服務攻擊。

三. 防護SQL注入

數(shù)據(jù)庫廠商針對SQL注入進行了大量的工作,其中以oracle為例在Oracle推出10G r2的時候開發(fā)了一個dbms_assert補丁包。這個補丁包主要被用來修復sql注入漏洞,加強對用戶輸入的信息的防守。修復了大量存在的數(shù)據(jù)庫漏洞。但并不能呢徹底解決數(shù)據(jù)庫自身的所有SQL注入漏洞。根據(jù)測試DBMS_ASSERT對二階SQL注入和跨語言傳參缺乏有效防守。

數(shù)據(jù)庫廠商雖然一直在努力,但受限于數(shù)據(jù)庫應用環(huán)境和場景。很多時候數(shù)據(jù)庫不能及時進行補丁升級,所以很多時候數(shù)據(jù)庫威脅依然存在。安華金和攻防實驗室建議廣大數(shù)據(jù)庫用戶,除了及時更新數(shù)據(jù)庫補丁的同時,必要的時候采用第三方產品來加固數(shù)據(jù)庫的安全。

這里安華金和攻防實驗室給出兩種數(shù)據(jù)庫加固思路:

1.從信息的源頭著手,對敏感信息進行加密。即便被攻擊者獲取到敏感信息,也保障信息是全密文,攻擊者無法獲得有價值的信息。

2.從數(shù)據(jù)庫安全加固的角度。數(shù)據(jù)庫防火墻可以有效防護來自外部的攻擊行為。專業(yè)的數(shù)據(jù)庫防火墻應該是基于數(shù)據(jù)庫協(xié)議準確解析,通過對SQL語法/詞法中存在的風險進行準確識別,擁有數(shù)據(jù)庫虛擬補丁技術,能夠進行細粒度權限管控,行為審計、監(jiān)測分析等核心功能,以防止攻擊者對數(shù)據(jù)庫進行入侵。發(fā)揮保護數(shù)據(jù)庫安全的作用。

相信以上無論哪種方式都會使用戶數(shù)據(jù)庫中的數(shù)據(jù)更加安全。


?
博爱县| 和林格尔县| 海口市| 五家渠市| 三门峡市| 福清市| 且末县| 牙克石市| 顺义区| 黔东| 余干县| 松原市| 城固县| 渭南市| 乐至县| 临西县| 桐乡市| 南江县| 江津市| 西吉县| 承德市| 密山市| 化德县| 阿城市| 烟台市| 柘荣县| 寿宁县| 克山县| 高尔夫| 临潭县| 柯坪县| 红原县| 鹤壁市| 睢宁县| 塘沽区| 临潭县| 富锦市| 新邵县| 通化县| 黔江区| 时尚|