首页 > 编程知识 正文

java路径遍历缺陷修复,路径遍历漏洞特征

时间:2023-05-06 07:42:45 阅读:180919 作者:1300

一.巴斯德

路径遍历是指接收未经过正确验证的APP应用程序的用户参数,以执行与读取和显示包含特殊字符(如.或/)的文件有关的操作。 使用这些特殊字符可以使对受保护文件、目录或敏感数据的访问不受限制。 本文以JAVA语言源代码为例,分析路径遍历缺陷及其缺陷产生的原因和修复方法。

二.缺陷代码

第172行在localFile收到参数后,可能会收到./file.text,因为未正确验证该参数。 假设文件路径有效,则可能会读取uploads父目录下的file.text文件。

三.代码修复

我使用了两种方法来解决路径遍历问题。 一个是全局滤波,另一个是单字符串滤波

全局过滤器代码为以下:

privatestringfilenamevalidate (stringstr ) stringfilenameliststr='./|/. '; //在此为请求主体中不能具有的关键字if(null!=fileNameListStr! ' '.equals(filenameliststr ) ) {str=str.toLowerCase; //批量转换为小写log.info (SQL filter===================路径遍历过滤规则: ) filenameliststr ) string [ ] badstrs=filenameliststr.split (| ); for(intI=0; i badStrs.length; I () if ) str.indexof ) badstrs[I]=0) {return badStrs[i]; } } }返回空值; }我配置的过滤器

publicclassflienamefilterimplementsfilter { privatestaticfinalloggerlog=logger factory.getlogger (flienamefilter.class ) @Overridepublic void destroy () {bundle=null; } @ overridepublicvoiddofilter (servletrequestrequest,ServletResponse response,filter chain ) throws IOException,servet //所有请求参数名称enumerationstringparams=req.getparameter names (; 字符串缓冲器内容=new string buffer (' '; while(params.hasmoreelements () (/参数名称String name=params.nextElement ) ).toString ); string value=req.getparameter (name; content.append(value; } stringsqlinjectliststr=bundle.getstring (' filenameliststr ); string message=filename validate (content.tostring )、sqlInjectListStr; 消息!=null () {req.getSession ) ).setattribute('overpowermessage ',message ); log.error (SQL filter=============log.error )! 查找文件输入. '; log.error (SQL filter=====================传递的参数字符串(content.toString ) ) ) ) ) }else{chain.dofilter(request,response ); } privatestringfilenamevalidate (stringstr,String sqlInjectListStr ) if(null!=sqlInjectListStr! ' '.equals(sqlinjectliststr ) {str=str.toLowerCase; //统一迁移到小写log.info (SQL filter==================路径遍历过滤规则: ) SQLinjectListstr ) for(intI=0; i badStrs.length; I () if ) str.indexof ) badstrs[I]=0) {return badStrs[i]; } } }返回空值; } @ overridepublicvoidinit (filterconfigfilterconfig ) throwsservletexception(try ) bundle=newpropertyresourcebundle ) th catch(ioexceptione ) log.error (parameters.properties配置文件夹失败) ); }}我的匹配规则写在配置文件中,所以我先阅读配置文件以获取匹配规则。 如果请求体中存在危险字符串,例如. /,请将其阻止并返回异常页面。 这样写也有缺陷。 这是一个危险的字符串,在填写文档或日志说明时无法填写匹配规则,例如. /。

二是单体字符串过滤。

publicclassflienamefilter (/privatestaticpatternfilepattern=pattern.com pile (' [\"/: *? ()|); privatestaticpatternfilepattern=pattern.com pile ' [\ s. | (); //过滤规则publicstaticstringfilenamefilter (stringstr ) ) { return str==null? null 3360文件pattern.matcher (str ).replaceAll ) '); } publicstaticvoidmain (string [ ] args ) stringstr=' home/.|logs/./: edata?' ; //stringfilenamefilter=filename filter (str; stringfilenamefilter=filename validate (str; system.out.println (filename filter ); } privatestaticstringfilenamevalidate (stringstr ) stringstrinjectliststr='./|||||?' ; if (空!=strInjectListStr! ' '.equals(strinjectliststr ) {str=str.toLowerCase; string [ ] badstrs=strinjectliststr.split (| ); for(intI=0; i badStrs.length; I ) if(str.indexof ) badstrs[I]=0) ) str=str.replace ) badstrs[I],''); }}}return str; }对于单个字符串过滤,如果路径遍历漏洞很多,则需要更改很多位置。

四.代码安全防护测试

也许有些合作伙伴写了这些代码并发布到安全测试上,发现自己的直通漏洞还存在,但我也遇到了这样的漏洞。 联系需要测试代码工具的人讨论这个问题。 其实巴斯德的问题已经解决了。 例如:

官方工作人员说,引擎不知道我们上面写的代码是用来做遍历滤波器的,请告诉引擎。 该方法将处理逻辑封装在一个方法中,放置在系统管理-函数白名单中,并在开始检测时设置该白名单函数。

或者直接审计不是问题,如果选择了审计手机,下次检查后会被审计为不是问题。 说白了,漏洞已经修复了,但他没有检测到你修改的代码。

那么,以上就是我面临的问题。 我有喜欢的地方。 请关注作者。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。