最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

深入研究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解析字符串函數(shù)sscanf的實(shí)用方法

    php解析字符串函數(shù)sscanf的實(shí)用方法

    在PHP編程中,有時(shí)需要對(duì)字符串進(jìn)行解析,而sscanf函數(shù)就是一種非常方便的解析工具,本文詳細(xì)介紹了sscanf函數(shù)的用法,包括基本用法和高級(jí)用法,通過大量的示例代碼,展示了如何使用sscanf函數(shù)解析各種不同格式的字符串
    2023-09-09
  • php curl 偽造IP來源的實(shí)例代碼

    php curl 偽造IP來源的實(shí)例代碼

    php curl 太強(qiáng)大了,它不但可以模仿用戶登錄,還可以模仿用戶IP地址哦,為偽造IP來源,本實(shí)例僅供參考哦
    2012-11-11
  • PHP獲取當(dāng)前執(zhí)行php文件名的代碼

    PHP獲取當(dāng)前執(zhí)行php文件名的代碼

    這篇文章主要介紹了PHP獲取當(dāng)前執(zhí)行php文件名的代碼,需要的朋友可以參考下
    2017-03-03
  • PHP簡潔函數(shù)(PHP簡單明了函數(shù)語法)

    PHP簡潔函數(shù)(PHP簡單明了函數(shù)語法)

    筆者由于碰到用戶多次修改頁面,所以在麻煩的情況下,改用php完成技術(shù)開發(fā),這篇文章主要記錄PHP簡潔函數(shù),講述PHP簡單明了函數(shù)語法,適合人群為對(duì)開源社區(qū)感興趣,對(duì)php感興趣,有一點(diǎn)時(shí)間了解下php,希望對(duì)讀者帶來快樂
    2012-06-06
  • php生成0~1隨機(jī)小數(shù)的方法(必看)

    php生成0~1隨機(jī)小數(shù)的方法(必看)

    下面小編就為大家?guī)硪黄猵hp生成0~1隨機(jī)小數(shù)的方法(必看)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-04-04
  • php文件上傳的兩種實(shí)現(xiàn)方法

    php文件上傳的兩種實(shí)現(xiàn)方法

    這篇文章主要為大家詳細(xì)介紹了兩種php文件上傳的實(shí)現(xiàn)方法,感興趣的朋友可以參考一下
    2016-04-04
  • 詳解PHP序列化反序列化的方法

    詳解PHP序列化反序列化的方法

    這篇文章主要介紹了PHP序列化反序列化的方法,在一些開源的php源代碼中,我們經(jīng)??吹揭恍┡渲梦募锩娲娣诺氖且恍╊愃茙в懈袷降淖兞棵Q和值,想知道這是為什么,請閱讀下文
    2015-10-10
  • php Smarty 字符比較代碼

    php Smarty 字符比較代碼

    php Smarty 字符比較代碼,需要的朋友可以參考下。
    2011-02-02
  • php循環(huán)語句 for()與foreach()用法區(qū)別介紹

    php循環(huán)語句 for()與foreach()用法區(qū)別介紹

    下面我用兩個(gè)實(shí)例來介紹一下關(guān)于在php中foreach與for語句用法區(qū)別介紹,有需要的朋友可參考一下
    2012-09-09
  • PHP strtotime函數(shù)用法、實(shí)現(xiàn)原理和源碼分析

    PHP strtotime函數(shù)用法、實(shí)現(xiàn)原理和源碼分析

    這篇文章主要介紹了PHP strtotime函數(shù)用法、實(shí)現(xiàn)原理和源碼分析,本文講解了strtotime函數(shù)的一些用法、strtotime函數(shù)的實(shí)現(xiàn)基本原理、strtotime(“-1 month”)求值失敗的原因等內(nèi)容,需要的朋友可以參考下
    2015-02-02

最新評(píng)論

锦州市| 孟州市| 民和| 保康县| 陇南市| 汽车| 凤城市| 邓州市| 桑植县| 万宁市| 德惠市| 双鸭山市| 渭南市| 莎车县| 旅游| 手游| 巴楚县| 鹤庆县| 绥阳县| 淳化县| 阳春市| 濉溪县| 渑池县| 杭州市| 邳州市| 星座| 阆中市| 齐河县| 于都县| 特克斯县| 达尔| 盐津县| 江阴市| 赤水市| 湖州市| 康定县| 桐乡市| 高雄市| 庆元县| 崇州市| 西藏|