最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會(huì)員登陸 & 注冊(cè)

sql注入攻擊的原理以及防范措施

2023-03-28 16:20 作者:馳網(wǎng)科技idc-艾西  | 我要投稿

sql注入攻擊的原理以及防范措施

?

我是艾西,從業(yè)多年的IDC服務(wù)器機(jī)房行業(yè)總是會(huì)遇到各種各樣的網(wǎng)絡(luò)漏洞以及斗智斗勇的過程,今天和大家聊聊sql注入的方法以及如何防止sql注入

?

SQL 注入(SQL Injection)是發(fā)生在 Web 程序中數(shù)據(jù)庫層的安全漏洞,是網(wǎng)站存在最多也是最簡單的漏洞。主要原因是程序?qū)τ脩糨斎霐?shù)據(jù)的合法性沒有判斷和處理,導(dǎo)致攻擊者可以在 Web 應(yīng)用程序中事先定義好的 SQL 語句中添加額外的 SQL 語句,在管理員不知情的情況下實(shí)現(xiàn)非法操作,以此來實(shí)現(xiàn)欺騙數(shù)據(jù)庫服務(wù)器執(zhí)行非授權(quán)的任意查詢,從而進(jìn)一步獲取到數(shù)據(jù)信息。

簡而言之,SQL 注入就是在用戶輸入的字符串中加入 SQL 語句,如果在設(shè)計(jì)不良的程序中忽略了檢查,那么這些注入進(jìn)去的 SQL 語句就會(huì)被數(shù)據(jù)庫服務(wù)器誤認(rèn)為是正常的 SQL 語句而運(yùn)行,攻擊者就可以執(zhí)行計(jì)劃外的命令或訪問未被授權(quán)的數(shù)據(jù)。


?

SQL 注入已經(jīng)成為互聯(lián)網(wǎng)世界 Web 應(yīng)用程序的最大風(fēng)險(xiǎn),我們有必要從開發(fā)、測(cè)試、上線等各個(gè)環(huán)節(jié)對(duì)其進(jìn)行防范。下面介紹 SQL 注入的原理及避免 SQL 注入的一些方法。

SQL注入的原理

SQL 注入的原理主要有以下 4 點(diǎn):

1)惡意拼接查詢

我們知道,SQL 語句可以查詢、插入、更新和刪除數(shù)據(jù),且使用分號(hào)來分隔不同的命令。例如:

SELECT * FROM users WHERE user_id = $user_id

其中,user_id 是傳入的參數(shù),如果傳入的參數(shù)值為“1234; DELETE?FROM users”,那么最終的查詢語句會(huì)變?yōu)椋?/p>

SELECT * FROM users WHERE user_id = 1234; DELETE FROM users

如果以上語句執(zhí)行,則會(huì)刪除 users 表中的所有數(shù)據(jù)。

2)利用注釋執(zhí)行非法命令。

SQL 語句中可以插入注釋。例如:

SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version=$version

如果 version 包含了惡意的字符串'-1' OR 3 AND SLEEP(500)--,那么最終查詢語句會(huì)變?yōu)椋?/p>

SELECT COUNT(*) AS 'num' FROM game_score WHERE game_id=24411 AND version='-1' OR 3 AND SLEEP(500)--

以上惡意查詢只是想耗盡系統(tǒng)資源,SLEEP(500) 將導(dǎo)致 SQL 語句一直運(yùn)行。如果其中添加了修改、刪除數(shù)據(jù)的惡意指令,那么將會(huì)造成更大的破壞。

3)傳入非法參數(shù)

SQL 語句中傳入的字符串參數(shù)是用單引號(hào)引起來的,如果字符串本身包含單引號(hào)而沒有被處理,那么可能會(huì)篡改原本 SQL 語句的作用。 例如:

SELECT * FROM user_name WHERE user_name = $user_name

如果 user_name 傳入?yún)?shù)值為 G'chen,那么最終的查詢語句會(huì)變?yōu)椋?/p>

SELECT * FROM user_name WHERE user_name ='G'chen'

一般情況下,以上語句會(huì)執(zhí)行出錯(cuò),這樣的語句風(fēng)險(xiǎn)比較小。雖然沒有語法錯(cuò)誤,但可能會(huì)惡意產(chǎn)生 SQL 語句,并且以一種你不期望的方式運(yùn)行。

4)添加額外條件

在 SQL 語句中添加一些額外條件,以此來改變執(zhí)行行為。條件一般為真值表達(dá)式。例如:

UPDATE users SET userpass='$userpass' WHERE user_id=$user_id;

如果 user_id 被傳入惡意的字符串“1234 OR TRUE”,那么最終的 SQL 語句會(huì)變?yōu)椋?/p>

UPDATE users SET userpass= '123456' WHERE user_id=1234 OR TRUE;

這將更改所有用戶的密碼。

SQL注入:通過在Web表單中插入SQL命令提交或輸入域名或頁面請(qǐng)求的查詢字符串來欺騙服務(wù)器執(zhí)行惡意SQL命令。

具體來說,就是利用現(xiàn)有應(yīng)用程序?qū)ⅲ◥阂猓㏒QL命令注入到后臺(tái)數(shù)據(jù)庫引擎執(zhí)行中的能力,可以通過在Web表單中輸入(惡意)SQL語句來獲取安全漏洞網(wǎng)站上的數(shù)據(jù)庫,而不是按照設(shè)計(jì)者的意圖執(zhí)行 SQL 語句。例如,以往的很多影視網(wǎng)站泄露VIP會(huì)員密碼的方式大多是通過WEB表單提交查詢字符

?

網(wǎng)站頁面包含與數(shù)據(jù)庫交互的部分(如新聞網(wǎng)站的搜索功能),當(dāng)在網(wǎng)站上輸入數(shù)據(jù)信息時(shí),將數(shù)據(jù)信息編程并傳遞給執(zhí)行的數(shù)據(jù)庫。對(duì)傳入數(shù)據(jù)庫的相應(yīng)數(shù)據(jù)進(jìn)行安全處理(如過濾特殊字符、編碼等),使黑客可以通過網(wǎng)站并在數(shù)據(jù)庫中執(zhí)行它們。這些以黑客為目的的SQL語句會(huì)導(dǎo)致數(shù)據(jù)庫信息的泄露和破壞。

1、數(shù)字注入點(diǎn)

很多網(wǎng)頁鏈接都有類似的結(jié)構(gòu) http://www.XXX.com/123456.php?id=1 基于這種形式的注入,一般稱為數(shù)字注入點(diǎn),因?yàn)樗淖⑷朦c(diǎn) id 類型是一個(gè)數(shù)字。在大部分網(wǎng)頁中,比如查看用戶個(gè)人信息、查看文章等,大多采用這種結(jié)構(gòu)形式來傳遞id等信息,交給后端,在數(shù)據(jù)庫中查詢相應(yīng)的信息,然后返回到前臺(tái)。這類SQL語句的原型大概是select * from table name where id=1 如果有注入,我們可以構(gòu)造類似下面的SQL注入語句進(jìn)行爆破: select * from table name where id=1 and 1= 1

2、字符注入點(diǎn)

網(wǎng)頁鏈接結(jié)構(gòu)類似 http://www.XXX.com/users.php?user=admin 在這種形式中,注入點(diǎn)的用戶類型是字符類型,所以稱為字符注入觀點(diǎn)。這類 SQL 語句的原型大概是 select * from table name where user='admin'。值得注意的是,這里的引號(hào)比數(shù)值注入類型的SQL語句原型要多,可以是單引號(hào),也可以是雙引號(hào)。如果有注入,我們可以構(gòu)造類似如下的sql注入語句進(jìn)行爆破: select * from table name where user='admin' and 1=1 ' 我們需要處理這些煩人的引號(hào)。

3、搜索注入點(diǎn)

這是一種特殊類型的注入。這類注入主要是指在數(shù)據(jù)搜索時(shí)不過濾搜索參數(shù)。一般鏈接地址中有“keyword=keyword”,有的鏈接地址不顯示,而是直接通過搜索框表單提交。此類注入點(diǎn)提交的SQL語句的原始形式大致為:select * from table name where field like '%keyword%' 如果有注入,我們可以構(gòu)造類似如下的SQL注入語句進(jìn)行爆破:select * 來自表名稱,其中字段如 '%test%' 和 '%1%'='%1%'

只要所有輸入都與數(shù)據(jù)庫交互,就可能觸發(fā) SQL 注入。 SQL注入可分為:按數(shù)據(jù)提交方式:

(1)GET注入:提交數(shù)據(jù)的方法是GET,注入點(diǎn)的位置在GET參數(shù)部分。比如有這樣一個(gè)鏈接http://xxx.com/ news.php?id=1 ,id為注入點(diǎn)。

(2)POST注入:使用POST方式提交數(shù)據(jù),注入點(diǎn)位于POST數(shù)據(jù)部分,經(jīng)常出現(xiàn)在表單中。

(3)Cookie注入:客戶端的cookie會(huì)包含在HTTP請(qǐng)求中,注入點(diǎn)存在于cookie中的某個(gè)字段中。

(4)HTTP頭注入:注入點(diǎn)在HTTP請(qǐng)求頭中的一個(gè)字段中。例如存在于User-Agent字段中。嚴(yán)格來說cookies也應(yīng)該被認(rèn)為是一種header注入.form.因?yàn)樵贖TTP請(qǐng)求中,Cookie是header中的一個(gè)字段。

按照提交方式分類后,你會(huì)發(fā)現(xiàn)SQL注入最長出現(xiàn)在鏈接地址、數(shù)據(jù)參數(shù)、cookie信息和HTTP請(qǐng)求頭中。

了解SQL注入的可能位置,然后我們需要判斷這些位置是否可以觸發(fā)SQL注入。最簡單的方法是在對(duì)應(yīng)的位置輸入and 1=1(和and 1=1的變換形式)來判斷。對(duì)于不同的注入點(diǎn)類型,比如字符類型,需要適當(dāng)加單引號(hào),而對(duì)于數(shù)字類型的注入點(diǎn),則不需要。

SQL注入高級(jí)分類(按執(zhí)行效果分類)

1、基于布爾的盲注:即可以根據(jù)返回的頁面判斷條件真假的注入。

2、基于時(shí)間的盲注:即不能根據(jù)頁面返回的內(nèi)容判斷任何信息,使用條件語句檢查是否執(zhí)行了延時(shí)語句(即頁面返回時(shí)間是否增加)。

3、基于錯(cuò)誤注入:即頁面會(huì)返回錯(cuò)誤信息,或者注入語句的結(jié)果直接返回給頁面。

4、聯(lián)合查詢注入:聯(lián)合可用時(shí)注入。

5、堆查詢注入:可以同時(shí)執(zhí)行多條語句的注入。

6、寬字節(jié)注入:使用gbk是多字節(jié)編碼,兩個(gè)字節(jié)代表一個(gè)漢字

?

?

?

?

避免SQL注入

對(duì)于 SQL 注入,我們可以采取適當(dāng)?shù)念A(yù)防措施來保護(hù)數(shù)據(jù)安全。下面是避免 SQL 注入的一些方法。

1. 過濾輸入內(nèi)容,校驗(yàn)字符串

過濾輸入內(nèi)容就是在數(shù)據(jù)提交到數(shù)據(jù)庫之前,就把用戶輸入中的不合法字符剔除掉??梢允褂镁幊陶Z言提供的處理函數(shù)或自己的處理函數(shù)來進(jìn)行過濾,還可以使用正則表達(dá)式匹配安全的字符串。

如果值屬于特定的類型或有具體的格式,那么在拼接 SQL 語句之前就要進(jìn)行校驗(yàn),驗(yàn)證其有效性。比如對(duì)于某個(gè)傳入的值,如果可以確定是整型,則要判斷它是否為整型,在瀏覽器端(客戶端)和服務(wù)器端都需要進(jìn)行驗(yàn)證。

2. 參數(shù)化查詢

參數(shù)化查詢目前被視作是預(yù)防 SQL 注入攻擊最有效的方法。參數(shù)化查詢是指在設(shè)計(jì)與數(shù)據(jù)庫連接并訪問數(shù)據(jù)時(shí),在需要填入數(shù)值或數(shù)據(jù)的地方,使用參數(shù)(Parameter)來給值。

MySQL 的參數(shù)格式是以“?”字符加上參數(shù)名稱而成,如下所示:

UPDATE myTable SET c1 = ?c1, c2 = ?c2, c3 = ?c3 WHERE c4 = ?c4

在使用參數(shù)化查詢的情況下,數(shù)據(jù)庫服務(wù)器不會(huì)將參數(shù)的內(nèi)容視為 SQL 語句的一部分來進(jìn)行處理,而是在數(shù)據(jù)庫完成 SQL 語句的編譯之后,才套用參數(shù)運(yùn)行。因此就算參數(shù)中含有破壞性的指令,也不會(huì)被數(shù)據(jù)庫所運(yùn)行。

3. 安全測(cè)試、安全審計(jì)

除了開發(fā)規(guī)范,還需要合適的工具來確保代碼的安全。我們應(yīng)該在開發(fā)過程中應(yīng)對(duì)代碼進(jìn)行審查,在測(cè)試環(huán)節(jié)使用工具進(jìn)行掃描,上線后定期掃描安全漏洞。通過多個(gè)環(huán)節(jié)的檢查,一般是可以避免 SQL 注入的。

有些人認(rèn)為存儲(chǔ)過程可以避免 SQL 注入,存儲(chǔ)過程在傳統(tǒng)行業(yè)里用得比較多,對(duì)于權(quán)限的控制是有一定用處的,但如果存儲(chǔ)過程用到了動(dòng)態(tài)查詢,拼接 SQL,一樣會(huì)存在安全隱患。

下面是在開發(fā)過程中可以避免 SQL 注入的一些方法。

1. 避免使用動(dòng)態(tài)SQL

避免將用戶的輸入數(shù)據(jù)直接放入 SQL 語句中,最好使用準(zhǔn)備好的語句和參數(shù)化查詢,這樣更安全。

2. 不要將敏感數(shù)據(jù)保留在純文本中

加密存儲(chǔ)在數(shù)據(jù)庫中的私有/機(jī)密數(shù)據(jù),這樣可以提供了另一級(jí)保護(hù),以防攻擊者成功地排出敏感數(shù)據(jù)。

3. 限制數(shù)據(jù)庫權(quán)限和特權(quán)

將數(shù)據(jù)庫用戶的功能設(shè)置為最低要求;這將限制攻擊者在設(shè)法獲取訪問權(quán)限時(shí)可以執(zhí)行的操作。

4. 避免直接向用戶顯示數(shù)據(jù)庫錯(cuò)誤

攻擊者可以使用這些錯(cuò)誤消息來獲取有關(guān)數(shù)據(jù)庫的信息。

一些編程框架對(duì)于寫出更安全的代碼也有一定的幫助,因?yàn)樗峁┝艘恍┨幚碜址暮瘮?shù)和使用查詢參數(shù)的方法。但同樣,你仍然可以編寫出不安全的 SQL 語句。所以歸根到底,我們需要有良好的編碼規(guī)范,并能充分利用參數(shù)化查詢、字符串處理和參數(shù)校驗(yàn)等多種辦法來保護(hù)數(shù)據(jù)庫和程序的安全。

?

1.嚴(yán)格區(qū)分用戶權(quán)限

?

在權(quán)限設(shè)計(jì)中,針對(duì)軟件用戶,沒有必要給予數(shù)據(jù)庫的創(chuàng)建、刪除等管理權(quán)限。這樣即便在用戶輸入的SQL語句種含有內(nèi)嵌式的惡意程序,因?yàn)槠錂?quán)限的限定,也不可能執(zhí)行。所以程序在權(quán)限設(shè)計(jì)時(shí),最好把管理員與用戶區(qū)別起來。這樣能夠最大限度的降低注入式攻擊對(duì)數(shù)據(jù)庫產(chǎn)生的損害。

2、強(qiáng)制使用參數(shù)化語句。

如果用戶輸入的變量在編寫SQL語句時(shí)沒有直接嵌入到SQL語句中。如果將此變量通過參數(shù)傳遞,則可以有效防止 SQL 注入攻擊。也就是說,用戶的輸入不能直接嵌入到 SQL 語句中。相反,必須過濾用戶輸入,或者必須使用參數(shù)化語句來傳遞用戶輸入變量。參數(shù)化語句使用參數(shù)而不是將用戶輸入變量嵌入到 SQL 語句中。使用這種措施可以防止大部分的 SQL 注入攻擊。不幸的是,支持參數(shù)化語句的數(shù)據(jù)庫引擎并不多。但是,數(shù)據(jù)庫工程師在開發(fā)產(chǎn)品時(shí)應(yīng)該盡量使用參數(shù)化語句。

3、使用 SQL Server 數(shù)據(jù)庫附帶的安全參數(shù)。

為了減少注入攻擊對(duì)SQL Server數(shù)據(jù)庫的不利影響,在SQL Server數(shù)據(jù)庫中專門設(shè)計(jì)了相對(duì)安全的SQL參數(shù)。在數(shù)據(jù)庫設(shè)計(jì)過程中,工程師應(yīng)該盡量利用這些參數(shù)來防止惡意SQL注入攻擊。

Parameters 集合在 SQL Server 數(shù)據(jù)庫中提供。此集合提供類型檢查和長度驗(yàn)證。如果管理員使用Parameters集合,用戶輸入將被視為字符值而不是可執(zhí)行代碼。即使用戶輸入包含可執(zhí)行代碼,數(shù)據(jù)庫也會(huì)將其過濾掉。因?yàn)榇藭r(shí)數(shù)據(jù)庫只將其視為普通字符。使用Parameters集合的另一個(gè)好處是可以強(qiáng)制執(zhí)行類型和長度檢查,超出范圍的值會(huì)觸發(fā)異常。如果用戶輸入的值不滿足指定的類型和長度限制,則會(huì)引發(fā)異常并報(bào)告給管理員。如上例,如果員工編號(hào)定義的數(shù)據(jù)類型為字符串,則長度為10個(gè)字符。用戶輸入的內(nèi)容也是字符型數(shù)據(jù),但長度達(dá)到20個(gè)字符。此時(shí)會(huì)拋出異常,因?yàn)橛脩糨斎氲膬?nèi)容長度超過了數(shù)據(jù)庫字段長度的限制。

4、增強(qiáng)的用戶輸入驗(yàn)證。

一般來說,可以使用兩種方法來防止 SQL 注入攻擊。一是加強(qiáng)對(duì)用戶輸入內(nèi)容的檢查和驗(yàn)證;另一種是強(qiáng)制使用參數(shù)化語句來傳遞用戶輸入的內(nèi)容。在 SQL Server 數(shù)據(jù)庫中,有很多用戶輸入內(nèi)容驗(yàn)證工具,可以幫助管理員應(yīng)對(duì) SQL 注入攻擊。測(cè)試字符串變量的內(nèi)容,只接受所需的值。拒絕包含二進(jìn)制數(shù)據(jù)、轉(zhuǎn)義序列和注釋字符的輸入。這有助于防止腳本注入,防止一些緩沖區(qū)溢出攻擊。測(cè)試用戶輸入的大小和數(shù)據(jù)類型,實(shí)施適當(dāng)?shù)南拗坪娃D(zhuǎn)換。這有助于防止故意的緩沖區(qū)溢出,對(duì)防止注入攻擊有比較明顯的效果。

例如,存儲(chǔ)過程可用于驗(yàn)證用戶輸入。使用存儲(chǔ)過程可以過濾用戶輸入的變量,比如拒絕一些特殊的符號(hào)。比如上面的惡意代碼,只要存儲(chǔ)過程過濾掉分號(hào),惡意代碼就沒用了。在執(zhí)行 SQL 語句之前,可以通過數(shù)據(jù)庫的存儲(chǔ)過程拒絕接受一些特殊符號(hào)。在不影響數(shù)據(jù)庫應(yīng)用的前提下,應(yīng)使數(shù)據(jù)庫拒絕包含以下字符的輸入。和分號(hào)分隔符一樣,是SQL注入攻擊的主要幫兇。例如注釋分隔符。注釋僅在數(shù)據(jù)設(shè)計(jì)期間使用。一般用戶的查詢語句中沒有必要的注釋內(nèi)容,直接拒絕即可。通常,這樣做不會(huì)有意外損失。如果這些特殊符號(hào)被拒絕,即使 SQL 語句中嵌入了惡意代碼,它們也不會(huì)做任何事情。

因此,請(qǐng)始終通過測(cè)試類型、長度、格式和范圍來驗(yàn)證用戶輸入,并過濾用戶輸入。這是防止 SQL 注入攻擊的常用且行之有效的措施。

5、如何防范多層環(huán)境下的SQL注入攻擊?

在多層應(yīng)用環(huán)境中,用戶輸入的所有數(shù)據(jù)在被允許進(jìn)入可信區(qū)域之前都應(yīng)該經(jīng)過身份驗(yàn)證。驗(yàn)證過程失敗的數(shù)據(jù)應(yīng)被數(shù)據(jù)庫拒絕,并向上層返回錯(cuò)誤消息。實(shí)施多層身份驗(yàn)證。對(duì)沒有目的的惡意用戶采取的預(yù)防措施可能對(duì)堅(jiān)定的攻擊者無效。更好的做法是在用戶界面和跨信任邊界的所有后續(xù)點(diǎn)驗(yàn)證輸入。例如,驗(yàn)證客戶端應(yīng)用程序中的數(shù)據(jù)可以防止簡單的腳本注入。但是,如果下一層認(rèn)為其輸入已經(jīng)過驗(yàn)證,則任何可以繞過客戶端的惡意用戶都可以不受限制地訪問系統(tǒng)。因此,對(duì)于多層應(yīng)用環(huán)境,在防范注入攻擊時(shí),需要各層協(xié)同工作,客戶端和數(shù)據(jù)庫端都必須采取相應(yīng)的措施來防范SQL語句注入攻擊。

5.利用陷阱賬戶

?

可以設(shè)定兩個(gè)賬戶,即管理員賬戶和防注入賬戶。將防注入的賬戶偽裝成管理員賬戶,如將名稱設(shè)置為admin,讓檢測(cè)軟件產(chǎn)生錯(cuò)覺,在密碼方面,可以設(shè)置成超長的中文字符(幾千字),讓攻擊者的漏洞檢測(cè)軟件達(dá)到高負(fù)荷狀態(tài)直至資源耗盡。

我是艾西,今天的分享就到這里啦。

攜手馳網(wǎng)為您網(wǎng)絡(luò)的道路上保駕護(hù)航

?


sql注入攻擊的原理以及防范措施的評(píng)論 (共 條)

分享到微博請(qǐng)遵守國家法律
罗甸县| 亚东县| 英德市| 德州市| 辽中县| 偃师市| 郑州市| 紫金县| 岳池县| 南华县| 托克托县| 武功县| 昭通市| 宜君县| 湘西| 靖州| 夏津县| 隆德县| 河东区| 商都县| 齐齐哈尔市| 博罗县| 通江县| 岑巩县| 桐梓县| 渝中区| 巫溪县| 托里县| 卓尼县| 察雅县| 乐业县| 绥宁县| 安阳市| 隆回县| 乳山市| 石城县| 宕昌县| 洞口县| 涡阳县| 顺平县| 西乡县|