知识大全 解析web文件操作常见安全漏洞(目录、文件名检测漏洞
Posted 文件
篇首语:富贵必从勤苦得,男儿须读五车书。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 解析web文件操作常见安全漏洞(目录、文件名检测漏洞相关的知识,希望对你有一定的参考价值。
做web开发 我们经常会做代码走查 很多时候 我们都会抽查一些核心功能 或者常会出现漏洞的逻辑 随着技术团队的壮大 组员技术日益成熟 常见傻瓜型SQL注入漏洞 以及XSS漏洞 会越来越少 但是我们也会发现一些新兴的隐蔽性漏洞偶尔会出现 这些漏洞更多来自开发人员 对一个函数 常见 模块功能设计不足 遗留下的问题 以前我们能够完成一些功能模块 现在要求是要安全正确方法完成模块才行 接下来 我会分享一些常见功能模块 由于设计原因导致漏洞出现 下面 我们先看下 读取文件型功能漏洞
我们先看下下面一段代码 通过用户输入不同目录 包含不同文件
<?php ///读取模块名称 $mod = isset($_GET[ m ])?trim($_GET[ m ]): index ; ///过滤目录名称不让跳转到上级目录 $mod = str_replace(" " " " $mod); ///得到文件 $file = "/home//blog/" $mod " php"; ///包含文件 @include($file);
这段代码 可能在很多朋友做的程序里面有遇到过 对于新人来说 也是很容易出现这样问题 记得走查遇到该代码时候 我问到 你这个代码安全方面能做到那些?
答 对” ”目录有做替换 因此用户传入模块名里面有有 目录都会被替换掉了
构造拼接file名称 有前面目录限制 有后面扩展名限制 包含文件就会限制在该目录了
这段代码真的做到了目录安全检测吗?
我们来测试下 如果$mod传入这个值将会是什么样的结果
$mod 通过构造输?mod=…% F…% F…% F…% Fetc% Fpasswd% 我们看结果将是
居然include(“/etc/passwd”)文件了
怎么逃脱了我参数限制呢?
首先 做参数过滤类型去限制用户输入本来就不是一个好方法 一般规则是 能够做检测的 不要做替换 只要是检测不通过的 直接pass 掉!这是我们的一个原则 过滤失败情况 举不胜举 我们来看看 实际过程
输入”…/…/…/” 通过把” ” 替换为” ”后
结果是” / / /” 就变成了这个了
有朋友就会说 如果我直接替换为空格是不是就好了?在这个里面确实可以替换掉 但是不代表以后你都替换为空格就好了 再举例子下 如 有人将字符串里面javascript替换掉 代码如下
……
$msg = str_replace(“javascript” ”” $msg);
看似不会出现了javascript了 但是 如果输入:jjavascriptavascript 替换 会替换掉中间一个变为空后 前面的”j” 跟后面的会组成一个新的javascript了
其次 我们看看 怎么逃脱了 后面的 php 限制呢 用户输入的参数有 ”etc/passwd” 字符非常特殊 一段连接后 文件名称变成了”……etc/passwd php” 你打印出该变量时候 还是正确的 但是 一段放入到文件读写 操作方法里面 后面会自动截断 操作系统 只会读取……etc/passwd文件了 “”会出现在所有文件系统读写文件变量中 都会同样处理 这根c语言作为字符串完整标记有关系
通过上面分析 大家发现做文件类型操作时候 一不注意将产生大的漏洞 而且该漏洞就可能引发一系列安全问题
该怎么做文件类操作呢?
到这里 估计有人就会思考这个 做文件读写操作时候 如果路径里面有变量时候 我该怎么样做呢?有人会说 替换可以吗? “可以” 但是这个方法替换不严格 将会出现很多问题 而且 对于初写朋友 也很难杜绝 做正确的事情 选择了正确的方法 会从本身杜绝问题出现可能了 这里 我建议 对于变量做白名单限制
- 什么是白名单限制
举例来说
$mod = isset($_GET[ m ])?trim($_GET[ m ]):’index’; ///读取模块名称后
mod变量值范围如果是枚举类型那么
if(!in_array($mod array(‘user’ ’index’ ’add’ ’edit’))) exit(‘err!!!’);
完全限定了$mod 只能在这个数组中 够狠!!!!
- 怎么做白名单限制
通过刚才例子 我们知道如果是枚举类型 直接将值放到list中即可 但是 有些时候 这样不够方面 我们还有另外一个白名单限制方法 就是限制字符范围
cha138/Article/program/PHP/201311/21089举例来说
$mod = isset($_GET[ m ])?trim($_GET[ m ]):’index’; ///读取模块名称后
我限制知道$mod是个目录名称 对于一般站点来说 就是字母加数字下划线之类
if(!preg_match(“/^w+$/” $mod)) exit(‘err!!!’);
字符只能是 [A Za z _] 这些了 够狠!!!
相关参考
把nfig文件从根目录移到子目录Website内报错ItisanerrortouseasectionregisteredasallowDefinition=MachineToApplication
今天对自己以前写的一些常用的组件整理了一下发现对文件目录的操作的一个类还用的比较多于是对他进行了修改一些方法是为在社区中看到有网友提问增加的包括复制目录的文件和子目录移动目录文件和子目录生成Xml
PHP的目录操作和文件操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 在任何计算机设备中文件
网站建设中PHP的编程8种常见文件操作 以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧! 文件和目录
知识大全 web上存漏洞及原理分析、防范方法(安全文件上存方法)
cha138/Article/program/PHP/201311/20937
WindowS中,关于文件复制和移动的操作,说法正确的是_____。A、不同磁盘间不能用鼠标拖动的方法实现文件的移动B、不同磁盘间可以用鼠标拖动的方法实现文件的复制C、在同一磁盘上,不同目录间可用鼠标
问我没有备分oralce也没有导出数据库现在操作系统崩溃了但是oracle目录下的文件很完整请问如何修复我的表? 答:建一个相同的数据库(磁盘目录相同否则要改init文件麻烦)把数据文件控制文件
asp教程显示目录所有文件option explicitdim infopath
<% SetFSO=ServerCreateObject("ScriptingFileSystemObject")&nb
在c#中运用到操作流时首先要加入以下两个命名空间 usingSystemIO; usingSystemCollections; 我总结了以下几种方式来进行IO操作很简便但却很实用 目录的创