焦点

目录穿越漏洞修复建议

时间:2010-12-5 17:23:32  作者:休闲   来源:知识  查看:  评论:0
内容摘要:目录穿越漏洞,说白了就是攻击者利用路径拼接的疏漏,把`../../`这种序列塞进参数里,一路往上翻目录。翻到配置文件夹,密码文件就裸奔了;翻到代码目录,源码就成公开读物了。我见过最离谱的一次,某运维把

目录穿越漏洞,目录说白了就是漏洞攻击者利用路径拼接的疏漏,把`../../`这种序列塞进参数里,修复一路往上翻目录。建议翻到配置文件夹,目录密码文件就裸奔了;翻到代码目录,漏洞源码就成公开读物了。修复我见过最离谱的建议一次,某运维把数据库备份放在web根目录的目录上层,本意是漏洞防下载,结果一个`..%2f..%2fbackup.sql`直接全带走。修复

治这个病,建议别急着写过滤函数。目录你先想清楚一个事:你的漏洞程序到底需不需要让用户输入路径?大多数业务场景根本不需要。用户传个文件名,修复你后端自己拼个固定目录,这最稳妥。真要支持路径,那也得白名单校验,允许的字符集就那几十个,字母数字下划线横线点,别的全拒。黑名单过滤`../`是下下策,编码变体、双重URL编码、Unicode规范化,绕过姿势多得能写本字典。

代码层面最硬核的解法是规范化后做前缀校验。拿Java举例,先`Paths.get(baseDir).toRealPath()`拿到真实路径,再把用户传入的部分拼上去,再`toRealPath()`一次,最后检查结果是否以baseDir开头。不是就拒绝。这套逻辑看着啰嗦,但能挡住绝大多数花活。Python那边用`os.path.abspath`配合`startswith`也同理,记得处理Windows下的盘符和大小写问题。

光修代码不够。你得看看服务器配置。Nginx里加个`location`规则,把敏感目录直接deny掉;Apache的``块里`AllowOverride None`也别省。这些是纵深防御,就算代码层漏了,Web服务器还能兜底。有个真实案例,某厂商修了Java代码的穿越,但忘了Tomcat的`DefaultServlet`还开着,攻击者改道`/..;/`又绕进去了。修漏洞最怕这种修一半。

还有一类隐蔽入口,压缩包解压。用户传个zip上来,你解压时没校验文件名,里面藏着`../../shell.jsp`,解压完直接写到web目录。这问题在文件上传功能里特别常见。处理方案简单粗暴:解压前遍历zip条目,凡带`..`或绝对路径的一律丢弃,解压后还得再检查一遍实际落盘路径。

日志监控也别闲着。路径穿越攻击的特征很明显,请求里全是`%2e%2e%2f`或者大量`../`,WAF规则能拦一大半。但别全依赖WAF,内网横向移动时攻击者经常绕过WAF直连后端。把应用日志里的异常路径访问单独拎出来,每天扫一遍,比事后溯源强。

最后说个容易被忽略的点:框架自身的安全机制。Spring MVC的`@PathVariable`默认不解析`..`,但你要是用了`@RequestParam`再手动拼路径,那保护就失效了。框架版本记得升级,老版本Struts2的穿越漏洞至今还在被扫。开发规范里明确写一条:禁止用字符串拼接文件路径,必须用平台提供的Path API。这规矩定下来,比啥都管用。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap