靶场代码:
class Challenge {
const UPLOAD_DIRECTORY = './solutions/';
private $file;
private $whitelist;
public function __construct($file) {
$this->file = $file;
$this->whitelist = range(1, 24); //生成包含1-24的数组
}
public function __destruct() {
if (in_array($this->file['name'], $this->whitelist)) { //验证邮箱的名字但是并没有验证上传文件的文件类型
move_uploaded_file(
$this->file['tmp_name'],
self::UPLOAD_DIRECTORY . $this->file['name']
);
}
}
}
$challenge = new Challenge($_FILES['solution']);
该代码在第10行中包含一个任意文件上传漏洞。in_array()在第10行中使用该操作 来检查文件名是否为数字。但是,它是类型不安全的,因为第三个参数未设置为“ true”。因此,PHP将文件名与数组$ whitelist进行比较时,将尝试将文件名强制转换为整数值(第7行)。结果,可以通过在文件名之前添加介于1和24之间的值来绕过白名单,例如“ 5xxx.php”。然后,上传的PHP文件将导致在Web服务器上执行代码。
推荐文章++++