解析web文件操作常见安全漏洞(目录、文件名检测漏洞)


Posted in PHP onJune 29, 2013

做web开发,我们经常会做代码走查,很多时候,我们都会抽查一些核心功能,或者常会出现漏洞的逻辑。随着技术团队的壮大,组员技术日益成熟。 常见傻瓜型SQL注入漏洞、以及XSS漏洞。会越来越少,但是我们也会发现一些新兴的隐蔽性漏洞偶尔会出现。这些漏洞更多来自开发人员,对一个函数、常见模块功能设计不足,遗留下的问题。以前我们能够完成一些功能模块,现在要求是要安全正确方法完成模块才行。 接下来,我会分享一些常见功能模块,由于设计原因导致漏洞出现。下面,我们先看下,读取文件型功能漏洞。
我们先看下下面一段代码,通过用户输入不同目录,包含不同文件

<?php
///读取模块名称
$mod = isset($_GET['m'])?trim($_GET['m']):'index';
///过滤目录名称不让跳转到上级目录
$mod = str_replace("..",".",$mod);
///得到文件
$file = "/home/www/blog/".$mod.".php";
///包含文件
@include($file);

这段代码,可能在很多朋友做的程序里面有遇到过,对于新人来说,也是很容易出现这样问题,记得走查遇到该代码时候,我问到,你这个代码安全方面能做到那些?
答:1. 对”..”目录有做替换,因此用户传入模块名里面有有..目录都会被替换掉了。
    2.构造拼接file名称,有前面目录限制,有后面扩展名限制,包含文件就会限制在该目录了
这段代码真的做到了目录安全检测吗?
我们来测试下,如果$mod传入这个值将会是什么样的结果。解析web文件操作常见安全漏洞(目录、文件名检测漏洞)

$mod 通过构造输?mod=…%2F…%2F…%2F…%2Fetc%2Fpasswd%00 ,我们看结果将是:

解析web文件操作常见安全漏洞(目录、文件名检测漏洞)

居然include(“/etc/passwd”)文件了。
怎么逃脱了我参数限制呢?
首先:
做参数过滤类型去限制用户输入本来就不是一个好方法,一般规则是:能够做检测的,不要做替换 只要是检测不通过的,直接pass 掉!这是我们的一个原则。过滤失败情况,举不胜举,我们来看看,实际过程。
1、输入”…/…/…/” 通过把”..” 替换为”.”后
2、结果是”../../../” 就变成了这个了
有朋友就会说,如果我直接替换为空格是不是就好了?在这个里面确实可以替换掉。但是不代表以后你都替换为空格就好了。再举例子下。如:有人将字符串里面javascript替换掉。代码如下:

……
$msg = str_replace(“javascript”,””,$msg);

看似不会出现了javascript了,但是,如果输入:jjavascriptavascript 替换,会替换掉中间一个变为空后。前面的”j” 跟后面的会组成一个新的javascript了。

其次:我们看看,怎么逃脱了,后面的.php 限制呢。用户输入的参数有:”etc/passwd\0” ,\0字符非常特殊,一段连接后,文件名称变成了”……etc/passwd\0.php”,你打印出该变量时候,还是正确的。但是,一段放入到文件读写操作方法里面,\0后面会自动截断。操作系统,只会读取……etc/passwd文件了。 “\0”会出现在所有文件系统读写文件变量中。都会同样处理。这根c语言\0作为字符串完整标记有关系。
通过上面分析,大家发现做文件类型操作时候,一不注意将产生大的漏洞。而且该漏洞就可能引发一系列安全问题。

该怎么做文件类操作呢?
到这里,估计有人就会思考这个,做文件读写操作时候,如果路径里面有变量时候,我该怎么样做呢?有人会说,替换可以吗? “可以”,但是这个方法替换不严格,将会出现很多问题。而且,对于初写朋友,也很难杜绝。 做正确的事情,选择了正确的方法,会从本身杜绝问题出现可能了。 这里,我建议:对于变量做白名单限制。

1.什么是白名单限制

举例来说:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///读取模块名称后
mod变量值范围如果是枚举类型那么:
if(!in_array($mod,array(‘user','index','add','edit'))) exit(‘err!!!');
完全限定了$mod,只能在这个数组中,够狠!!!!

2.怎么做白名单限制
通过刚才例子,我们知道如果是枚举类型,直接将值放到list中即可,但是,有些时候,这样不够方面。我们还有另外一个白名单限制方法。就是限制字符范围

举例来说:
$mod = isset($_GET['m'])?trim($_GET['m']):'index'; ///读取模块名称后
我限制知道$mod是个目录名称,对于一般站点来说,就是字母加数字下划线之类。
if(!preg_match(“/^\w+$/”,$mod)) exit(‘err!!!');
字符只能是:[A-Za-z0-9_] 这些了。够狠!!!

总结:是不是发现,白名单限制方法,做起来其实很简单,你知道那个地方要什么,就对输入检测必须是那些。而且,检测自己已知的,比替换那些未知的字符,是不是简单多了。 好了,先到这里,正确的解决问题方法,会让文件简单,而且更安全!!
PHP 相关文章推荐
php empty函数 使用说明
Aug 10 PHP
php面向对象全攻略 (十七) 自动加载类
Sep 30 PHP
本地机apache配置基于域名的虚拟主机详解
Aug 10 PHP
PHP入门之常量简介和系统常量
May 12 PHP
php导出CSV抽象类实例
Sep 24 PHP
PHP大转盘中奖概率算法实例
Oct 21 PHP
PHP中is_dir()函数使用指南
May 08 PHP
求帮忙修改个php curl模拟post请求内容后并下载文件的解决思路
Sep 20 PHP
Thinkphp框架开发移动端接口(2)
Aug 18 PHP
Laravel用户授权系统的使用方法示例
Sep 16 PHP
PHP使用glob方法遍历文件夹下所有文件的实例
Oct 17 PHP
PHP递归统计系统中代码行数
Sep 19 PHP
解析PHP中empty is_null和isset的测试
Jun 29 #PHP
浅析Dos下运行php.exe,出现没有找到php_mbstring.dll 错误的解决方法
Jun 29 #PHP
浅析PHP中的UNICODE 编码与解码
Jun 29 #PHP
基于flush()不能按顺序输出时的解决办法
Jun 29 #PHP
解析PHP 使用curl提交json格式数据
Jun 29 #PHP
PHP 过滤页面中的BOM(实现代码)
Jun 29 #PHP
解析curl提交GET,POST,Cookie的简单方法
Jun 29 #PHP
You might like
动漫女神老婆无限好,但日本女生可能就不是这么一回事了!
2020/03/04 日漫
从零开始学YII2框架(三)扩展插件yii2-gird
2014/08/20 PHP
YII2.0之Activeform表单组件用法实例
2016/01/09 PHP
php使用文本统计访问量的方法
2016/05/12 PHP
PHP bin2hex()函数基础实例讲解
2019/02/11 PHP
javascript入门·对象属性方法大总结
2007/10/01 Javascript
JS 两日期相减,获得天数的小例子(兼容IE,FF)
2013/07/01 Javascript
extjs_02_grid显示本地数据、显示跨域数据
2014/06/23 Javascript
jQuery过滤选择器详解
2015/01/13 Javascript
Js与Jq 获取页面元素值的方法和差异对比
2015/04/30 Javascript
Javascript 计算字符串在localStorage中所占字节数
2015/10/21 Javascript
JavaScript必知必会(九)function 说起 闭包问题
2016/06/08 Javascript
JS简单封装的图片无缝滚动效果示例【测试可用】
2017/03/22 Javascript
深入理解基于vue-cli的vuex配置
2017/07/24 Javascript
加载 vue 远程代码的组件实例详解
2017/11/20 Javascript
使用Bootstrap + Vue.js实现表格的动态展示、新增和删除功能
2017/11/27 Javascript
30分钟用Node.js构建一个API服务器的步骤详解
2019/05/24 Javascript
如何通过JS实现日历简单算法
2020/10/14 Javascript
[00:47]TI7不朽珍藏III——沙王不朽展示
2017/07/15 DOTA
[01:10:58]Spirit vs NB Supermajor小组赛 A组败者组决赛 BO3 第二场 6.2
2018/06/03 DOTA
Python操作sqlite3快速、安全插入数据(防注入)的实例
2014/04/26 Python
解决python2 绘图title,xlabel,ylabel出现中文乱码的问题
2019/01/29 Python
浅谈python3.6的tkinter运行问题
2019/02/22 Python
python3中pip3安装出错,找不到SSL的解决方式
2019/12/12 Python
python cv2读取rtsp实时码流按时生成连续视频文件方式
2019/12/25 Python
python实现二分查找算法
2020/09/18 Python
python 判断一组数据是否符合正态分布
2020/09/23 Python
python 实现逻辑回归
2020/12/30 Python
美国一家著名的手表在线折扣网站:Discount Watch Store
2020/02/24 全球购物
解释一下钝化(Swap out)
2016/12/26 面试题
小学英语教师先进事迹
2014/05/28 职场文书
走近毛泽东观后感
2015/06/04 职场文书
慰问信(范文3篇)
2019/10/23 职场文书
jdbc使用PreparedStatement批量插入数据的方法
2021/04/27 MySQL
Spring Boot两种全局配置和两种注解的操作方法
2021/06/29 Java/Android
解决vue-router的beforeRouteUpdate不能触发
2022/04/14 Vue.js