网络内存漏洞及其原理分析与防范方法(文件名检测漏洞)
我们已经通过了前一章:已经知道后端获取服务器变量,很多来自客户机,这与普通获取、邮政不一样,让我们看看常见的bug代码。1。检查文件类型并保存用户的文件名。
复制代码代码如下所示:
如果(isset($ _files { 'img ' }))
{
文件大小= save_file($ _files { 'img});
如果(= = =虚假文件)退出(记忆失败!);
保存!
}
功能check_file($ IMG)
{
只要看一下文件
如果($ img {错误} > 0)返回false;
tmpfile美元=美元'tmp_nameIMG { };
文件名=美元美元img { 'name' };
只需读取文件扩展名
$ len =个子($文件名,,);
如果($ = false = false)返回false;
获取/扩展
Ext = strtolower美元(substr($文件名,$ len + 1));
如果(!in_array($ EXT,阵列('jpg ','jpeg ','png ')))返回false;
返回true;
}
功能save_file($ IMG)
{
如果(!check_file($ IMG))返回false;
用于移动数据的格式检测OK
文件名=美元美元img { 'name' };
为NewFile.txt = 上传 / 为文件名;
如果(!move_uploaded_file($ img {tmp_name},为NewFile.txt))返回false;
返回的新文件;
}
>
上面的代码,输入的类型进行判断,看没有问题。但问题,正是其中的用户名变量进行检测的情况下,直接输入用户名,然后将它保存为一个文件。有的朋友会说:这些文件的名字在我的电脑,和文件名格式是由操作系统限制的文件名称的定义。但是,需要注意的是,在$ _files变量的采集是直接从HTTP请求重要。它是作为其他共同获得,同一岗位变量。因此,别有用心的人倾向于模拟自己的浏览器发送一个特殊文件名到服务器。然后,当你保存文件,你可以把它放在你的自己的格式。
在过去的几年里, 0保存为字符串中的一个文件,它会自动截断它背后的内容。例如:$文件名结构:A.php 0.jpg,让我们想想,会是什么呢
为NewFile.txt =上传/ A.php 0.jpg,因为扩展验证延伸的权利。后来的性格是JPG格式,它允许图片格式。但是,一旦我们的文件的名称,我们保持它。发现磁盘将上传目录下生成A.php,和所有在 0字自动截断。
该漏洞是所有的愤怒,几乎大部分的网站漏洞,一会儿,许多平台关闭。事实上,最根本的原因是在这里。我们得到的文件名和保存它的最终文件。一个好的方法是生成文件名随机阅读延伸这允许你组织特殊字符和被遗弃或截断时,文件保存。
在PHP4的时代,这个漏洞可以用。在PHP5时代,可变的文件名的值将过滤 0自动,所以无论什么特殊用户名0用户构建,它将被截断。然而,目前在ASP有这样的漏洞,JSP和其他网站。它经常出现,PHP网站的旧版本也经常出现。
好,今天先来这里,后面还有2种常见的方法。欢迎交流!