我们通过前篇:<浅谈web上存漏洞及原理分析、防范方法(安全文件上存方法)>,已经知道后端获取服务器变量,很多来自客户端传入的。跟普通的get,post没有什么不同。下面我们看看,常见出现漏洞代码。
1、检测文件类型,并且用用户上存文件名保存
复制代码 代码如下:
if(isset($_FILES['img']))
{
$file = save_file($_FILES['img']);
if($file===false) exit('上存失败!');
echo "上存成功!",$file;
}
function check_file($img)
{
///读取文件
if($img['error']>0) return false;
$tmpfile = $img['tmp_name'];
$filename = $img['name'];
///读取文件扩展名
$len=strrpos($filename,".");
if($len===false) return false;
//得到扩展名
$ext = strtolower(substr($filename,$len+1));
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请求。它跟普通获取其它get,post变量一样。 因此,别有用心的人,往往会自己模拟浏览器,给服务器发送一个特殊文件名。然后,让存文件时候,能够正常保存为自己格式。
前些年,”\0” 在字符串中,保存为文件,会自动截断后面内容。 如:$filename 构造为:”a.php\0.jpg” ,我们想想,将会变成怎么样?
$newfile = “upload/a.php\0.jpg” 因为,对扩展名验证,最右边”.”后面字符是jpg ,是允许图片格式。 但是,我们一以该文件名,保存。 发现磁盘会在upload目录下面生成a.php ,\0后面所有字符,被自动截断。
该漏洞,风靡一时。当时几乎大多数上存网站都有漏洞。一时,很多平台关闭了上存。其实,根本原因就在此。我们拿到文件名,自己作为最终生成文件名保存了。 好的方法,是自己随机生成文件名+读取扩展名 。这样可以组织输入特殊字符,在进行文件保存时候,被抛弃或截断了。
php4时代这个漏洞可以利用,到php5时代,生成的变量文件名值中,会自动过滤掉”\0” ,这样无论用户构造怎么样的特殊”\0”用户名,都会被截断。 但是 ,目前这类漏洞,在asp,jsp 等站点。还经常有出现。老版本的php站点也会经常出现。
好了,今天先到这里,后面还有2种其它常见方法,后面给出!欢迎交流!
1、检测文件类型,并且用用户上存文件名保存
复制代码 代码如下:
if(isset($_FILES['img']))
{
$file = save_file($_FILES['img']);
if($file===false) exit('上存失败!');
echo "上存成功!",$file;
}
function check_file($img)
{
///读取文件
if($img['error']>0) return false;
$tmpfile = $img['tmp_name'];
$filename = $img['name'];
///读取文件扩展名
$len=strrpos($filename,".");
if($len===false) return false;
//得到扩展名
$ext = strtolower(substr($filename,$len+1));
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请求。它跟普通获取其它get,post变量一样。 因此,别有用心的人,往往会自己模拟浏览器,给服务器发送一个特殊文件名。然后,让存文件时候,能够正常保存为自己格式。
前些年,”\0” 在字符串中,保存为文件,会自动截断后面内容。 如:$filename 构造为:”a.php\0.jpg” ,我们想想,将会变成怎么样?
$newfile = “upload/a.php\0.jpg” 因为,对扩展名验证,最右边”.”后面字符是jpg ,是允许图片格式。 但是,我们一以该文件名,保存。 发现磁盘会在upload目录下面生成a.php ,\0后面所有字符,被自动截断。
该漏洞,风靡一时。当时几乎大多数上存网站都有漏洞。一时,很多平台关闭了上存。其实,根本原因就在此。我们拿到文件名,自己作为最终生成文件名保存了。 好的方法,是自己随机生成文件名+读取扩展名 。这样可以组织输入特殊字符,在进行文件保存时候,被抛弃或截断了。
php4时代这个漏洞可以利用,到php5时代,生成的变量文件名值中,会自动过滤掉”\0” ,这样无论用户构造怎么样的特殊”\0”用户名,都会被截断。 但是 ,目前这类漏洞,在asp,jsp 等站点。还经常有出现。老版本的php站点也会经常出现。
好了,今天先到这里,后面还有2种其它常见方法,后面给出!欢迎交流!
标签:
上存漏洞,原理分析,防范方法
免责声明:本站文章均来自网站采集或用户投稿,网站不提供任何软件下载或自行开发的软件!
如有用户或公司发现本站内容信息存在侵权行为,请邮件告知! 858582#qq.com
桃源资源网 Design By www.nqtax.com
暂无“浅谈web上存漏洞及原理分析、防范方法(文件名检测漏洞)”评论...
稳了!魔兽国服回归的3条重磅消息!官宣时间再确认!
昨天有一位朋友在大神群里分享,自己亚服账号被封号之后居然弹出了国服的封号信息对话框。
这里面让他访问的是一个国服的战网网址,com.cn和后面的zh都非常明白地表明这就是国服战网。
而他在复制这个网址并且进行登录之后,确实是网易的网址,也就是我们熟悉的停服之后国服发布的暴雪游戏产品运营到期开放退款的说明。这是一件比较奇怪的事情,因为以前都没有出现这样的情况,现在突然提示跳转到国服战网的网址,是不是说明了简体中文客户端已经开始进行更新了呢?