婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > 深入研究PHP中的preg_replace和代碼執行

深入研究PHP中的preg_replace和代碼執行

熱門標簽:企業400電話辦理多少費用 萍鄉商鋪地圖標注 太原400電話申請流程 代理打電話機器人 桂陽公司如何做地圖標注 宿州正規外呼系統軟件 神龍斗士電話機器人 合肥企業外呼系統線路 電信外呼系統多少錢一個月

前言

本文將深入研究 preg_replace /e 模式下的代碼執行問題,其中包括 preg_replace 函數的執行過程分析、正則表達式分析、漏洞觸發分析,當中的坑非常多,相信看完本文,你一定會有所收獲。下面是 七月火 和 l1nk3r 的分析結果。

案例

下面先看一個案例,思考如何利用此處的 preg_replace /e 模式,執行代碼(可以先不看下文分析,自己思考出 payload 試試)。

這個案例實際上很簡單,就是 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-Audit-Labs 項目的時候發現的,我們盡可能地將每一篇文章的漏洞理解透徹,分析清楚,這對自身也是一種提高。

好了,以上就是這篇文章的全部內容了,希望本文的內容對大家的學習或者工作具有一定的參考學習價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

您可能感興趣的文章:
  • PHP preg_replace() 正則替換所有符合條件的字符串
  • PHP 字符串正則替換函數preg_replace使用說明
  • PHP正則替換函數preg_replace和preg_replace_callback使用總結
  • php正則之函數 preg_replace()參數說明
  • 詳解PHP正則表達式替換實現(PHP preg_replace,PHP preg_replace)
  • php中preg_replace正則替換用法分析【一次替換多個值】
  • php preg_replace替換實例講解
  • PHP 正則表達式之正則處理函數小結(preg_match,preg_match_all,preg_replace,preg_split)
  • php中preg_replace_callback函數簡單用法示例
  • php中使用preg_replace函數匹配圖片并加上鏈接的方法

標簽:衡陽 鄂州 崇左 白銀 辛集 綏化 廊坊 太原

巨人網絡通訊聲明:本文標題《深入研究PHP中的preg_replace和代碼執行》,本文關鍵詞  深入研究,PHP,中的,preg,replace,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《深入研究PHP中的preg_replace和代碼執行》相關的同類信息!
  • 本頁收集關于深入研究PHP中的preg_replace和代碼執行的相關信息資訊供網民參考!
  • 推薦文章
    主站蜘蛛池模板: 万载县| 永靖县| 庆云县| 恭城| 周至县| 清远市| 阜宁县| 合江县| 台东市| 永州市| 林周县| 九龙县| 黑龙江省| 台北县| 治县。| 大新县| 屏东市| 交口县| 安福县| 泌阳县| 邻水| 东莞市| 友谊县| 科技| 嘉峪关市| 嘉禾县| 清河县| 格尔木市| 汉川市| 定南县| 韶关市| 麟游县| 兰坪| 福建省| 浦江县| 板桥市| 渝北区| 怀来县| 镇安县| 华容县| 砀山县|