欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

深入研究PHP中的preg_replace和代碼執(zhí)行

 更新時(shí)間:2018年08月15日 09:29:55   作者:紅日安全  
這篇文章主要給大家介紹了關(guān)于PHP中preg_replace和代碼執(zhí)行的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言

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

案例

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

這個(gè)案例實(shí)際上很簡單,就是 preg_replace 使用了 /e 模式,導(dǎo)致可以代碼執(zhí)行,而且該函數(shù)的第一個(gè)和第三個(gè)參數(shù)都是我們可以控制的。我們都知道, preg_replace 函數(shù)在匹配到符號(hào)正則的字符串時(shí),會(huì)將替換字符串(也就是上圖 preg_replace 函數(shù)的第二個(gè)參數(shù))當(dāng)做代碼來執(zhí)行,然而這里的第二個(gè)參數(shù)卻固定為 'strtolower("\\1")' 字符串,那這樣要如何執(zhí)行代碼呢?

爬坑1

上面的命令執(zhí)行,相當(dāng)于 eval('strtolower("\\1");') 結(jié)果,當(dāng)中的 \\1 實(shí)際上就是 \1 ,而 \1 在正則表達(dá)式中有自己的含義。我們來看看 W3Cschool 中對(duì)其的描述:

反向引用

對(duì)一個(gè)正則表達(dá)式模式或部分模式 兩邊添加圓括號(hào) 將導(dǎo)致相關(guān) 匹配存儲(chǔ)到一個(gè)臨時(shí)緩沖區(qū) 中,所捕獲的每個(gè)子匹配都按照在正則表達(dá)式模式中從左到右出現(xiàn)的順序存儲(chǔ)。緩沖區(qū)編號(hào)從 1 開始,最多可存儲(chǔ) 99 個(gè)捕獲的子表達(dá)式。每個(gè)緩沖區(qū)都可以使用 '\n' 訪問,其中 n 為一個(gè)標(biāo)識(shí)特定緩沖區(qū)的一位或兩位十進(jìn)制數(shù)。

所以這里的 \1 實(shí)際上指定的是第一個(gè)子匹配項(xiàng),我們拿 ripstech 官方給的 payload 進(jìn)行分析,方便大家理解。官方 payload 為: /?.*={${phpinfo()}} ,即 GET 方式傳入的參數(shù)名為 /?.* ,值為 {${phpinfo()}}  。

原先的語句: preg_replace('/(' . $regex . ')/ei', 'strtolower("\\1")', $value);
變成了語句: preg_replace('/(.*)/ei', 'strtolower("\\1")', {${phpinfo()}});


爬坑2

上面的 preg_replace 語句如果直接寫在程序里面,當(dāng)然可以成功執(zhí)行 phpinfo() ,然而我們的 .* 是通過 GET 方式傳入,你會(huì)發(fā)現(xiàn)無法執(zhí)行 phpinfo 函數(shù),如下圖:

我們 var_dump 一下 $_GET 數(shù)組,會(huì)發(fā)現(xiàn)我們傳上去的 .* 變成了 _* ,如下圖所示:

這是由于在PHP中,對(duì)于傳入的非法的 $_GET 數(shù)組參數(shù)名,會(huì)將其轉(zhuǎn)換成下劃線,這就導(dǎo)致我們正則匹配失效。我們可以 fuzz 一下PHP會(huì)將哪些符號(hào)替換成下劃線,發(fā)現(xiàn)有:(這是非法字符不為首字母的情況)

當(dāng)非法字符為首字母時(shí),只有點(diǎn)號(hào)會(huì)被替換成下劃線:

所以我們要做的就是換一個(gè)正則表達(dá)式,讓其匹配到 {${phpinfo()}} 即可執(zhí)行 phpinfo 函數(shù)。這里我提供一個(gè) payload : \S*=${phpinfo()} 執(zhí)行結(jié)果如下:

爬坑3

下面再說說我們?yōu)槭裁匆ヅ涞?{${phpinfo()}} 或者 ${phpinfo()} ,才能執(zhí)行 phpinfo 函數(shù),這是一個(gè)小坑。這實(shí)際上是PHP可變變量 的原因。在PHP中雙引號(hào)包裹的字符串中可以解析變量,而單引號(hào)則不行。 ${phpinfo()} 中的 phpinfo() 會(huì)被當(dāng)做變量先執(zhí)行,執(zhí)行后,即變成 ${1} (phpinfo()成功執(zhí)行返回true)。如果這個(gè)理解了,你就能明白下面這個(gè)問題:

var_dump(phpinfo()); // 結(jié)果:布爾 true
var_dump(strtolower(phpinfo()));// 結(jié)果:字符串 '1'
var_dump(preg_replace('/(.*)/ie','1','{${phpinfo()}}'));// 結(jié)果:字符串'11'

var_dump(preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}'));// 結(jié)果:空字符串''
var_dump(preg_replace('/(.*)/ie','strtolower("{${phpinfo()}}")','{${phpinfo()}}'));// 結(jié)果:空字符串''
這里的'strtolower("{${phpinfo()}}")'執(zhí)行后相當(dāng)于 strtolower("{${1}}") 又相當(dāng)于 strtolower("{null}") 又相當(dāng)于 '' 空字符串

總結(jié)

這個(gè)問題是我們在做 PHP-Audit-Labs 項(xiàng)目的時(shí)候發(fā)現(xiàn)的,我們盡可能地將每一篇文章的漏洞理解透徹,分析清楚,這對(duì)自身也是一種提高。

好了,以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,如果有疑問大家可以留言交流,謝謝大家對(duì)腳本之家的支持。

相關(guān)文章

  • PHP OPCode緩存 APC詳細(xì)介紹

    PHP OPCode緩存 APC詳細(xì)介紹

    PHP語言在性能上相對(duì)于其他編譯型語言來說性能算不上突出,但是使用了OPCode緩存后性能提升還是很明顯的.常見的主要有Eaccelerator,XCache,APC本文主要介紹APC的使用.
    2010-10-10
  • 支持生僻字且自動(dòng)識(shí)別utf-8編碼的php漢字轉(zhuǎn)拼音類

    支持生僻字且自動(dòng)識(shí)別utf-8編碼的php漢字轉(zhuǎn)拼音類

    這篇文章主要介紹了支持生僻字且自動(dòng)識(shí)別utf-8編碼的php漢字轉(zhuǎn)拼音類,非常實(shí)用!需要的朋友可以參考下
    2014-06-06
  • PHP pthreads v3下同步處理synchronized用法示例

    PHP pthreads v3下同步處理synchronized用法示例

    這篇文章主要介紹了PHP pthreads v3下同步處理synchronized用法,結(jié)合實(shí)例形式分析了PHP pthreads v3下同步處理synchronized原理、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下
    2020-02-02
  • php實(shí)現(xiàn)PDO中捕獲SQL語句錯(cuò)誤的方法

    php實(shí)現(xiàn)PDO中捕獲SQL語句錯(cuò)誤的方法

    這篇文章主要介紹了php實(shí)現(xiàn)PDO中捕獲SQL語句錯(cuò)誤的方法,結(jié)合實(shí)例形式分析了PDO中常見的錯(cuò)誤、警告及異常模式相關(guān)屬性設(shè)置與使用技巧,需要的朋友可以參考下
    2017-02-02
  • PHP網(wǎng)站安裝程序制作的原理、步驟、注意事項(xiàng)和示例代碼

    PHP網(wǎng)站安裝程序制作的原理、步驟、注意事項(xiàng)和示例代碼

    其實(shí)PHP程序的安裝原理無非就是將數(shù)據(jù)庫結(jié)構(gòu)和內(nèi)容導(dǎo)入到相應(yīng)的數(shù)據(jù)庫中,從這個(gè)過程中重新配置連接數(shù)據(jù)庫的參數(shù)和文件,為了保證不被別人惡意使用安裝文件,當(dāng)安裝完成后需要修改安裝文件。
    2010-08-08
  • 談?wù)凱HP的輸入輸出流

    談?wù)凱HP的輸入輸出流

    談?wù)凱HP的輸入輸出流...
    2007-02-02
  • 如何使用Laravel Eloquent來開發(fā)無限極分類

    如何使用Laravel Eloquent來開發(fā)無限極分類

    在網(wǎng)上商城上,我們經(jīng)??梢钥吹蕉嗉?jí)分類、子分類、甚至無限極分類。本文將向你展示如何優(yōu)雅的通過 Laravel Eloquent 將其實(shí)現(xiàn)。
    2021-05-05
  • PHP對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序的方法

    PHP對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序的方法

    在 PHP 中,可以使用函數(shù) array_multisort() 來對(duì)二維數(shù)組進(jìn)行排序處理,該函數(shù)可以按照指定的鍵或值對(duì)數(shù)組進(jìn)行排序,本文通過一個(gè)示例來給大家介紹一下PHP如何對(duì)二維數(shù)組(多維數(shù)組)進(jìn)行排序,需要的朋友可以參考下
    2023-09-09
  • PHP7數(shù)組的底層實(shí)現(xiàn)示例

    PHP7數(shù)組的底層實(shí)現(xiàn)示例

    這篇文章主要給大家介紹了關(guān)于PHP7數(shù)組的底層實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用PHP7具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • WordPress的主題編寫中獲取頭部模板和底部模板

    WordPress的主題編寫中獲取頭部模板和底部模板

    這篇文章主要介紹了WordPress的主題編寫中獲取頭部模板和底部模板的技巧,分別是get_header()與get_footer()函數(shù)的使用,需要的朋友可以參考下
    2015-12-12

最新評(píng)論