您好,登錄后才能下訂單哦!
本篇文章為大家展示了PHP中preg_replace的作用是什么,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。
這個案例實際上很簡單,就是 preg_replace 使用了 /e 模式,導致可以代碼執行,而且該函數的第一個和第三個參數都是我們可以控制的。我們都知道, preg_replace 函數在匹配到符號正則的字符串時,會將替換字符串(也就是上圖 preg_replace 函數的第二個參數)當做代碼來執行,然而這里的第二個參數卻固定為 'strtolower("\\1")' 字符串,那這樣要如何執行代碼呢?
爬坑1
上面的命令執行,相當于 eval('strtolower("\\1");')
結果,當中的 \\1 實際上就是 \1 ,而 \1 在正則表達式中有自己的含義。我們來看看 W3Cschool 中對其的描述:
反向引用
對一個正則表達式模式或部分模式 兩邊添加圓括號 將導致相關 匹配存儲到一個臨時緩沖區 中,所捕獲的每個子匹配都按照在正則表達式模式中從左到右出現的順序存儲。緩沖區編號從 1 開始,最多可存儲 99 個捕獲的子表達式。每個緩沖區都可以使用 '\n' 訪問,其中 n 為一個標識特定緩沖區的一位或兩位十進制數。
所以這里的 \1 實際上指定的是第一個子匹配項,我們拿 ripstech 官方給的 payload 進行分析,方便大家理解。官方 payload 為: /?.*={${phpinfo()}}
,即 GET 方式傳入的參數名為 /?.* ,值為 {${phpinfo()}}
。
原先的語句: preg_replace('/(' . $regex . ')/ei', 'strtolower("\\1")', $value);
變成了語句: preg_replace('/(.*)/ei', 'strtolower("\\1")', {${phpinfo()}});
爬坑2
上面的 preg_replace 語句如果直接寫在程序里面,當然可以成功執行 phpinfo() ,然而我們的 .* 是通過 GET 方式傳入,你會發現無法執行 phpinfo 函數,如下圖:
我們 var_dump 一下 $_GET 數組,會發現我們傳上去的 .* 變成了 _* ,如下圖所示:
這是由于在PHP中,對于傳入的非法的 $_GET 數組參數名,會將其轉換成下劃線,這就導致我們正則匹配失效。我們可以 fuzz 一下PHP會將哪些符號替換成下劃線,發現有:(這是非法字符不為首字母的情況)
當非法字符為首字母時,只有點號會被替換成下劃線:
所以我們要做的就是換一個正則表達式,讓其匹配到 {${phpinfo()}}
即可執行 phpinfo 函數。這里我提供一個 payload : \S*=${phpinfo()}
執行結果如下:
爬坑3
下面再說說我們為什么要匹配到 {${phpinfo()}}
或者 ${phpinfo()}
,才能執行 phpinfo 函數,這是一個小坑。這實際上是PHP可變變量 的原因。在PHP中雙引號包裹的字符串中可以解析變量,而單引號則不行。 ${phpinfo()}
中的 phpinfo() 會被當做變量先執行,執行后,即變成 ${1} (phpinfo()
成功執行返回true)。如果這個理解了,你就能明白下面這個問題:
var_dump(phpinfo()); // 結果:布爾 true var_dump(strtolower(phpinfo()));// 結果:字符串 '1' var_dump(preg_replace('/(.*)/ie','1','{${phpinfo()}}'));// 結果:字符串'11' var_dump(preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}'));// 結果:空字符串'' var_dump(preg_replace('/(.*)/ie','strtolower("{${phpinfo()}}")','{${phpinfo()}}'));// 結果:空字符串'' 這里的'strtolower("{${phpinfo()}}")'執行后相當于 strtolower("{${1}}") 又相當于 strtolower("{null}") 又相當于 '' 空字符串
上述內容就是PHP中preg_replace的作用是什么,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。