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

PHP中一個(gè)有趣的preg_replace函數(shù)詳解

 更新時(shí)間:2018年08月15日 09:18:23   作者:l1nk3r  
這篇文章主要給大家介紹了關(guān)于PHP中一個(gè)有趣的preg_replace函數(shù)的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用php具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧

0x01 起因

事情的起因是下午遇到了 preg_replace 函數(shù),我們都知道 preg_replace 函數(shù)可能會(huì)導(dǎo)致命令執(zhí)行。現(xiàn)在我們來(lái)一些情況。

0x02 經(jīng)過(guò)

踩坑1:

測(cè)試代碼大概是這樣的:

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

測(cè)試過(guò)程中發(fā)現(xiàn)通過(guò)瀏覽器的方式傳入數(shù)據(jù)的時(shí)候,會(huì)將 . + 等特殊字符轉(zhuǎn)換為 _ 。

這里涉及到了php的一個(gè)特性

php自身在解析請(qǐng)求的時(shí)候,如果參數(shù)名字中包含空格、.、[等字符,會(huì)將他們轉(zhuǎn)換成_。

<?php
$a = $_GET;
var_dump($a);
?>

經(jīng)過(guò)我的fuzz,結(jié)果如下圖:

踩坑2:

那我們知道 preg_replace 的 /e 修正符會(huì)將 replacement 參數(shù)當(dāng)作 php 代碼,并且以 eval 函數(shù)的方式執(zhí)行,前提是 subject 中有 pattern 的匹配。既然是這樣我們看一張圖。

圖中實(shí)際上通過(guò) eval 執(zhí)行的是 strtolower 函數(shù)。分別實(shí)際執(zhí)行的是:

strtolower("JUST TEST");
strtolower("PHPINFO()");
strtolower("{${PHPINFO()}}");

第三個(gè)之所以可以執(zhí)行代碼,是因?yàn)槲覀兺ㄟ^(guò)復(fù)雜(花括號(hào))語(yǔ)法的方式來(lái)讓其代碼執(zhí)行。

踩坑3:

回到源代碼中,我們?cè)倮斫庖幌拢?/p>

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

這里的 replacement 是 strtolower(“\\1”) ,著重理解一下 \\1 。

每個(gè)這樣的引用將被匹配到的第n個(gè)捕獲子組捕獲到的文本替換。 n可以是0-99,\0和\$0代表完整的模式匹配文本。

假設(shè)一個(gè)正則表達(dá)式是這樣的:

preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');

這里的 \$1\$2\$4 等同于上面的 \1\2\4 的作用,因此我們看一下是怎么選擇匹配的。

 $1 $2   $3 $4
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'

0x03 解決

好了上面都已經(jīng)鋪墊完坑了,這里要開(kāi)始解決了。

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

我們想要讓這部分代碼達(dá)到代碼執(zhí)行的效果需要達(dá)到幾個(gè)條件:

  • pattern 部分的表達(dá)式需要命中 \$value 中的數(shù)據(jù)
  • \1 中取出的數(shù)據(jù)復(fù)雜(花括號(hào))語(yǔ)法的特征,來(lái)保證在雙引號(hào)的包含下達(dá)到代碼執(zhí)行的效果
  • 由于php的特性u(píng)rl會(huì)將 . 、 [ 、 + 等特殊字符轉(zhuǎn)換為 _ 。

我們知道這里是通過(guò) get 方式獲取到 \$regex 和 \$value 的,要想在 replacement 部分通過(guò) \1 截取到 pattern 正則匹配命中 \$value 中的數(shù)據(jù),并且攜帶 \$ 、 { 、 ( 這里就涉及到正則表達(dá)式的使用了。

這里我選擇了 \S ,也就是匹配任意的非空白字符,那么最后的payload長(zhǎng)這樣

\S*()={${phpinfo()}}

0x04 后記

其實(shí)還有點(diǎn)小問(wèn)題,我這邊沒(méi)有寫,不過(guò)大家可以看看這個(gè)深入研究preg_replace與代碼執(zhí)行。

總結(jié)

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

相關(guān)文章

  • PHP+redis實(shí)現(xiàn)的購(gòu)物車單例類示例

    PHP+redis實(shí)現(xiàn)的購(gòu)物車單例類示例

    這篇文章主要介紹了PHP+redis實(shí)現(xiàn)的購(gòu)物車單例類,涉及php連接、操作redis數(shù)據(jù)庫(kù)及購(gòu)物車功能相關(guān)定義與使用技巧,需要的朋友可以參考下
    2019-02-02
  • PHP中strtotime函數(shù)使用方法詳解

    PHP中strtotime函數(shù)使用方法詳解

    在PHP中有個(gè)叫做strtotime的函數(shù)。strtotime 實(shí)現(xiàn)功能:獲取某個(gè)日期的時(shí)間戳,或獲取某個(gè)時(shí)間的時(shí)間戳。strtotime 將任何英文文本的日期時(shí)間描述解析為Unix時(shí)間戳[將系統(tǒng)時(shí)間轉(zhuǎn)化成unix時(shí)間戳]
    2011-11-11
  • php SQL Injection with MySQL

    php SQL Injection with MySQL

    本文僅用于教學(xué)目的,如果因?yàn)楸疚脑斐傻墓艉蠊救烁挪回?fù)責(zé),本文所有代碼均為本人所寫,所有數(shù)據(jù)均經(jīng)過(guò)測(cè)試。絕對(duì)真實(shí)。
    2011-02-02
  • php遞歸列出所有文件和目錄的代碼

    php遞歸列出所有文件和目錄的代碼

    我的程序在國(guó)外的SREVER上,自己編的程序存放到哪,我很難記清。 所以編了一個(gè)簡(jiǎn)單的目錄遞歸函數(shù),查看我的程序,很方便的。
    2008-09-09
  • 項(xiàng)目中應(yīng)用Redis+Php的場(chǎng)景

    項(xiàng)目中應(yīng)用Redis+Php的場(chǎng)景

    Redis是一個(gè)開(kāi)源的使用ANSI C語(yǔ)言編寫、支持網(wǎng)絡(luò)、可基于內(nèi)存亦可持久化的日志型、Key-Value數(shù)據(jù)庫(kù),并提供多種語(yǔ)言的API。今天我們來(lái)看下php結(jié)合redis的一些應(yīng)用場(chǎng)景
    2016-05-05
  • PHP實(shí)現(xiàn)將標(biāo)點(diǎn)符號(hào)正則替換為空格的方法

    PHP實(shí)現(xiàn)將標(biāo)點(diǎn)符號(hào)正則替換為空格的方法

    這篇文章主要介紹了PHP實(shí)現(xiàn)將標(biāo)點(diǎn)符號(hào)正則替換為空格的方法,結(jié)合實(shí)例形式分析了php針對(duì)符號(hào)的正則匹配相關(guān)操作技巧,需要的朋友可以參考下
    2017-08-08
  • php生成隨機(jī)驗(yàn)證碼圖片的示例代碼

    php生成隨機(jī)驗(yàn)證碼圖片的示例代碼

    這篇文章主要介紹了php生成隨機(jī)驗(yàn)證碼圖片的示例代碼,結(jié)合實(shí)例形式分析了php生成隨機(jī)驗(yàn)證碼圖片的實(shí)現(xiàn)方法與相關(guān)操作注意事項(xiàng),文中有詳細(xì)的代碼示例,需要的朋友可以參考下
    2023-09-09
  • php如何利用ffmpeg獲取視頻第一幀為縮略圖

    php如何利用ffmpeg獲取視頻第一幀為縮略圖

    用PHP生成視頻的縮略圖,在網(wǎng)上比較一致的方法就是通過(guò)ffmpeg來(lái)做的,下面這篇文章主要給大家介紹了關(guān)于php如何利用ffmpeg獲取視頻第一幀為縮略圖的相關(guān)資料,需要的朋友可以參考下
    2022-03-03
  • PHP中error_reporting()函數(shù)的用法(修改PHP屏蔽錯(cuò)誤)

    PHP中error_reporting()函數(shù)的用法(修改PHP屏蔽錯(cuò)誤)

    一般在默認(rèn)的普通PHP文件中輸出一個(gè)未定義聲明的變量是不會(huì)報(bào)錯(cuò)誤的,但在codeigniter框架下卻要報(bào)錯(cuò)誤,這對(duì)于想集成 添加 和 修改 頁(yè)面于一體的”懶人”很不方便,由于是初學(xué)者開(kāi)始還想怎么在代碼中屏蔽這一錯(cuò)誤提示呢.甚至用到了@,但聽(tīng)很多人都說(shuō)@會(huì)大大降低性能.
    2011-07-07
  • PHP編程實(shí)現(xiàn)微信企業(yè)向用戶付款的方法示例

    PHP編程實(shí)現(xiàn)微信企業(yè)向用戶付款的方法示例

    這篇文章主要介紹了PHP編程實(shí)現(xiàn)微信企業(yè)向用戶付款的方法,涉及php針對(duì)微信接口調(diào)用、配置及交互操作相關(guān)技巧,需要的朋友可以參考下
    2017-07-07

最新評(píng)論

扶绥县| 宝清县| 噶尔县| 库尔勒市| 噶尔县| 元氏县| 崇信县| 寻甸| 柳江县| 芦溪县| 肇源县| 甘南县| 工布江达县| 西充县| 深州市| 新邵县| 石泉县| 嘉荫县| 隆昌县| 科技| 盈江县| 南澳县| 鄂托克前旗| 岑溪市| 威宁| 涞水县| 延庆县| 海阳市| 渭南市| 河北省| 阿鲁科尔沁旗| 溧阳市| 临洮县| 凤阳县| 保德县| 稷山县| 黄陵县| 化州市| 连城县| 大兴区| 盐亭县|