WAF(Web Application Firewall)對(duì)于從事信息安全領(lǐng)域的工作者來(lái)說(shuō)并不陌生,在滲透測(cè)試一個(gè)目標(biāo)的時(shí)候常常作為攔路虎讓人頭痛不已,筆者這段時(shí)間花了些精力對(duì)國(guó)內(nèi)外比較常見(jiàn)的WAF進(jìn)行了繞過(guò)研究,這只攔路虎其實(shí)也并沒(méi)有想象中那么可怕。本文從SQL語(yǔ)法層面入手,以國(guó)內(nèi)外主流 waf為研究測(cè)試對(duì)象,借助fuzz、逆向等各種技術(shù)手段,挖掘組合各種SQL功能語(yǔ)法,無(wú)視操作系統(tǒng)、中間件、計(jì)算機(jī)語(yǔ)言等差異硬杠WAF,歡迎私信交流。
WAF(Web Application Firewall)的中文名稱叫做“Web應(yīng)用防火墻”,根據(jù)不同的分類方法可分為很多種,從產(chǎn)品形態(tài)上來(lái)劃分主要分為三大類:硬件類(綠盟、天融信、安恒的硬件waf)、軟件類(安全狗、云鎖、ModSecurity等)、基于云的waf(阿里云、創(chuàng)宇盾等)。軟件類waf和云waf是本文的主角。安全策略和規(guī)則可以說(shuō)是waf的靈魂,我們所說(shuō)的繞waf就是無(wú)視他的策略和規(guī)則達(dá)到攻擊成功的目的。
這一部分是SQL語(yǔ)法功能技巧的總結(jié),也是WAF繞過(guò)的基礎(chǔ)。
selectCHAR
SQL 查詢語(yǔ)句select后面可以接一些特殊字符,這些字符與select相結(jié)合可以達(dá)到繞過(guò)waf目的,除了select 語(yǔ)句之外 union\from等關(guān)鍵字前后也可以連接一些特殊字符,這些關(guān)鍵子前后就可以作為fuzz的點(diǎn)。
【+】號(hào):
【-】號(hào):
【@】號(hào):
【!】號(hào):
【'】號(hào):
【“】號(hào):
【~】號(hào):
【{】號(hào):
當(dāng)然除以上字符,也可結(jié)合注釋符--、/*、空白字符等。
不僅僅mysql有這類的語(yǔ)法特性,mssql、oracle同樣支持,這里就不一一介紹大家可以自行fuzz嘗試
Oracle11:
MSSQL :
waf會(huì)對(duì)一些常見(jiàn)的攻擊語(yǔ)句進(jìn)行攔截,這個(gè)時(shí)候我們不一定非得正面硬杠,可以挖掘?qū)ふ乙恍┥У木哂邢嗤δ艿恼Z(yǔ)句進(jìn)行代替替換,這也是繞waf的常用手段。以下部分是對(duì)SQL查詢表達(dá)式、函數(shù)等其他查詢語(yǔ)句等價(jià)功能的一個(gè)總結(jié),有些來(lái)自互聯(lián)網(wǎng),有些是自己的研究。
函數(shù)替換
截取字符串是SQL注入利用技術(shù)里面的常用功能,通常使用mid(string,1,1)
|substr(user() from 1 for 1);|
|replace(LPAD(user(),2,1),LPAD(user(),2-1,1),'');|
|LPAD(REVERSE(TRIM( lpad(user(),1,SPACE(1)) )),1,SPACE(1);|
ascii(c)、ord(c) <=> conv(hex(c),16,10)
對(duì)于函數(shù)過(guò)濾的情況可以通過(guò)官方文檔所有API函數(shù),使用index.php?id=1 xor user()進(jìn)行fuzz,以下是百度云 fuzz的結(jié)果
逗號(hào)過(guò)濾
有時(shí)候逗號(hào)也會(huì)被waf攔截或過(guò)濾,可以通過(guò)不含引號(hào)的SQL語(yǔ)句代替
case when 代替if
union select 1,2,3 <=>
union select * from (select 1)a join (select 2)b join (select 3)c
limit 2,1 <=>limit 1 offset 2
比較表達(dá)式代替
【=】
if(abs(strcmp((ascii(mid(user()from(1)for(2)))),114))-1,1,0)
find_in_set()
regexp
【<,>】
least(ord('r'),115)、greatest(ord('r'),113)
between n and m
這部分內(nèi)容是本文的核心部分,在我看來(lái)是文章的靈魂吧,除了技巧方法外,還有一些思想指導(dǎo),waf繞過(guò)技術(shù)不同于一般的技術(shù)思考方向至關(guān)重要,有些技巧大部分人可能都已經(jīng)掌握了但真正給一款waf擺在面前,能突破防御的怕是少之有少。該技術(shù)是一個(gè)比較大比較復(fù)雜的范疇,參數(shù)污染、畸形請(qǐng)求包、chunk分割、編碼解碼等方法林林總總,這些都是老生常談的東西適用一定的條件、場(chǎng)合,普適性不強(qiáng),所以這方面內(nèi)容本文不會(huì)涉及,我們要和waf這只老虎來(lái)個(gè)正面較量,相信會(huì)給大家?guī)?lái)驚喜和收益。
做任何事情都要有個(gè)目標(biāo),沒(méi)有目標(biāo)或目標(biāo)不明確給你一身好裝備和本事也難成事。SQL注入漏洞能利用成功的判斷依據(jù)就是可以dump數(shù)據(jù),對(duì)于后端DATABASE【SELECT col FORM table】用來(lái)查詢數(shù)據(jù)的基本語(yǔ)句,該語(yǔ)句的成功執(zhí)行是可以dump數(shù)據(jù)的必要條件,當(dāng)然也是各個(gè)廠家安全產(chǎn)品重點(diǎn)照顧的對(duì)象,繞過(guò)對(duì)該語(yǔ)句的攔截自然就是我們的目標(biāo),平時(shí)進(jìn)行繞過(guò)測(cè)試的時(shí)候也會(huì)關(guān)注【UNION SELECT】、【ORDER BY】等語(yǔ)句,這些可以當(dāng)成我們的次要目標(biāo),不是說(shuō)他們的繞過(guò)不重要,而是不依靠這些語(yǔ)句僅僅通過(guò)【SELECT col FORM table】照樣可以dump數(shù)據(jù),非必要充分條件吧,結(jié)合筆者經(jīng)驗(yàn)和思考基本可以明確我們的目標(biāo):
1.主要目標(biāo):繞過(guò)【SELECT col FORM table】語(yǔ)句攔截
2.次要目標(biāo):繞過(guò)【UNION SELECT】語(yǔ)句攔截
SQL注入根據(jù)分類方法不同可分為不同的類型,從SQL注入漏洞利用角度來(lái)說(shuō),一般有五種注入利用方法,分別是報(bào)錯(cuò)注入、聯(lián)合查詢注入、布爾盲注、延時(shí)注入、堆查詢注入。無(wú)論那種注入方式,利用payload都可以分為兩部分構(gòu)成,對(duì)應(yīng)的利用語(yǔ)句(BOUNDARY)和基本查詢(QUERY)比如報(bào)錯(cuò)注入語(yǔ)句:【updatexml(1,(select concat(0x7e,user,0x7e) from mysql.user limit 1),1)】藍(lán)色圈起來(lái)的報(bào)錯(cuò)語(yǔ)句就是BOUNDARY,紅色圈起來(lái)的部分就是QUERY,也是我們需要繞過(guò)的主要目標(biāo)。
嘗試測(cè)試的時(shí)候,可以使用控制變量法進(jìn)行測(cè)試,比如測(cè)試QUERY,可以把BOUNDARY填充為無(wú)害字符串,反過(guò)來(lái)也一樣,最后再結(jié)合一起驗(yàn)證測(cè)試。
WAF有硬件WAF、軟件WAF、基于云的WAF,根據(jù)WAF種類不同需要制定不同的測(cè)試方案。對(duì)于硬件WAF和基于云的WAF由于條件所限一般從業(yè)者接觸不到只能從黑盒的角度進(jìn)行測(cè)試,但是對(duì)于像安全狗、云鎖之類的軟件WAF,他的規(guī)則本身就集成在軟件里面,那么就可以先利用逆向技術(shù)手段獲取到防御規(guī)則進(jìn)行白盒審計(jì),之后再通過(guò)黑盒測(cè)試方法進(jìn)行測(cè)試,以我多年的安全行業(yè)經(jīng)驗(yàn)和觀察,具備開(kāi)發(fā)能力的安全從業(yè)者并不是太多,同時(shí)具備這兩項(xiàng)能力的頂尖安全人員更是鳳毛菱角何況都分散在在全國(guó)不同的公司,有理由相信之類軟件的防護(hù)規(guī)則一定會(huì)有疏漏,再說(shuō)絕對(duì)的安全并不存在也是業(yè)內(nèi)共識(shí),所以對(duì)于軟件類的WAF能拿到規(guī)則就盡量獲取到規(guī)則進(jìn)行審計(jì)(這里透漏一下安全狗防護(hù)規(guī)則存在缺陷,原則上針對(duì)所有數(shù)據(jù)庫(kù)的防護(hù)都可以繞過(guò),筆者測(cè)試了MYSQL\ORACLE\MSSQL)。
對(duì)于【SELECT col FROM table】、【UNION SELECT】語(yǔ)句,分別在每個(gè)關(guān)鍵字前后設(shè)置FUZZ位置進(jìn)行繞過(guò)嘗試,首先在本地FUZZ測(cè)試出能夠正常執(zhí)行的語(yǔ)句,然后提交到目標(biāo)站點(diǎn)進(jìn)行測(cè)試,有些時(shí)候可能本地FUZZ的那些payload都會(huì)被攔截,但結(jié)合注釋、空白字符、括號(hào)、引號(hào)、別名等其他功能特性就可以繞過(guò),而這一部分目前來(lái)看沒(méi)有通用測(cè)試方法,只能針對(duì)某一特定的waf手動(dòng)測(cè)試,測(cè)試的時(shí)候可以先忽視語(yǔ)法的正確性,確保整個(gè)語(yǔ)句結(jié)構(gòu)能夠繞過(guò)防護(hù),例如【SELECT col FROM table】語(yǔ)句的繞過(guò)測(cè)試,可以在SELECT、FROM 關(guān)鍵子前后填充任意字符,整個(gè)語(yǔ)句結(jié)構(gòu)能夠繞過(guò)之后,我們?cè)傧朕k法構(gòu)造出正常可以執(zhí)行的語(yǔ)句,這兩個(gè)語(yǔ)句必有結(jié)構(gòu)相似性,構(gòu)造的正常SQL 語(yǔ)句很可能會(huì)被攔截也在情理之中,接下來(lái)就要使用增刪法對(duì)結(jié)構(gòu)不同部分進(jìn)行增刪處理,確定是某個(gè)字符或某個(gè)子結(jié)構(gòu)觸發(fā)了攔截,既然確定了黑字符和結(jié)構(gòu)就需要尋找白字符進(jìn)替換代替,這個(gè)過(guò)程可能需要來(lái)來(lái)回回的測(cè)試,花費(fèi)時(shí)間數(shù)量級(jí)由測(cè)試者研究SQL語(yǔ)法熟練度和深淺度決定,其實(shí)也不是太難,以我對(duì)阿里云的繞過(guò)測(cè)試來(lái)看,從繞過(guò)【SELECT col FROM table】結(jié)構(gòu)到構(gòu)造出能夠正常出數(shù)據(jù)的語(yǔ)句所花費(fèi)的時(shí)間大概在三個(gè)小時(shí)左右,數(shù)量級(jí)還是可以接受,當(dāng)然也有運(yùn)氣成分在里面,在對(duì)亞馬遜云的測(cè)試過(guò)程中就遇到了很大的障礙,最后雖然通過(guò)別的繞過(guò)方法拿到目標(biāo)站點(diǎn)的數(shù)據(jù),但與本文所說(shuō)的策略方法沒(méi)有半點(diǎn)關(guān)系。
前面提到了在關(guān)鍵字前后填充字符,這里也講求一個(gè)方法,不是說(shuō)用你收集的tricks一一嘗試,如此測(cè)試的話那幾乎和FUZZ沒(méi)有區(qū)別,而且很難達(dá)到目標(biāo),至于如何操作且聽(tīng)下文分解。
該小節(jié)依據(jù)上文戰(zhàn)略思想,以真實(shí)案例來(lái)推演整個(gè)繞過(guò)過(guò)程。
目標(biāo):https://su.baidu.com/
1.本地FUZZ PAYLOAD
2.關(guān)鍵字前后填充字符測(cè)試
3.構(gòu)造正確的繞過(guò)PAYLOAD
本地FUZZ PAYLOAD
FUZZ 字符除了【0-255】全字符外,也可以添加自己收集的一些tricks進(jìn)行FUZZ
{FUZZ}UNION SELECT fuzz的一些結(jié)果
關(guān)鍵字前后填充字符測(cè)試
UNION SELECT 繞過(guò)嘗試
id=1 xor xxunion selectxx 攔截
id=1 xor xxunionxxselectxx 不攔截
id=1 xor union(select 不攔截
id=1 xor union(select) 攔截
id=1 xor union dd(select) 不攔截
SELET FROM 繞過(guò)測(cè)試
id=1 xor s(select xxfrom xx) 攔截
id=1 xor s(select xx fromb xx) 不攔截
id=1 xor s(select xx fromxx)攔截
id=1 xor s(select@a from xx) 攔截
id=1 xor s(select@asfrom xx) 不攔截
通過(guò)以上測(cè)試把union select from 結(jié)合在一起并不攔截
https://su.baidu.com/plan.html?id=1 xor union dd(select@ \Nfrom xx)
看來(lái)成功不遠(yuǎn)了,接下來(lái)構(gòu)造出正確的SQL語(yǔ)句,發(fā)現(xiàn)會(huì)被攔截
構(gòu)造正確的繞過(guò)PAYLOAD
這一步就是構(gòu)造一個(gè)既能繞過(guò)WAF防御也能正確執(zhí)行的SQL PAYLOAD
首先在union前面添加我們fuzz的.1字符,不攔截,這就是一個(gè)完全繞過(guò)payload,百度云加速防護(hù)能力相對(duì)來(lái)說(shuō)偏弱一些,繞過(guò)花費(fèi)不了太多時(shí)間。
對(duì)于SQL注入漏洞利用,有些場(chǎng)合需要用到盲注,盲注當(dāng)然離不開(kāi)SQL API的,里面一些常用的函數(shù)也會(huì)成為WAF照顧的對(duì)象,我們可以在函數(shù)名前后添加一些特殊字符或注釋進(jìn)行繞過(guò)
對(duì)于安全狗和云鎖之類的軟件,規(guī)則本身集成在軟件里面,在具備一定的逆向能力的話可以優(yōu)先考慮逆向獲取到規(guī)則進(jìn)行繞過(guò)。在安全狗逆向過(guò)程中發(fā)現(xiàn)可以利用HOOK API獲取規(guī)則而不需要完全逆向解密算法進(jìn)行規(guī)則解密,正好大學(xué)時(shí)期研究過(guò)win32下的各種HOOK技術(shù),翻出舊代碼稍加修改改就能派上用場(chǎng)還是比較滿意;云鎖是用C#編寫沒(méi)有經(jīng)過(guò)混淆,逆向算法非常簡(jiǎn)單各位師傅可以自行嘗試。對(duì)這兩種軟件類WAF的規(guī)則進(jìn)行審計(jì)發(fā)現(xiàn)實(shí)現(xiàn)都存在缺陷,對(duì)各種數(shù)據(jù)庫(kù)類型的注入應(yīng)該都可以繞過(guò),篇幅所限不一一展開(kāi)細(xì)說(shuō)了,繞過(guò)payload參考后文。
這一小節(jié)是部分WAF繞過(guò)PAYLOAD,本來(lái)計(jì)劃是完全分享,但是為了避免不必要的麻煩,刪除了部分廠商的繞過(guò)PAYLOAD方法大致類似。每種繞過(guò)PAYLOAD里面都包含了多個(gè)tricks,這里不一一詳解各位看官細(xì)細(xì)琢磨品嘗。
使用MSSQL PAYLOAD進(jìn)行測(cè)試
UNION SELECT 繞過(guò)
SELECT FROM 繞過(guò)
MYSQL 報(bào)錯(cuò)注入繞過(guò)
這里只公布部分BYPASS PATYLOAD,完整出數(shù)據(jù)的PAYLOAD暫不公布,感興趣的可以根據(jù)文章中的思路和方法進(jìn)行嘗試,相信各位師傅也是可以做得到的。
做事情講求個(gè)有始有終,在滲透一個(gè)目標(biāo)的時(shí)候最終的要求當(dāng)然是能夠利用發(fā)現(xiàn)的漏洞拿到權(quán)限。假如目標(biāo)站點(diǎn)存在一個(gè)SQL注入漏洞,但是由于WAF的存在漏洞利用并不能成功,經(jīng)過(guò)研究現(xiàn)在看來(lái)WAF已經(jīng)不是最大的障礙,不過(guò)距利用成功尚且有一段距離。
對(duì)于存在WAF場(chǎng)景下的SQL注入漏洞利用,要么單獨(dú)編寫腳本dump數(shù)據(jù)要么編寫SQLMAP Tamper利用SQLMAP dump數(shù)據(jù),這兩種方式都可以達(dá)到我們的目標(biāo),但是都有不好的弊端,對(duì)于經(jīng)常打ctf的人來(lái)說(shuō)感受應(yīng)該更加明顯。由于不同WAF的繞過(guò)PAYLOAD各不相同,所以單獨(dú)編寫腳本這種利用方式很明顯通用性不強(qiáng),其實(shí)里面的好多代碼可以單獨(dú)分離出來(lái)重復(fù)使用;對(duì)于簡(jiǎn)單的BYPASS PAYLOAD,編寫SQLMAP Tamper不是太難,而使用了SQL各種特性、trick的復(fù)雜BYPASS PAYLOD,編寫SQLMAP Tamper 就顯的過(guò)于復(fù)雜。出于以上原因筆者使用python編寫了一款SQL注入漏洞利用工具,參數(shù)使用方法和SQLMAP基本相同,每種利用方法單獨(dú)編寫一個(gè)類,各個(gè)利用類的成員函數(shù)基本相同,整個(gè)PAYLOAD 由BOUDARY和QUERY兩部分組成,成員函數(shù)get_payload調(diào)用tamper腳本里面的tamper函數(shù)對(duì)boundary和query單獨(dú)處理,tamper腳本編寫簡(jiǎn)單方便靈活。工具各個(gè)參數(shù)基本和SQLMAP相同,詳細(xì)說(shuō)明請(qǐng)參考開(kāi)發(fā)文檔。
Tamper樣例:
工具tamper目錄附帶了安全狗和云鎖繞過(guò)mysql tamper。
開(kāi)發(fā)文檔:
https://github.com/ggg4566/SQLEXP
https://forum.90sec.com/t/topic/993
以上大部分研究成果都產(chǎn)出于去年七八月份,在寫本文的時(shí)候大部分payload任然有效,相信在不久的未來(lái)這些payload也會(huì)被加入黑名單,不過(guò)只要掌握了繞過(guò)思路和方法,寫出你自己獨(dú)有的繞過(guò)也是遲早的事情。本文花費(fèi)了筆者大量的時(shí)間和精力,增刪修改了多次,希望這篇文章不僅僅是一篇WAF繞過(guò)系列的專題文章,而是能夠給大家?guī)?lái)研究學(xué)習(xí)的方向,比如軟件WAF的逆向技術(shù)(C\C++\C#)、WIN32 HOOK技術(shù)、SQL功能特性的FUZZ和研究、SQL注入漏洞利用方法以及腳本自動(dòng)化等,每一個(gè)方面都值得深入研究學(xué)習(xí),有些內(nèi)容大可不必花費(fèi)筆墨。對(duì)于SQL的各種功能特性筆者并沒(méi)有花費(fèi)篇幅一一詳解,一是有些功能特性筆者也搞不懂;二來(lái)篇幅有限同時(shí)覺(jué)得也沒(méi)有必要,大部分功能特性tricks都融合在文中的payload里面,希望各位讀者能夠結(jié)合實(shí)際場(chǎng)景細(xì)細(xì)琢磨領(lǐng)會(huì)。筆者文筆粗淺,文章有所疏漏在所難免還請(qǐng)指正擔(dān)待。
https://xz.aliyun.com/t/368
https://klionsec.github.io/2017/07/31/bypasswaf-on-database/
文章來(lái)源:先知社區(qū)(flystart)
聯(lián)系客服