欧美一区2区三区4区公司二百,国产精品婷婷午夜在线观看,自拍偷拍亚洲精品,国产美女诱惑一区二区

歡迎來到云服務(wù)器

網(wǎng)絡(luò)技術(shù)

preg_replace的e修飾符與PHP安詳

PHP以其易用性和可移植性正被遍及應(yīng)用于WEB開拓。然而,在我們利用的進(jìn)程中,,也要十分小心,從到處可見的XSS(新浪微博發(fā)送大量垃圾信息事件)到前段時間爆出來的Hash斗嘴的DDOS進(jìn)攻,最近,wooyun上面宣布了一個關(guān)于ThinkPHP框架的裂痕(最新版已經(jīng)修復(fù)),以前也是我用過的第一個框架,昨晚花時間重現(xiàn)了一下,查閱了下措施的道理。本文主要來重現(xiàn)該裂痕,然后闡明代碼,給出裂痕的原因,用這個裂痕去檢討大概對系統(tǒng)造成的粉碎,最后總結(jié),防御的要領(lǐng)。

裂痕主要是由mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit]) 這個函數(shù)引起的,我們先看官方說明:

/e 修 正符使 preg_replace() 將 replacement 參數(shù)看成 PHP 代碼(在適當(dāng)?shù)哪嫦蛞锰鎿Q完之后)。提示:要確保 replacement 組成一個正當(dāng)?shù)?nbsp;PHP 代碼字符串,不然 PHP 會在陳訴在包括 preg_replace() 的行中呈現(xiàn)語法理會錯 誤。

我們不妨先看一下這個示例

preg_replace("/test/e",$_GET["h"],"jutst test");

假如我們提交?h=phpinfo(),phpinfo()將會被執(zhí)行(利用/e修飾符,preg_replace會將 replacement 參數(shù)看成 PHP 代碼執(zhí)行)。這個正則被正確的匹配到,在舉辦替換的進(jìn)程中,需要將$_GET["h"]傳入的String看成函數(shù)來運(yùn)行,因此phpinfo()被樂成執(zhí)行。

<?php
preg_replace("/test/e",$_GET["h"],"jutst test");
?>

會見的url : ?h=phpinfo()

進(jìn)而,我們進(jìn)入ThinkPHP的源碼,下載2.1版(2.1今后已經(jīng)被修復(fù))。在/ThinikPHP/Lib/ThinkPHP/Util/Dispatcher.class.php的dispatch函數(shù)中,找到這句話:preg_replace的e修飾符與PHP安詳

在ThinkPHP的路由成果中,許多處所用到了preg_replace函數(shù)的/e參數(shù),然而最嚴(yán)重的是這個文件中的這句話,因?yàn)殡U些影響了所有利用Thinkphp的項(xiàng)目。

顯然,這個利用了/e函數(shù),會導(dǎo)致第二個參數(shù)看成函數(shù)利用。我們來闡明一下這句話:

正則匹配的是 :字母開頭,加上“/”脫離符,后頭跟一個非”/”的元素,被替換成$var["脫離符前的字母"]=脫離符后的值;作者的本意是要將這么一對一對的參數(shù)/值的形式的url寫入到 $var[$key] = $value的數(shù)組中。

譬喻:URL,index.php?s=/model/action/par1/value1

將被理會成 :model模塊的action要領(lǐng),參數(shù)的處理懲罰放在這句話中,$deprde的值是“/”,由于/par1/value1(剩余的URL參數(shù))匹配到了正則表達(dá)式,則會用第二個參數(shù)去舉辦替換。那么第二個參數(shù)應(yīng)該被看成一個php語句來執(zhí)行,他是一個賦值語句,執(zhí)行的功效為:$var["par1"] = “value1″,作者以此來到達(dá)闡明url的目標(biāo),也實(shí)現(xiàn)了ThinkPHP的C層。

可是在賦值的時候,利用的是雙引號。危險的處所實(shí)際上在這里,在 php中,雙引號內(nèi)里假如包括有變量,php表明器會將其替換為變量表明后的功效;單引號中的變量不會被處理懲罰。可以先做如下測試:

$a = “{${phpinfo()}}”;   phpinfo會被樂成執(zhí)行。因此,我們將第二個變量替換成我們需要的函數(shù),結(jié)構(gòu)出來的進(jìn)攻url大抵如下:

http:[email protected](THINK_VERSION)}

我們利用ThinkPHP2.1_full_with_extend ,利用examlpe內(nèi)里的Blog示例,快速搭建一個Thinkphp項(xiàng)目,然后會見http:[email protected](THINK_VERSION)},可以在左上角打印出當(dāng)前的TP版本,操作這個來執(zhí)行php函數(shù),相當(dāng)于開啟了一個PHP的一句話后門。

詳細(xì)闡明是:這句話的/par [email protected](THINK_VERSION)}將匹配到正則表達(dá)式,將會執(zhí)行第二個參數(shù),詳細(xì)語句是$var['par'] = “[email protected](THINK_VERSION)} “; 問題出在雙引號上面,這個會執(zhí)行內(nèi)里的語句,包括許多危險的語句,包括phpinfo(),讀取數(shù)據(jù)庫設(shè)置等等。

preg_replace的e修飾符與PHP安詳

停止今朝,在Google上還可以找到很多這樣的站點(diǎn),許多站點(diǎn)都可以直接執(zhí)行phpinfo(),在新版的ThinkPHP中已經(jīng)修復(fù)了這個裂痕,將第二個參數(shù)的雙引號改為單引號:


'$var['']='';'

在我們今后利用preg_replace的/e修飾符的時候,需要留意這個雙引號和單引號,像框架類的裂痕,一般影響的范疇都很是的廣。

騰訊云代理

Copyright © 2003-2021 MFISP.COM. 國外vps服務(wù)器租用 夢飛云服務(wù)器租用 版權(quán)所有 ? 粵ICP備11019662號

主站蜘蛛池模板: 临猗县| 安多县| 桂平市| 南城县| 永德县| 扶风县| 天全县| 赫章县| 错那县| 安乡县| 赣榆县| 定日县| 汕尾市| 古浪县| 竹山县| 黎城县| 老河口市| 延寿县| 深圳市| 萨嘎县| 西乡县| 江源县| 太湖县| 博白县| 红原县| 印江| 图木舒克市| 定远县| 兴城市| 迁西县| 维西| 米易县| 天峨县| 松溪县| 海伦市| 连南| 陆川县| 香河县| 隆子县| 龙游县| 庆阳市|