【问题标题】:Unsure of php 5.6 string concatenation exploit不确定 php 5.6 字符串连接漏洞
【发布时间】:2016-02-19 19:23:57
【问题描述】:

我最近在我们的代码库中偶然发现了以下内容:

$func = $_GET['func'] . '_xyz123';
if(function_exists($func)){
   $result = $func($_GET);
   echo(json_encode($result));
}

这让我想知道,是否可以将一个 php 内置函数 + 一些垃圾传递给 $_GET['func'],这样它就会抵消 _xyz123 导致 RCE 漏洞利用。

这可能吗,还是我只是偏执?

【问题讨论】:

  • 一个空字符可能会这样做,但这让我想知道他们为什么会打扰。构建漏洞利用似乎是一种非常奇怪的方式,但“奇怪”是许多漏洞未被发现的方式。
  • 不能使用 \0 字符:3v4l.org/6vsmJ
  • unicode 范围 0x0...0xFFFF 中的任何其他字符都没有:3v4l.org/3MlSg
  • 无论这种特殊情况是否可利用,我认为您的担心是对的——运行基于从 GET 参数构建的名称的函数在我的书中是一种代码味道。至少,可以通过发送\Foo\bar 之类的字符串来更改命名空间
  • 谢谢@AlexHowansky,我什至没有想到这种可能性。

标签: php security php-5.6


【解决方案1】:

让代码保持原样确实是有风险的。

tried 找到一个可以过早剪切字符串的字符。但是,虽然我没有找到这样做的方法,但这并不是决定性的,可能还有其他方法可以篡改函数名称。由于 PHP 提供命名空间语法(使用 \),因此创意用户也可以利用它。

但没有理由冒险允许用户输入包含不应出现在函数名称中的字符。函数名必须跟在rules:

函数名称遵循与 PHP 中其他标签相同的规则。有效的函数名称以字母或下划线开头,后跟任意数量的字母、数字或下划线。作为一个正则表达式,它会这样表达:[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*

因此,您可以确保拒绝任何具有违规字符的参数(包括命名空间语法中的反斜杠)。使用引用的正则表达式,您可以执行以下操作:

function isValidName($name) {
    return preg_match("/^[a-zA-Z_\x7f-\xff][a-zA-Z0-9_\x7f-\xff]*$/", $name);
}

$func = $_GET['func'] . '_xyz123';

if(isValidName($func) && function_exists($func)){
    $result = $func($_GET);
    echo(json_encode($result));
}

另一种保护应用程序的方法是将所有可以以这种方式调用的函数定义为类的静态方法。假设这个类被称为 _xyz123,而你的函数没有这个后缀,那么代码可能看起来像这样,使用 method_exists:

$func = $_GET['func'];
if(isValidName($func) && method_exists('_xyz123', $func)){

或者您可以在特定命名空间中定义所有这些函数,例如_xyz123,然后这样做:

if(isValidName($func) && function_exists('\\_xyz123\\$func')){

【讨论】:

  • 感谢您对此进行调查!很有帮助。
猜你喜欢
  • 1970-01-01
  • 2012-07-28
  • 1970-01-01
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-22
  • 1970-01-01
相关资源
最近更新 更多