您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關PHP中preg_replace函數的作用是什么,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
foreach ($_GET as $regex => $value) { preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value); }
測試過程中發現通過瀏覽器的方式傳入數據的時候,會將 . + 等特殊字符轉換為 _ 。
這里涉及到了php的一個特性
php自身在解析請求的時候,如果參數名字中包含空格、.、[等字符,會將他們轉換成_。
<?php $a = $_GET; var_dump($a); ?>
經過我的fuzz,結果如下圖:
踩坑2:
那我們知道 preg_replace 的 /e 修正符會將 replacement 參數當作 php 代碼,并且以 eval 函數的方式執行,前提是 subject 中有 pattern 的匹配。既然是這樣我們看一張圖。
圖中實際上通過 eval 執行的是 strtolower 函數。分別實際執行的是:
strtolower("JUST TEST"); strtolower("PHPINFO()"); strtolower("{${PHPINFO()}}");
第三個之所以可以執行代碼,是因為我們通過復雜(花括號)語法的方式來讓其代碼執行。
踩坑3:
回到源代碼中,我們再理解一下:
foreach ($_GET as $regex => $value) { preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value); }
這里的 replacement 是 strtolower(“\\1”) ,著重理解一下 \\1 。
每個這樣的引用將被匹配到的第n個捕獲子組捕獲到的文本替換。 n可以是0-99,\0和\$0代表完整的模式匹配文本。
假設一個正則表達式是這樣的:
preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');
這里的 \$1\$2\$4 等同于上面的 \1\2\4 的作用,因此我們看一下是怎么選擇匹配的。
$1 $2 $3 $4 '/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'
0x03 解決
好了上面都已經鋪墊完坑了,這里要開始解決了。
foreach ($_GET as $regex => $value) { preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value); }
我們想要讓這部分代碼達到代碼執行的效果需要達到幾個條件:
pattern 部分的表達式需要命中 \$value 中的數據
\1 中取出的數據復雜(花括號)語法的特征,來保證在雙引號的包含下達到代碼執行的效果
由于php的特性url會將 . 、 [ 、 + 等特殊字符轉換為 _ 。
我們知道這里是通過 get 方式獲取到 \$regex 和 \$value 的,要想在 replacement 部分通過 \1 截取到 pattern 正則匹配命中 \$value 中的數據,并且攜帶 \$ 、 { 、 ( 這里就涉及到正則表達式的使用了。
這里我選擇了 \S ,也就是匹配任意的非空白字符,那么最后的payload長這樣
\S*()={${phpinfo()}}
php的框架:1、Laravel,Laravel是一款免費并且開源的PHP應用框架。2、Phalcon,Phalcon是運行速度最快的一個PHP框架。3、Symfony,Symfony是一款為Web項目準備的PHP框架。4、Yii,Yii是一款快速、安全和專業的PHP框架。5、CodeIgniter,CodeIgniter是一款非常敏捷的開源PHP框架。6、CakePHP,CakePHP是一款老牌的PHP框架。7.Kohana,Kohana是一款敏捷但是功能強大的PHP框架。
上述就是小編為大家分享的PHP中preg_replace函數的作用是什么了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。