首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >create_function命令注入

create_function命令注入
EN

Security用户
提问于 2018-08-22 02:10:41
回答 1查看 1.2K关注 0票数 2

我读到了create_function,它将在PHP7.2上被废弃,这很容易被PHP命令注入。我开始玩它,并创造了一个例子。

下面的代码应该返回数组中每个字符串的小写版本。

我的问题是,为什么在这种情况下使用'array_walk_recursive‘函数来修复代码注入呢?

Legit函数

的使用

代码语言:javascript
复制
Array
(
    [0] => hello
)

试图注入命令,但是没有计算PHP代码。返回一个字符串

代码语言:javascript
复制
Array (
    [0] => phpinfo(); 
)

试图将phpinfo()放入create_function

(请注意phpinfo运行。警告来自于php沙箱)

代码语言:javascript
复制
*Warning:  phpinfo() has been disabled for security reasons in [...][...](32) : runtime-created function on line 1

Array
(
    [0] => anything
)*
EN

回答 1

Security用户

发布于 2018-08-22 10:38:35

为什么在这种情况下使用'array_walk_recursive‘函数来修复代码注入呢?

解决这个问题的不是array_walk_recursive。问题是根本就没有问题。

您不能为代码注入使用create_function函数参数,因为这些参数被视为变量字符串,并且不能用于脱离当前上下文。

注入的参数需要来自外部。例如:

代码语言:javascript
复制
 'b', 'c' => 'D']; 
$func = $_GET['x']; /// eg x=strtolower
array_walk_recursive(
    $arr,
    create_function('&$value, $key', '$value = ' . $func . '($value);')
);
print_r($arr);
?>

现在您可以获得代码执行:

代码语言:javascript
复制
x=strtolower($value);phpinfo();

Detailed解释

代码语言:javascript
复制
 'b', 'c' => 'D']; 
$func = $_GET['x']; /// eg x=strtolower
array_walk_recursive( // apply the function created below to all array elements
    $arr,
    create_function(                      // creating a new function
        '&$value, $key',                  // arguments for the function
        '$value = ' . $func . '($value);' // the function itself.
            // function uses $func from outside this string context (this is the essential part). 
            // $value is the value from the previous parameter. It is just a string here. 
    )
);
print_r($arr);
?>

当用x=strtolower($value);phpinfo();调用它时,create_function从给定的字符串创建的函数基本上是:

代码语言:javascript
复制
function (&$value, $key) {
    $value = strtolower($value);phpinfo();
}

然后对每个数组条目调用这个函数。我们可以看到这将如何导致代码执行。

如果我们将其与OP中的代码进行比较,所创建的函数将是:

代码语言:javascript
复制
function (&$value, $key) {
    $value = strtolower($value);
}

此函数中没有代码执行,因为在创建函数的字符串中没有使用来自外部的值。

票数 1
EN
页面原文内容由Security提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://security.stackexchange.com/questions/192056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档