亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

一文搞懂SQL注入攻擊

瀏覽:154日期:2023-05-02 10:03:24
目錄
  • 1. 前言
  • 2. SQL注入簡(jiǎn)介
    • (1)SQL語(yǔ)言
    • (2)SQL注入
  • 3. SQL注入步驟
    • (1)發(fā)現(xiàn)漏洞
    • (2)信息收集
    • (3)攻擊Web系統(tǒng)(猜解用戶(hù)名和密碼)
    • (4)獲取管理員權(quán)限
  • 4. 防范SQL注入
    • (1)使用參數(shù)化查詢(xún)或存儲(chǔ)過(guò)程
    • (2)用戶(hù)輸入檢測(cè)
    • (3)SQL語(yǔ)法分析
    • (4)其他

1. 前言

隨著互聯(lián)網(wǎng)的發(fā)展和普及,網(wǎng)絡(luò)安全問(wèn)題越來(lái)越突出,網(wǎng)絡(luò)在為用戶(hù)提供越來(lái)越多服務(wù)的同時(shí),也要面對(duì)各類(lèi)越來(lái)越復(fù)雜的惡意攻擊。SQL注入(SQL Injection)攻擊是其中最普遍的安全隱患之一,它利用應(yīng)用程序?qū)τ脩?hù)輸入數(shù)據(jù)的信任,將惡意SQL代碼注入到應(yīng)用程序中,從而執(zhí)行攻擊者的操作。這種攻擊可以導(dǎo)致敏感信息泄露、數(shù)據(jù)損壞或刪除及系統(tǒng)癱瘓,給企業(yè)和個(gè)人帶來(lái)巨大損失。因此,如何防范SQL注入攻擊成為了網(wǎng)絡(luò)安全領(lǐng)域的一個(gè)重要議題。

在國(guó)外,SQL注入最早出現(xiàn)在1999年;在我國(guó)大約出現(xiàn)在2002年。2015年,約翰·卡特爾(John McAfee)的網(wǎng)站遭到了SQL注入攻擊,導(dǎo)致黑客獲取了網(wǎng)站上全部的注冊(cè)用戶(hù)信息。2016年,Yahoo公司披露了兩起大規(guī)模數(shù)據(jù)泄露事件,其中涉及的一次就是通過(guò)SQL注入攻擊獲得的。2017年,Equifax公司遭到了一次嚴(yán)重的數(shù)據(jù)泄露事件,泄露了超過(guò)1.43億條用戶(hù)記錄。調(diào)查人員發(fā)現(xiàn),攻擊者使用了SQL注入攻擊。

可見(jiàn),SQL注入攻擊破壞敏感數(shù)據(jù)的完整性和可用性,給網(wǎng)絡(luò)用戶(hù)和企業(yè)造成了巨大的生活困擾和經(jīng)濟(jì)損失。

2. SQL注入簡(jiǎn)介

(1)SQL語(yǔ)言

Structured Query Language(簡(jiǎn)稱(chēng)SQL)是—種結(jié)構(gòu)化查詢(xún)語(yǔ)言,一種數(shù)據(jù)庫(kù)文本語(yǔ)言。SQL用于同關(guān)系數(shù)據(jù)庫(kù)進(jìn)行交互,能夠執(zhí)行對(duì)數(shù)據(jù)庫(kù)的查詢(xún)、獲取數(shù)據(jù)庫(kù)的信息、向數(shù)據(jù)庫(kù)插入新的紀(jì)錄、刪除及更新數(shù)據(jù)庫(kù)中的記錄。

SQL有很多種類(lèi),但大多都基于ANSI標(biāo)準(zhǔn)SQL-92。SQL執(zhí)行的單位是一個(gè)“query”,該“query”可以是一系列語(yǔ)句集合,返回一個(gè)結(jié)果集。SQL語(yǔ)句可以修改數(shù)據(jù)庫(kù)結(jié)構(gòu)(使用數(shù)據(jù)定義語(yǔ)言DDL)和操作數(shù)據(jù)庫(kù)內(nèi)容(使用數(shù)據(jù)操作語(yǔ)言DML)。SQL語(yǔ)言本身造成了SQL注入漏洞,給SQL注入攻擊帶來(lái)了可能性。

(2)SQL注入

SQL注入攻擊是一種利用應(yīng)用程序漏洞的攻擊方式。攻擊者通過(guò)向應(yīng)用程序發(fā)送構(gòu)造的惡意SQL語(yǔ)句,欺騙應(yīng)用程序執(zhí)行這些SQL語(yǔ)句,如果Web應(yīng)用沒(méi)有適當(dāng)?shù)尿?yàn)證用戶(hù)輸入的信息,攻擊者就有可能改變后臺(tái)執(zhí)行的SQL語(yǔ)句的結(jié)構(gòu),獲取相應(yīng)結(jié)果。攻擊者可以利用SQL注入漏洞獲取數(shù)據(jù)庫(kù)中的敏感信息,修改或刪除數(shù)據(jù)庫(kù)中的數(shù)據(jù),或者完全控制Web服務(wù)器。

比如基于表單登錄功能的應(yīng)用程序,通過(guò)執(zhí)行一個(gè)簡(jiǎn)單的SQL查詢(xún)來(lái)確認(rèn)每次登錄,以下是這個(gè)查詢(xún)的一個(gè)典型實(shí)例:

SELECT * FROM users WHERE username="alice" and password="secret"

這個(gè)查詢(xún)要求數(shù)據(jù)庫(kù)檢查用戶(hù)表中的每一行,提取username值為alice并且password值為secret的記錄。如果返回一條用戶(hù)記錄,該用戶(hù)即可成功登錄。

攻擊者可注入用戶(hù)名或密碼字段來(lái)修改程序執(zhí)行的查詢(xún),一般是輸入雙連字符(--)注釋掉其余部分或類(lèi)似’ or ‘1’ =‘1用引號(hào)包含的字符串?dāng)?shù)據(jù)來(lái)“平衡引號(hào)”,來(lái)破壞查詢(xún)的邏輯。比如攻擊者可以通過(guò)提交用戶(hù)名為alice’--alice’ or ‘1’=‘1,密碼為任意,應(yīng)用程序?qū)?zhí)行以下查詢(xún):

SELECT * FROM users WHERE username="alice"--‘" and password="any"

SELECT * FROM users WHERE username=" alice" or ‘1"=‘1" and password="any"

這兩條查詢(xún)均等同于

SELECT * FROM users WHERE username="alice"

從而避開(kāi)了密碼檢查,成功登錄。

因此SQL注入漏洞本質(zhì)上是針對(duì)程序員編程中的漏洞,利用SQL的語(yǔ)法在應(yīng)用程序與數(shù)據(jù)庫(kù)交互的SQL語(yǔ)句中插入精心編制的額外的SQL語(yǔ)句,從而對(duì)數(shù)據(jù)庫(kù)進(jìn)行非法查詢(xún)和修改。由于程序運(yùn)行SQL語(yǔ)句時(shí)的權(quán)限與當(dāng)前該組建(例如,數(shù)據(jù)庫(kù)服務(wù)器、Web應(yīng)用服務(wù)器)的權(quán)限相同,而這些組件一般的運(yùn)行權(quán)限都很高,而且經(jīng)常是以管理員的權(quán)限運(yùn)行,所以攻擊者可能獲得數(shù)據(jù)庫(kù)的完全控制,并執(zhí)行系統(tǒng)命令。

3. SQL注入步驟

SQL注入攻擊有多種類(lèi)型,包括基于錯(cuò)誤的注入、聯(lián)合查詢(xún)注入、堆疊查詢(xún)注入等。其中,基于錯(cuò)誤的注入是最常見(jiàn)的類(lèi)型。攻擊者通過(guò)發(fā)送包含惡意SQL語(yǔ)句的輸入數(shù)據(jù)來(lái)觸發(fā)應(yīng)用程序中的錯(cuò)誤,從而獲取有關(guān)數(shù)據(jù)庫(kù)結(jié)構(gòu)和內(nèi)容的信息。

(1)發(fā)現(xiàn)漏洞

可以用經(jīng)典的1=1,1=2測(cè)試法測(cè)試SQL注入是否存在。

以http://www.test.com/profile.do?id=113為例,使用以下測(cè)試方案:

  • http://www.test.com/profile.do?id=113’
  • http://www.test.com/profile.do?id=113 and 1=1
  • http://www.test.com/profile.do?id=113 and 1=2

(2)信息收集

確認(rèn)系統(tǒng)表是否存在,主要利用Oracle數(shù)據(jù)庫(kù)中以下系統(tǒng)表:

  • all_tables:存放當(dāng)前ID和其他用戶(hù)的所有表
  • user_tables:存放當(dāng)前用戶(hù)所有表
  • user_tab_columns:存放當(dāng)前用戶(hù)表的所有列

測(cè)試以下URL:

  • http://www.test.com/profile.do?id=113’and 0<>(select count(*) from all_tables) and '1'='1
  • http://www.test.com/profile.do?id=113’and 0<>(select count(*) from user_tables)and '1'='1
  • http://www.test.com/profile.do?id=113’and 0<>(select count(*) from user_tab_ columns) and '1'='1

 如果以上頁(yè)面都能正確返回,說(shuō)明存在猜測(cè)的系統(tǒng)表。

(3)攻擊Web系統(tǒng)(猜解用戶(hù)名和密碼)

首先查找當(dāng)前用戶(hù)是否有敏感列名:

"and 0<>(select count(*) from user_tab_columns where column_name like "%25PASS%25") and "1"="1

正常返回說(shuō)明存在類(lèi)似PASS的字段,猜解該字段對(duì)應(yīng)的表名。先確定表名的長(zhǎng)度(不斷改變length(table_name)后的數(shù)值):

"and 0<>(select count(*) from user_tables where length(table_name)>8 and table_ name like"%25PASS%25") and "1"="1

利用ASCII二分法猜解表名(不斷改變substr函數(shù)的參數(shù)及比較值):

"and  (ascii(substr((select table_name from user_tab_columns where column_name like "%PASS%" And Rownum<=1),1,1))>64) and "1"="1

猜字段同樣先確定長(zhǎng)度,然后利用ASCII二分法猜解字段名:

"and 0<>(select count(*) from user_tables where table_name="T_SYSUSER"and length (column_ name) >8  and column_name like "%PASS%") and "1"="1
"and  (ascii(substr((select column_name from user_tab_columns where table_name ="T_SYSUSER" and column_name like "%25PASS%25"),1,1))>64) and "1"="1

得到用戶(hù)表的USERNAMEPASSWD兩列的名稱(chēng)后,依然是利用ASCII碼猜解法來(lái)一步一步確定USERNAMEPASSWD的值,不再詳述。

(4)獲取管理員權(quán)限

要想獲取對(duì)系統(tǒng)的完全控制,還要有系統(tǒng)的管理員權(quán)限。Oracle包含許多可在數(shù)據(jù)庫(kù)管理員權(quán)限下運(yùn)行的內(nèi)置存儲(chǔ)過(guò)程,并發(fā)現(xiàn)在這些存儲(chǔ)過(guò)程中存在SQL注入漏洞。2006年7月補(bǔ)丁發(fā)布之前,存在于默認(rèn)包SYS.DBMS_ EXPORT_EXTERSION.GET_DOMAIN_INDEX_TABLES中的缺陷就是一個(gè)典型的示例。攻擊者可以利用這個(gè)缺陷,在易受攻擊的字段中注入GRANT DBA TO PUBLIC查詢(xún)(需要換成char形式)來(lái)提升權(quán)限。

這種類(lèi)型的攻擊可通過(guò)利用Web程序中的SQL注入漏洞,在易受攻擊的參數(shù)中輸入函數(shù)來(lái)實(shí)現(xiàn)。許多其他類(lèi)型的缺陷也影響到Oracle的內(nèi)置組件。一個(gè)示例是CTXSYS.DRILOAD.VALIDATE_STMT函數(shù)。這個(gè)函數(shù)的目的是檢查一個(gè)指定的字符串中是否包含一個(gè)有效的SQL語(yǔ)句。早期Oracle版本中,在確定被提交的語(yǔ)句的過(guò)程中,這個(gè)函數(shù)實(shí)際執(zhí)行了該語(yǔ)句。這意味著任何用戶(hù)只需向這個(gè)函數(shù)提交一個(gè)語(yǔ)句,就能夠作為數(shù)據(jù)庫(kù)管理員執(zhí)行該語(yǔ)句。例如:

exec CTXSYS.DRILOAD.VALIDATE_STMT(‘GRANT DBA TO PUBLIC")

除這些漏洞外,Oracle還含有大量默認(rèn)功能,這些功能可被低權(quán)限用戶(hù)訪問(wèn),并可用于執(zhí)行各種敏感操作,建立網(wǎng)絡(luò)連接或訪問(wèn)文件系統(tǒng)。比如,可利用UTL_HTTP 包里面的 request函數(shù)構(gòu)造注射,來(lái)建立用戶(hù),并賦予DBA權(quán)限。

4. 防范SQL注入

(1)使用參數(shù)化查詢(xún)或存儲(chǔ)過(guò)程

參數(shù)化查詢(xún)分兩個(gè)步驟建立一個(gè)包含用戶(hù)輸入的SQL語(yǔ)句:

  • 應(yīng)用程序制定查詢(xún)結(jié)構(gòu),為用戶(hù)輸入的每個(gè)數(shù)據(jù)預(yù)留占位符;
  • 應(yīng)用程序制定每個(gè)占位符的內(nèi)容。
    在第二步中指定的專(zhuān)門(mén)設(shè)計(jì)的數(shù)據(jù)無(wú)法破壞在第一步中指定的查詢(xún)結(jié)構(gòu)。由于查詢(xún)結(jié)構(gòu)已經(jīng)確定,且相關(guān)API 對(duì)任何類(lèi)型的占位符數(shù)據(jù)進(jìn)行安全處理,因此它總被解釋為數(shù)據(jù),而非語(yǔ)句結(jié)構(gòu)的一部分。

 Java提供以下API,允許應(yīng)用程序創(chuàng)建一個(gè)預(yù)先編譯的SQL語(yǔ)句,并以可靠且類(lèi)型安全的方式指定它的參數(shù)占位符的值:

 java.sql.Connection.prepareStatement
 java.sql.PrepareStatement.*

使用如下:

String username = request.getParameter("j_username");
String passwd = request.getParameter("j_password");
String query = "select * from t_sysuser where username=? and passwd=?";
PreparedStatement stmt = con.prepareStatement(query);
stmt.setString(1, username);
stmt.setString(1, passwd);
ResultSet rs=stmt.executeQuery();

如果用戶(hù)提交的用戶(hù)名為alice’ or 1=1--,密碼為any,生成的查詢(xún)等同于:

select * from t_sysuser where username= ‘a(chǎn)lice" ‘or 1=1--" and passwd="any"

由此可見(jiàn)使用參數(shù)化查詢(xún)可以有效防止SQL注入,應(yīng)在每一個(gè)數(shù)據(jù)庫(kù)查詢(xún)中使用參數(shù)化查詢(xún)。如果僅注意用戶(hù)直接提交的輸入,二階SQL注入攻擊就很容易被忽略因?yàn)橐呀?jīng)被處理的數(shù)據(jù)被認(rèn)為是可信的。另外參數(shù)占位符不能用于指定查詢(xún)中表和列的名稱(chēng),如果應(yīng)用程序需要根據(jù)用戶(hù)提交的數(shù)據(jù)在SQL查詢(xún)中指定這些數(shù)據(jù)行,需要使用一份由已知可靠的值組成的“白名單”(即數(shù)據(jù)庫(kù)中表和列的名稱(chēng)),并拒絕任何與這份名單上數(shù)據(jù)不匹配的輸入項(xiàng)。或者對(duì)用戶(hù)輸入實(shí)施嚴(yán)格的確認(rèn)機(jī)制。

使用存儲(chǔ)過(guò)程的原理與參數(shù)化查詢(xún)類(lèi)似,傳入的參數(shù)在最后被執(zhí)行的SQL語(yǔ)句中會(huì)被數(shù)據(jù)庫(kù)服務(wù)器軟件進(jìn)行處理,使得輸入的字符串會(huì)被當(dāng)作一個(gè)單純的文本參數(shù)參與到SQL查詢(xún)中。不論是攻擊者輸入什么參數(shù)都不會(huì)改變?cè)O(shè)計(jì)者編寫(xiě)的SQL語(yǔ)句的語(yǔ)義,也就防止了SQL注入。另外由于存儲(chǔ)過(guò)程是預(yù)編譯的,對(duì)復(fù)雜的SQL語(yǔ)句,效率有很大程度上的提升,還可以進(jìn)一步減少查詢(xún)時(shí)客戶(hù)端發(fā)送到服務(wù)端的數(shù)據(jù)包。

(2)用戶(hù)輸入檢測(cè)

對(duì)輸入進(jìn)行檢測(cè)一般是在客戶(hù)端和服務(wù)器端利用正則表達(dá)式來(lái)匹配SQL的特殊字符及其等值的十六進(jìn)制形式,包括單引號(hào)(’)、雙重破折號(hào)(–)、SELECT、UNION等查詢(xún)關(guān)鍵字,然后對(duì)其進(jìn)行替換或者過(guò)濾。但是在所有的接受輸入的程序部分都嚴(yán)格的執(zhí)行檢測(cè)卻很難,而且會(huì)產(chǎn)生誤報(bào)。

(3)SQL語(yǔ)法分析

SQL注入根源在于對(duì)于用戶(hù)提交的請(qǐng)求沒(méi)有足夠的驗(yàn)證機(jī)制,正常的用戶(hù)輸入是具有邏輯整體含義的簡(jiǎn)單結(jié)構(gòu),而實(shí)施 SQL 注入的字符串一定是包含 SQL語(yǔ)法片段的復(fù)合結(jié)構(gòu)。 SQL 注入攻擊本質(zhì)上是希望后臺(tái)數(shù)據(jù)庫(kù)的 SQL 解釋程序按照不同的方式解釋組裝好的 SQL 語(yǔ)句,如果用戶(hù)輸入的字符串不包含 SQL 語(yǔ)法片段,顯然無(wú)法達(dá)到這個(gè)目的。

靜態(tài)代碼分析中能從語(yǔ)法、語(yǔ)義上理解程序行為,直接分析被測(cè)程序特征,尋找可能導(dǎo)致錯(cuò)誤的異常。因此可以在服務(wù)器端采用一種類(lèi)似于靜態(tài)代碼分析的SQL 語(yǔ)法預(yù)分析策略來(lái)防止SQL注入。首先將 SQL 注入分類(lèi),并對(duì)其進(jìn)行詞法分析和語(yǔ)法分析,抽象出各類(lèi)注入的語(yǔ)法結(jié)構(gòu),生成語(yǔ)法分析樹(shù);能夠利用該語(yǔ)法分析樹(shù)通過(guò)機(jī)器學(xué)習(xí)的方法來(lái)得到預(yù)想的SQL注入的集合,并從該集合中生成新的語(yǔ)法分析樹(shù);然后將用戶(hù)提交的輸入預(yù)先組裝成完整的 SQL 語(yǔ)句,對(duì)該語(yǔ)句進(jìn)行語(yǔ)法分析,如果發(fā)現(xiàn)具有 SQL 注入特征的語(yǔ)法結(jié)構(gòu),則判定為 SQL 注入攻擊。判定的唯一依據(jù)是抽象的語(yǔ)法結(jié)串,而非具體的特征字符串,避免了傳統(tǒng)的特征字符串匹配策略固有的高識(shí)別率和低誤判率之間的矛盾。

由于SQL注入利用的是正常的服務(wù)端口,在各類(lèi)Web應(yīng)用中已不能通過(guò)使用防火墻,SSL等網(wǎng)絡(luò)層保護(hù)技術(shù)來(lái)阻止應(yīng)用層攻擊,也就是說(shuō)安全邊界擴(kuò)展到了系統(tǒng)源代碼。因此,必須通過(guò)防范軟件代碼中存在的安全漏洞,從而保障系統(tǒng)的安全。

(4)其他

通過(guò)在程序中對(duì)口令等敏感信息加密,(一般采用MD5函數(shù)),另外在原來(lái)的加密的基礎(chǔ)上可以增加一些非常規(guī)的方式,即在MD5加密的基礎(chǔ)上附帶一些值 如密文=MD5 (MD5 (明文)+系統(tǒng)時(shí)間);編碼時(shí)注意屏蔽網(wǎng)頁(yè)上顯示的異常與出錯(cuò)信息,并對(duì)源代碼進(jìn)行安全審查及軟件安全測(cè)試。

安全配置服務(wù)器,包括目錄最小化權(quán)限設(shè)置:給靜態(tài)網(wǎng)頁(yè)目錄和動(dòng)態(tài)網(wǎng)頁(yè)目錄分別設(shè)置不同權(quán)限,盡量不給寫(xiě)目錄權(quán)限;修改或者去掉 Web 服務(wù)器上默認(rèn)的一些危險(xiǎn)命令,例如ftp、cmd等 需要時(shí)再?gòu)?fù)制到相應(yīng)目錄;正確配置iptables及Oracle的sqlnet.ora文件,通過(guò)IP地址限制對(duì)于數(shù)據(jù)庫(kù)訪問(wèn)。

以上就是一文搞懂SQL注入攻擊的詳細(xì)內(nèi)容,更多關(guān)于SQL注入攻擊的資料請(qǐng)關(guān)注其它相關(guān)文章!

標(biāo)簽: MsSQL
相關(guān)文章:
主站蜘蛛池模板: 国产精品视频牛仔裤一区 | 暧暧视频在线观看免费 | 国产成人精品亚洲午夜麻豆 | 色综合天天娱乐综合网 | 成人国产免费 | 香港经典a毛片免费观看爽爽影院 | 日韩字幕无线乱码 | 大学生久久香蕉国产线观看 | 精品理论片一区二区三区 | 日本一区二区不卡在线 | 一区不卡视频 | 98pao强力打造高清免费 | 成人在线播放视频 | 精品一区二区三区免费站 | 欧美一区综合 | 国产色综合一区二区三区 | 日本不卡一区二区三区视频 | 一级骚片超级骚在线观看 | 日韩精品中文字幕视频一区 | 视频一区二区国产 | 欧美精品国产 | 日韩专区在线 | 最新内地三级在线观看 | 久久精品国产99国产精2020丨 | 亚洲精品久久久久福利网站 | 99久久国语对白精品露脸 | 国产男女视频在线观看 | 久久国产在线视频 | 免费看91| 极品美女影院 | 91福利免费体验区观看区 | 玖草资源在线 | 国产精品网站在线观看 | 国产成人在线免费 | 亚洲综合欧美 | 亚洲欧美韩日 | 久久aa| 欧美精品中文 | 国产小视频精品 | 精品无码久久久久久国产 | 国产一区二区日韩欧美在线 |