我们通过前篇<web上存漏洞及原理分析防范方法(安全文件上存方法) >已经知道后端获取服务器变量很多来自客户端传入的跟普通的getpost没有什么不同下面我们看看常见出现漏洞代码
检测文件类型并且用用户上存文件名保存
复制代码 代码如下:
if(isset($_FILES[
img
]))
{
$file = save_file($_FILES[
img
]);
if($file===false) exit(
上存失败!
);
echo "上存成功!"
$file;
}
function check_file($img)
{
///读取文件
if($img[
error
]>
) return false;
$tmpfile = $img[
tmp_name
];
$filename = $img[
name
];
///读取文件扩展名
$len=strrpos($filename
"
");
if($len===false) return false;
//得到扩展名
$ext = strtolower(substr($filename
$len+
));
if(!in_array($ext
array(
jpg
jpeg
png
))) return false;
return true;
}
function save_file($img)
{
if(!check_file($img)) return false;
//格式检测ok
准备移动数据
$filename = $img[
name
];
$newfile = "upload/"
$filename;
if(!move_uploaded_file($img["tmp_name"]
$newfile)) return false;
return $newfile;
}
?>
以 上代码对输入类型也做了判断看了没有问题但是问题确恰恰出现在对获取的用户名变量检测上面直接获取传入用户名然后存为文件 有朋友会说这些文件名都是我电脑里面存在的文件名格式都受限于操作系统对文件名定义 但是需要注意是对于$_FILES里面获取变量是直接来自http request请求它跟普通获取其它getpost变量一样 因此别有用心的人往往会自己模拟浏览器给服务器发送一个特殊文件名然后让存文件时候能够正常保存为自己格式
前些年”” 在字符串中保存为文件会自动截断后面内容 如$filename 构造为”aphpjpg” 我们想想将会变成怎么样?
$newfile = “upload/aphpjpg” 因为对扩展名验证最右边””后面字符是jpg 是允许图片格式 但是我们一以该文件名保存 发现磁盘会在upload目录下面生成aphp 后面所有字符被自动截断
该漏洞风靡一时当时几乎大多数上存网站都有漏洞一时很多平台关闭了上存其实根本原因就在此我们拿到文件名自己作为最终生成文件名保存了 好的方法是自己随机生成文件名+读取扩展名 这样可以组织输入特殊字符在进行文件保存时候被抛弃或截断了
php时代这个漏洞可以利用到php时代生成的变量文件名值中会自动过滤掉”” 这样无论用户构造怎么样的特殊””用户名都会被截断 但是 目前这类漏洞在aspjsp 等站点还经常有出现老版本的php站点也会经常出现
好了今天先到这里后面还有种其它常见方法后面给出!欢迎交流!