SQL 注入是注入式攻擊中的常見類型。 SQL 注入式攻擊是未將代碼與數(shù)據(jù)進(jìn)行嚴(yán)格的隔離 ,導(dǎo)致在讀取用戶數(shù)據(jù)的時(shí)候 , 錯(cuò)誤地把數(shù)據(jù)作為代碼的一部分執(zhí)行 , 從而導(dǎo)致一些安全問(wèn)題。
創(chuàng)新互聯(lián)建站提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站建設(shè)、網(wǎng)頁(yè)設(shè)計(jì),成都品牌網(wǎng)站建設(shè),廣告投放等致力于企業(yè)網(wǎng)站建設(shè)與公司網(wǎng)站制作,十載的網(wǎng)站開發(fā)和建站經(jīng)驗(yàn),助力企業(yè)信息化建設(shè),成功案例突破上1000+,是您實(shí)現(xiàn)網(wǎng)站建設(shè)的好選擇.
SQL 注入自誕生以來(lái)以其巨大的殺傷力聞名。典型的 SQL 注入的例子是當(dāng)對(duì) SQL 語(yǔ)旬進(jìn)行字符串拼接操作時(shí) , 直接使用未加轉(zhuǎn)義的用戶輸入內(nèi)容作為變量 ,比如 :
實(shí)例
在上面的例子中 ,如果用戶輸入的 ID 只是一個(gè)數(shù)字是沒(méi)有問(wèn)題的 , 可以執(zhí)行正常的查詢語(yǔ)句。但如果直接用“;”隔開,在 testCondition 里插入其他 SQL 語(yǔ)旬,會(huì)帶來(lái)意想不到的結(jié)果,比如輸入 drop 、 delete 等。
sql注入主要是通過(guò)地址欄的傳參來(lái)猜解你的數(shù)據(jù)庫(kù)管理員表的用戶名及密碼,從而進(jìn)入你網(wǎng)站后臺(tái)。
百度百科里:有詳細(xì)的說(shuō)明,不過(guò)現(xiàn)在都用sql注入軟件了,手動(dòng)進(jìn)行猜解的很少了,效率也低!所以你加上放sql注入代碼還是很有必要的。
一、 SQL注入攻擊的簡(jiǎn)單示例。
statement := "SELECT * FROM Users WHERE Value= " + a_variable + "
上面這條語(yǔ)句是很普通的一條SQL語(yǔ)句,他主要實(shí)現(xiàn)的功能就是讓用戶輸入一個(gè)員工編號(hào)然后查詢處這個(gè)員工的信息。但是若這條語(yǔ)句被不法攻擊者改裝過(guò)后,就可能成為破壞數(shù)據(jù)的黑手。如攻擊者在輸入變量的時(shí)候,輸入以下內(nèi)容SA001’;drop table c_order--。那么以上這條SQL語(yǔ)句在執(zhí)行的時(shí)候就變?yōu)榱薙ELECT * FROM Users WHERE Value= ‘SA001’;drop table c_order--。
這條語(yǔ)句是什么意思呢?‘SA001’后面的分號(hào)表示一個(gè)查詢的結(jié)束和另一條語(yǔ)句的開始。c_order后面的雙連字符 指示當(dāng)前行余下的部分只是一個(gè)注釋,應(yīng)該忽略。如果修改后的代碼語(yǔ)法正確,則服務(wù)器將執(zhí)行該代碼。系統(tǒng)在處理這條語(yǔ)句時(shí),將首先執(zhí)行查詢語(yǔ)句,查到用戶編號(hào)為SA001 的用戶信息。然后,數(shù)據(jù)將刪除表C_ORDER(如果沒(méi)有其他主鍵等相關(guān)約束,則刪除操作就會(huì)成功)。只要注入的SQL代碼語(yǔ)法正確,便無(wú)法采用編程方式來(lái)檢測(cè)篡改。因此,必須驗(yàn)證所有用戶輸入,并仔細(xì)檢查在您所用的服務(wù)器中執(zhí)行構(gòu)造 SQL命令的代碼。
二、 SQL注入攻擊原理。
可見SQL注入攻擊的危害性很大。在講解其防止辦法之前,數(shù)據(jù)庫(kù)管理員有必要先了解一下其攻擊的原理。這有利于管理員采取有針對(duì)性的防治措施。
SQL注入是目前比較常見的針對(duì)數(shù)據(jù)庫(kù)的一種攻擊方式。在這種攻擊方式中,攻擊者會(huì)將一些惡意代碼插入到字符串中。然后會(huì)通過(guò)各種手段將該字符串傳遞到SQLServer數(shù)據(jù)庫(kù)的實(shí)例中進(jìn)行分析和執(zhí)行。只要這個(gè)惡意代碼符合SQL語(yǔ)句的規(guī)則,則在代碼編譯與執(zhí)行的時(shí)候,就不會(huì)被系統(tǒng)所發(fā)現(xiàn)。
SQL注入式攻擊的主要形式有兩種。一是直接將代碼插入到與SQL命令串聯(lián)在一起并使得其以執(zhí)行的用戶輸入變量。上面筆者舉的例子就是采用了這種方法。由于其直接與SQL語(yǔ)句捆綁,故也被稱為直接注入式攻擊法。二是一種間接的攻擊方法,它將惡意代碼注入要在表中存儲(chǔ)或者作為原書據(jù)存儲(chǔ)的字符串。在存儲(chǔ)的字符串中會(huì)連接到一個(gè)動(dòng)態(tài)的SQL命令中,以執(zhí)行一些惡意的SQL代碼。
注入過(guò)程的工作方式是提前終止文本字符串,然后追加一個(gè)新的命令。如以直接注入式攻擊為例。就是在用戶輸入變量的時(shí)候,先用一個(gè)分號(hào)結(jié)束當(dāng)前的語(yǔ)句。然后再插入一個(gè)惡意SQL語(yǔ)句即可。由于插入的命令可能在執(zhí)行前追加其他字符串,因此攻擊者常常用注釋標(biāo)記“—”來(lái)終止注入的字符串。執(zhí)行時(shí),系統(tǒng)會(huì)認(rèn)為此后語(yǔ)句位注釋,故后續(xù)的文本將被忽略,不背編譯與執(zhí)行。
三、 SQL注入式攻擊的防治。
既然SQL注入式攻擊的危害這么大,那么該如何來(lái)防治呢?下面這些建議或許對(duì)數(shù)據(jù)庫(kù)管理員防治SQL注入式攻擊有一定的幫助。
1、 普通用戶與系統(tǒng)管理員用戶的權(quán)限要有嚴(yán)格的區(qū)分。
如果一個(gè)普通用戶在使用查詢語(yǔ)句中嵌入另一個(gè)Drop Table語(yǔ)句,那么是否允許執(zhí)行呢?由于Drop語(yǔ)句關(guān)系到數(shù)據(jù)庫(kù)的基本對(duì)象,故要操作這個(gè)語(yǔ)句用戶必須有相關(guān)的權(quán)限。在權(quán)限設(shè)計(jì)中,對(duì)于終端用戶,即應(yīng)用軟件的使用者,沒(méi)有必要給他們數(shù)據(jù)庫(kù)對(duì)象的建立、刪除等權(quán)限。那么即使在他們使用SQL語(yǔ)句中帶有嵌入式的惡意代碼,由于其用戶權(quán)限的限制,這些代碼也將無(wú)法被執(zhí)行。故應(yīng)用程序在設(shè)計(jì)的時(shí)候,最好把系統(tǒng)管理員的用戶與普通用戶區(qū)分開來(lái)。如此可以最大限度的減少注入式攻擊對(duì)數(shù)據(jù)庫(kù)帶來(lái)的危害。
2、 強(qiáng)迫使用參數(shù)化語(yǔ)句。
如果在編寫SQL語(yǔ)句的時(shí)候,用戶輸入的變量不是直接嵌入到SQL語(yǔ)句。而是通過(guò)參數(shù)來(lái)傳遞這個(gè)變量的話,那么就可以有效的防治SQL注入式攻擊。也就是說(shuō),用戶的輸入絕對(duì)不能夠直接被嵌入到SQL語(yǔ)句中。與此相反,用戶的輸入的內(nèi)容必須進(jìn)行過(guò)濾,或者使用參數(shù)化的語(yǔ)句來(lái)傳遞用戶輸入的變量。參數(shù)化的語(yǔ)句使用參數(shù)而不是將用戶輸入變量嵌入到SQL語(yǔ)句中。采用這種措施,可以杜絕大部分的SQL注入式攻擊。不過(guò)可惜的是,現(xiàn)在支持參數(shù)化語(yǔ)句的數(shù)據(jù)庫(kù)引擎并不多。不過(guò)數(shù)據(jù)庫(kù)工程師在開發(fā)產(chǎn)品的時(shí)候要盡量采用參數(shù)化語(yǔ)句。
3、 加強(qiáng)對(duì)用戶輸入的驗(yàn)證。
總體來(lái)說(shuō),防治SQL注入式攻擊可以采用兩種方法,一是加強(qiáng)對(duì)用戶輸入內(nèi)容的檢查與驗(yàn)證;二是強(qiáng)迫使用參數(shù)化語(yǔ)句來(lái)傳遞用戶輸入的內(nèi)容。在SQLServer數(shù)據(jù)庫(kù)中,有比較多的用戶輸入內(nèi)容驗(yàn)證工具,可以幫助管理員來(lái)對(duì)付SQL注入式攻擊。測(cè)試字符串變量的內(nèi)容,只接受所需的值。拒絕包含二進(jìn)制數(shù)據(jù)、轉(zhuǎn)義序列和注釋字符的輸入內(nèi)容。這有助于防止腳本注入,防止某些緩沖區(qū)溢出攻擊。測(cè)試用戶輸入內(nèi)容的大小和數(shù)據(jù)類型,強(qiáng)制執(zhí)行適當(dāng)?shù)南拗婆c轉(zhuǎn)換。這即有助于防止有意造成的緩沖區(qū)溢出,對(duì)于防治注入式攻擊有比較明顯的效果。
如可以使用存儲(chǔ)過(guò)程來(lái)驗(yàn)證用戶的輸入。利用存儲(chǔ)過(guò)程可以實(shí)現(xiàn)對(duì)用戶輸入變量的過(guò)濾,如拒絕一些特殊的符號(hào)。如以上那個(gè)惡意代碼中,只要存儲(chǔ)過(guò)程把那個(gè)分號(hào)過(guò)濾掉,那么這個(gè)惡意代碼也就沒(méi)有用武之地了。在執(zhí)行SQL語(yǔ)句之前,可以通過(guò)數(shù)據(jù)庫(kù)的存儲(chǔ)過(guò)程,來(lái)拒絕接納一些特殊的符號(hào)。在不影響數(shù)據(jù)庫(kù)應(yīng)用的前提下,應(yīng)該讓數(shù)據(jù)庫(kù)拒絕包含以下字符的輸入。如分號(hào)分隔符,它是SQL注入式攻擊的主要幫兇。如注釋分隔符。注釋只有在數(shù)據(jù)設(shè)計(jì)的時(shí)候用的到。一般用戶的查詢語(yǔ)句中沒(méi)有必要注釋的內(nèi)容,故可以直接把他拒絕掉,通常情況下這么做不會(huì)發(fā)生意外損失。把以上這些特殊符號(hào)拒絕掉,那么即使在SQL語(yǔ)句中嵌入了惡意代碼,他們也將毫無(wú)作為。
故始終通過(guò)測(cè)試類型、長(zhǎng)度、格式和范圍來(lái)驗(yàn)證用戶輸入,過(guò)濾用戶輸入的內(nèi)容。這是防止SQL注入式攻擊的常見并且行之有效的措施。
4、 多多使用SQL Server數(shù)據(jù)庫(kù)自帶的安全參數(shù)。
為了減少注入式攻擊對(duì)于SQL Server數(shù)據(jù)庫(kù)的不良影響,在SQLServer數(shù)據(jù)庫(kù)專門設(shè)計(jì)了相對(duì)安全的SQL參數(shù)。在數(shù)據(jù)庫(kù)設(shè)計(jì)過(guò)程中,工程師要盡量采用這些參數(shù)來(lái)杜絕惡意的SQL注入式攻擊。
如在SQL Server數(shù)據(jù)庫(kù)中提供了Parameters集合。這個(gè)集合提供了類型檢查和長(zhǎng)度驗(yàn)證的功能。如果管理員采用了Parameters這個(gè)集合的話,則用戶輸入的內(nèi)容將被視為字符值而不是可執(zhí)行代碼。即使用戶輸入的內(nèi)容中含有可執(zhí)行代碼,則數(shù)據(jù)庫(kù)也會(huì)過(guò)濾掉。因?yàn)榇藭r(shí)數(shù)據(jù)庫(kù)只把它當(dāng)作普通的字符來(lái)處理。使用Parameters集合的另外一個(gè)優(yōu)點(diǎn)是可以強(qiáng)制執(zhí)行類型和長(zhǎng)度檢查,范圍以外的值將觸發(fā)異常。如果用戶輸入的值不符合指定的類型與長(zhǎng)度約束,就會(huì)發(fā)生異常,并報(bào)告給管理員。如上面這個(gè)案例中,如果員工編號(hào)定義的數(shù)據(jù)類型為字符串型,長(zhǎng)度為10個(gè)字符。而用戶輸入的內(nèi)容雖然也是字符類型的數(shù)據(jù),但是其長(zhǎng)度達(dá)到了20個(gè)字符。則此時(shí)就會(huì)引發(fā)異常,因?yàn)橛脩糨斎氲膬?nèi)容長(zhǎng)度超過(guò)了數(shù)據(jù)庫(kù)字段長(zhǎng)度的限制。
5、 多層環(huán)境如何防治SQL注入式攻擊?
在多層應(yīng)用環(huán)境中,用戶輸入的所有數(shù)據(jù)都應(yīng)該在驗(yàn)證之后才能被允許進(jìn)入到可信區(qū)域。未通過(guò)驗(yàn)證過(guò)程的數(shù)據(jù)應(yīng)被數(shù)據(jù)庫(kù)拒絕,并向上一層返回一個(gè)錯(cuò)誤信息。實(shí)現(xiàn)多層驗(yàn)證。對(duì)無(wú)目的的惡意用戶采取的預(yù)防措施,對(duì)堅(jiān)定的攻擊者可能無(wú)效。更好的做法是在用戶界面和所有跨信任邊界的后續(xù)點(diǎn)上驗(yàn)證輸入。如在客戶端應(yīng)用程序中驗(yàn)證數(shù)據(jù)可以防止簡(jiǎn)單的腳本注入。但是,如果下一層認(rèn)為其輸入已通過(guò)驗(yàn)證,則任何可以繞過(guò)客戶端的惡意用戶就可以不受限制地訪問(wèn)系統(tǒng)。故對(duì)于多層應(yīng)用環(huán)境,在防止注入式攻擊的時(shí)候,需要各層一起努力,在客戶端與數(shù)據(jù)庫(kù)端都要采用相應(yīng)的措施來(lái)防治SQL語(yǔ)句的注入式攻擊。
6、 必要的情況下使用專業(yè)的漏洞掃描工具來(lái)尋找可能被攻擊的點(diǎn)。
使用專業(yè)的漏洞掃描工具,可以幫助管理員來(lái)尋找可能被SQL注入式攻擊的點(diǎn)。不過(guò)漏洞掃描工具只能發(fā)現(xiàn)攻擊點(diǎn),而不能夠主動(dòng)起到防御SQL注入攻擊的作用。當(dāng)然這個(gè)工具也經(jīng)常被攻擊者拿來(lái)使用。如攻擊者可以利用這個(gè)工具自動(dòng)搜索攻擊目標(biāo)并實(shí)施攻擊。為此在必要的情況下,企業(yè)應(yīng)當(dāng)投資于一些專業(yè)的漏洞掃描工具。一個(gè)完善的漏洞掃描程序不同于網(wǎng)絡(luò)掃描程序,它專門查找數(shù)據(jù)庫(kù)中的SQL注入式漏洞。最新的漏洞掃描程序可以查找最新發(fā)現(xiàn)的漏洞。所以憑借專業(yè)的工具,可以幫助管理員發(fā)現(xiàn)SQL注入式漏洞,并提醒管理員采取積極的措施來(lái)預(yù)防SQL注入式攻擊。如果攻擊者能夠發(fā)現(xiàn)的SQL注入式漏洞數(shù)據(jù)庫(kù)管理員都發(fā)現(xiàn)了并采取了積極的措施堵住漏洞,那么攻擊者也就無(wú)從下手了。
文章名稱:nosql注入實(shí)例,Nosql注入
轉(zhuǎn)載來(lái)源:http://m.rwnh.cn/article48/phpoep.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、響應(yīng)式網(wǎng)站、做網(wǎng)站、面包屑導(dǎo)航、網(wǎng)站維護(hù)、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)