将jpeg图像解释为php脚本


Interpreting a jpeg image as a php script

我正在解决natas overthewire的一些网络黑客挑战。在第12级中,我必须在服务器上上传一张图像,然后服务器会给我上传图像的确切链接。我通过编写一个简单的php脚本来利用密码的内容。这是有效的,因为我可以将它作为.php文件上传,服务器也以该格式存储它。在13级中,也出现了类似的挑战,但这里服务器通过调用函数exif_imagetype()来检查它是否是一个图像文件。我只是在记事本中修改一个现有的图像文件,并在末尾插入我的脚本。

我的问题是,如果服务器只是检查了文件的扩展名,如果文件不是.jpg扩展名,就拒绝它,那会更好,因为在这种情况下,即使我上传了一个脚本,它也永远不会被服务器执行,因为它会被解释为图像文件,php服务器永远不会解析该文件。那么,为什么要使用exif_imagetype()这样的函数呢?

验证真实图像总是比检查文件扩展名更好。除非扩展检查器特别复杂,否则它可能会查找文件名中的最后一个.,并评估以下内容。

例如,这可能是一个基本扩展检查器的例子:

$extension = end( explode('.', $_FILES['my_file']['name'] );
// or:
$extension = strrchr($_FILES['file']['name'], '.');  

这一切都很好,而且对于myfile.jpgmalicious.php等文件名来说确实表现得非常好。

然而,这很容易被肆无忌惮的用户通过各种黑客手段欺骗。最难规避的是臭名昭著的NULL字节注入:

shell.php%0delete0.jpg

您可以在此处了解有关空字节注入的更多信息。