RIPS –代码审计靶场(第三关)

华盟原创文章投稿奖励计划

function __autoload($className) {
  include $className;
}

$controllerName = $_GET['c'];
$data = $_GET['d'];

if (class_exists($controllerName)) {
  $controller = new $controllerName($data['t'], $data['v']);
  $controller->render();
} else {
  echo 'There is no page with this name';
}

class HomeController {
  private $template;
  private $variables;

  public function __construct($template, $variables) {
    $this->template = $template;
    $this->variables = $variables;
  }

  public function render() {
    if ($this->variables['new']) {
      echo 'controller rendering new response';
    } else {
      echo 'controller rendering old response';
    }
  }
}

这段代码中有两个安全漏洞。文件包含漏洞是由class_exists() 第8行的调用触发的。这里,检查用户提供的类名的存在。如果类名未知,这将自动在第1行中调用自定义自动加载器,这将尝试包含未知类。攻击者可以使用路径遍历攻击来滥用此文件包含。对类名的查找../../../../etc/passwd将泄漏passwd文件。该攻击仅在PHP 5.3版之前有效。但是还有另一个错误也可以在最新的PHP版本中使用。在第9行中,类名用于新的对象实例化。其构造函数的第一个参数也位于攻击者的控制之下。可以调用PHP代码库的任意构造函数。即使代码本身不包含易受攻击的构造函数,PHP的内置类SimpleXMLElement也可以用于XXE攻击,从而导致文件暴露。

本文原创,作者:张,其版权均为华盟网所有。如需转载,请注明出处:https://www.77169.net/html/273318.html

发表回复