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攻击,从而导致文件暴露。
推荐文章++++