《Mysql必讀MySQL解決SQL注入的另類(lèi)方法詳解》要點(diǎn):
本文介紹了Mysql必讀MySQL解決SQL注入的另類(lèi)方法詳解,希望對(duì)您有用。如果有疑問(wèn),可以聯(lián)系我們。
本文實(shí)例講述了MySQL解決SQL注入的另類(lèi)辦法.分享給大家供大家參考,具體如下:MYSQL應(yīng)用
問(wèn)題解讀MYSQL應(yīng)用
我覺(jué)得,這個(gè)問(wèn)題每年帶來(lái)的成本可以高達(dá)數(shù)十億美元了.本文就來(lái)談?wù)?假定我們有如下 SQL 模板語(yǔ)句:MYSQL應(yīng)用
select * from T where f1 = '{value1}' and f2 = {value2}
現(xiàn)在我們需要根據(jù)用戶(hù)輸入值填充該語(yǔ)句:MYSQL應(yīng)用
value1=hello value2=5
我們得到了下面的 SQL 語(yǔ)句,我們?cè)偬峤唤o數(shù)據(jù)庫(kù):MYSQL應(yīng)用
select * from T where f1='hello' and f2=5
問(wèn)題在于,攻擊者可以構(gòu)造如下的用戶(hù)輸入值:MYSQL應(yīng)用
value1=anything' or 1=1 or f1='whatever value2=5
拼接好的最終語(yǔ)句就變成了:MYSQL應(yīng)用
select * from T where f1='anything' or 1=1 or f1='whatever' and f2=5
攻擊者成功地改變了模板語(yǔ)句的語(yǔ)義.這種問(wèn)題不單單發(fā)生在 SQL 上,還出現(xiàn)在通常使用模板的任何語(yǔ)言上,比如 HTML 和 shell 腳本.MYSQL應(yīng)用
常規(guī)辦理方案的說(shuō)明MYSQL應(yīng)用
SQL 是具備任意性和一致性的公理,token 和派生規(guī)則構(gòu)成其公理化基礎(chǔ).要注意的一個(gè)詞語(yǔ)是「任意性」.與 SQL 等價(jià)的公理化數(shù)不勝數(shù).對(duì)于這種任意等價(jià)的表示,每一條合法的語(yǔ)句都能被準(zhǔn)確地映射到 SQL 里的合法語(yǔ)句,其它語(yǔ)言亦然.在這種任意等價(jià)表示中,如果某語(yǔ)句是不合法的,那么它在 SQL 里也是不合法的.攻擊者不可能構(gòu)造出可以滿(mǎn)足任何可能的、任意與 SQL 等價(jià)的規(guī)則.MYSQL應(yīng)用
策略1:根據(jù)不同的派生規(guī)則,用另一種語(yǔ)法擴(kuò)展模板語(yǔ)句MYSQL應(yīng)用
例子1:前綴語(yǔ)言MYSQL應(yīng)用
SQL 使用中綴表示法注1.中綴表示法等價(jià)于 lisp 風(fēng)格的前綴表示法注2.中綴與前綴:MYSQL應(yīng)用
a OP1 b OP2 c <=> (OP1 a (OP2 b c))
a、b、c 是標(biāo)識(shí)符或值,OP1、OP2 是操作符或功能.MYSQL應(yīng)用
前綴表示法的示例語(yǔ)句:MYSQL應(yīng)用
(select * T (and (= f1 '{value1}') (= f2 {value2})))
該語(yǔ)句是等價(jià)的.它們?cè)谡Z(yǔ)義上屬于外延.自動(dòng)把 SQL 的中綴表示法轉(zhuǎn)換成前綴表示法或其它表示法,都不算問(wèn)題了.然而,攻擊者的注入在前綴語(yǔ)法方面就是不合法的:
MYSQL應(yīng)用
語(yǔ)法錯(cuò)誤.攻擊者想要的是:
MYSQL應(yīng)用
這是不同的.攻擊者的注入不能輸出合法的前綴語(yǔ)言.MYSQL應(yīng)用
例子2:歐拉表示法MYSQL應(yīng)用
另一個(gè)替代辦法將數(shù)得著歐拉表示法了.從中綴表示法到歐拉:MYSQL應(yīng)用
a OP1 b OP2 c <=> OP1(a,OP2(b,c))
例子中的語(yǔ)句:MYSQL應(yīng)用
select( *,T,and(=(f1,'{value1}'),=(f2,{value2})))
而注入的語(yǔ)句將出現(xiàn)語(yǔ)法錯(cuò)誤:
MYSQL應(yīng)用
攻擊者本來(lái)是想寫(xiě)成:
MYSQL應(yīng)用
攻擊者正在做錯(cuò)誤的事情.他的注入根本就沒(méi)有注意到所選的任意標(biāo)記法.MYSQL應(yīng)用
例子3:對(duì)象標(biāo)記法(object notation)MYSQL應(yīng)用
還有一種替代辦法,對(duì)象標(biāo)記法.從前綴表示法到對(duì)象:MYSQL應(yīng)用
a OP1 b OP2 c <=> a.OP1(b).OP2(c)
例子的代碼:MYSQL應(yīng)用
T.where(f1.=('{value1}').and(f2.=({value2})).select(*)
注入再一次折戟于語(yǔ)法:MYSQL應(yīng)用
T.where(f1.=('anything' or 1=1 or a='whatever').and(f2.=5)).select(*)
我不再提供正確答案了,讀者可以當(dāng)做練習(xí),看看攻擊者應(yīng)該寫(xiě)成什么樣子.MYSQL應(yīng)用
策略2:為 SQL 選擇其它任意 tokenMYSQL應(yīng)用
keyword 常常是一門(mén)語(yǔ)言里的任意 token.重要的是它們?cè)谂缮?guī)則里的位置、而非它們的任意體現(xiàn).你總是可以用其它 keyword 替換現(xiàn)有 keyword,并且來(lái)回轉(zhuǎn)換.舉個(gè)例子,我們可以將下面 SQL 語(yǔ)句中的 keyword 轉(zhuǎn)換成我們姑且稱(chēng)為「任意的 brainfuck」:
MYSQL應(yīng)用
為了論證起見(jiàn),我們將把操作數(shù)映射為 半任意的結(jié)構(gòu)化序列:MYSQL應(yīng)用
T <=> @phai1Oa6@T@ hello <=> @phai1Oa6@hello@
phai1Oa6 是任意選取的字符序列.對(duì)于當(dāng)前情形,例子:MYSQL應(yīng)用
select * from T where f1 = '{value1}' and f2 = {value2}
變成了:MYSQL應(yīng)用
iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad '{value1}' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad {value2}MYSQL應(yīng)用
這是合法的、任意的 brainfuck 語(yǔ)言.經(jīng)過(guò)注入之后,我們得到了:MYSQL應(yīng)用
iph0ohKi ieZoh4xa aeZi5uja @phai1Oa6@T@ OoJ4aX4n @phai1Oa6@f1@ eeQu2Zad 'anything' or 1=1 or a='whatever' @phai1Oa6@and@ @phai1Oa6@f2@ eeQu2Zad 5MYSQL應(yīng)用
你可以看到,它包含的 token 有 'or' 和 '=',它們?cè)谌我獾?brainfuck 語(yǔ)言中是不合法的.我們的語(yǔ)法說(shuō),你必須這樣使用:MYSQL應(yīng)用
or <=> Ocaig5Es = <=> eeQu2Zad
這些 token 也不是操作數(shù),因?yàn)樗鼈儗⒅荒鼙灰曌鳎?span id="im1cbna6vd" class="showhide">MYSQL應(yīng)用
or <=> @phai1Oa6@or@ = <=> @phai1Oa6@=@
換句話(huà)說(shuō),注入之后的語(yǔ)句就變得不合法、也不可用了.MYSQL應(yīng)用
策略3:驗(yàn)證不變量MYSQL應(yīng)用
你數(shù)數(shù)下面模板語(yǔ)句例子中的 token 有幾個(gè)?MYSQL應(yīng)用
[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] '{value1}' [9] and [10] f2 [11] = [12] {value2}
12 個(gè).模板填充之后,總數(shù)必須仍然為 12,但是我們卻看到了攻擊者所引發(fā)的結(jié)果:MYSQL應(yīng)用
[1] select [2] * [3] from [4] T [5] where [6] f1 [7] = [8] 'anything' [9] or [10] 1 [11] = [12] 1 [13] or [14] a [15] = [16] 'whatever' [17] and [18] f2 [19] = [20] 5MYSQL應(yīng)用
現(xiàn)在有 20 個(gè) token .違反這種不變量,就暴露了有問(wèn)題的地方.同樣適用于相同語(yǔ)句的表示,除了任意的、brainfuck 語(yǔ)言.模板的填充根本不可能導(dǎo)致 token 數(shù)量的變化.MYSQL應(yīng)用
事實(shí)上,你可以試著使用其它不變量,并在填充之后進(jìn)行驗(yàn)證.攻擊者必須和它們保持一致.MYSQL應(yīng)用
結(jié)論MYSQL應(yīng)用
有些人提倡,程序員在填充 SQL 模板時(shí),應(yīng)該更加小心.應(yīng)對(duì) SQL 注入問(wèn)題,只是需要在編程方面多加小心.很明顯,這種方式算不上辦理方案.人們?nèi)匀辉谛r?yàn)用戶(hù)輸入值方面出現(xiàn)錯(cuò)誤,最終接受了帶有惡意的用戶(hù)輸入值.換句話(huà)說(shuō),單憑我們所有人更努力地工作,是無(wú)法根本辦理這種問(wèn)題的.MYSQL應(yīng)用
真正的辦理方案在于,SQL 語(yǔ)句本身的任意性,并要求所有現(xiàn)存不變量都符合任意的等價(jià)結(jié)構(gòu)的規(guī)則.無(wú)需程序員的干預(yù),就能自動(dòng)完成.MYSQL應(yīng)用
攻擊者不得不符合一種未知的、任意的 brainfuck 語(yǔ)法的規(guī)則.想要符合一組未知的規(guī)則,將是難以辦理的問(wèn)題.因此,攻擊者通常無(wú)法得手.MYSQL應(yīng)用
更多關(guān)于MySQL相關(guān)內(nèi)容感興趣的讀者可查看本站專(zhuān)題:《MySQL日志操作技巧大全》、《MySQL事務(wù)操作技巧匯總》、《MySQL存儲(chǔ)過(guò)程技巧大全》、《MySQL數(shù)據(jù)庫(kù)鎖相關(guān)技巧匯總》及《MySQL常用函數(shù)大匯總》MYSQL應(yīng)用
希望本文所述對(duì)大家MySQL數(shù)據(jù)庫(kù)計(jì)有所贊助.MYSQL應(yīng)用
歡迎參與《Mysql必讀MySQL解決SQL注入的另類(lèi)方法詳解》討論,分享您的想法,維易PHP學(xué)院為您提供專(zhuān)業(yè)教程。
轉(zhuǎn)載請(qǐng)注明本頁(yè)網(wǎng)址:
http://www.fzlkiss.com/jiaocheng/11547.html