XSS等web安全漏洞的防范_第1页
XSS等web安全漏洞的防范_第2页
XSS等web安全漏洞的防范_第3页
XSS等web安全漏洞的防范_第4页
XSS等web安全漏洞的防范_第5页
全文预览已结束

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

XSS等web安全漏洞的防范近在cnode社区,由@吴中骅的一篇关于XSS的文章,直接导致了社区的人开始在cnode尝试各种攻击。这里总结了一下这次碰到的一些问题与解决方案。文件上传漏洞之前nodeclub在上传图片的时候逻辑是这样的://用户上传的文件名varfilename=Date.now()+'_'+;//用户文件夹varuserDir=path.join(config.upload_dir,uid);//最终文件保存的路径varsavepath=path.join(userDir,filename);//将用户上传的文件从临时目录移动到最终保存路径fs.rename(file.path,savepath,callback);看上去好像没有问题,每个人上传的文件都存放在以用户UID命名的一个文件夹内,并且以当前的时间戳作前缀。但是当有用户恶意构造输入的时候,问题就出现了。当用户上传的文件filename为/../../xxx的时候,上传的文件就会rename到用户文件夹之外,导致用户可以替换现有系统上的任何文件。这个漏洞相对来说非常的低级,但是后果却是最严重的,直接导致整个系统都可能被用户控制。修复的方法也很简单:varfilename=Date.now()+'_'+;varuserDir=path.join(config.upload_dir,uid);〃获取最终保存到的绝对路径varsavepath=path.resolve(path.join(userDir,filename));〃验证if(savepath.indexOf(path.resolve(userDir))!==0){returnres.send({status:'forbidden'});}fs.rename(file.path,savepath,callback);富文本编辑器的XSS关于XSS,在@吴中骅的文章中已经非常详细的描述了。而cnode社区中,用户发表话题和回复话题也是用的一个支持markdown格式的富文本编辑器。之前是没有做过任何XSS防范措施的,于是...你可以直接在里面写:<script>alert(123);</script><divonmouseover="alert(123)"></div><ahref="javascript:alert(123);">123</a>而markdown格式的内容也没有做URL有效性检测,于是各种样式的XSS又出来了:[xss][1][xss][2]![xss][3]:javascript:alert(123);:/#"onclick='alert(123)':/img.jpg#"onmouseover='alert(123)'在社区这个应用场景下,引入HTML标签只是为了进行一些排版的操作,而其他的样式定义等等都只会让整个界面一团糟,更别说还有潜在的XSS漏洞风险。因此,其实我们是不需要支持用户输入HTML标签来进行内容排版的,一切都可以通过markdown来代替。然后通过简单粗暴的HTMLescape,就可以消灭掉直接输入HTML导致的XSS风险。functionescape(html){returnhtml.replace(/&(?!w+;)/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"');}然而这样粗暴的进行escape,会导致用户输入的代码里面的<>;这些特殊字符也被转义掉,不能正确显示,需要先将代码段提取出来保存,只转义非代码段的部分。于是这个escape函数变成了这样:functionescape(html){varcodeSpan=/(^|[^\])('+)([^r]*?[^'])2(?!')/gm;varcodeBlock=/(?:nn|人)((?:(?:[]{4}|t).*n+)+)(n*[]{0,3}[人tn]|(?=~0))/g;varspans=[];varblocks=[];vartext=String(html).replace(/rn/g,'n').replace('/r/g','n');text='nn'+text+'nn';text=text.replace(codeSpan,function(code){spans.push(code);return''span、';});text+='~0';returntext.replace(codeBlock,function(whole,code,nextChar){blocks.push(code);return'ntblock'+nextChar;}).replace(/&(?!w+;)/g,'&').replace(/</g,'<').replace(/>/g,'>').replace(/"/g,'"').replace(/'span'/g,function(){returnspans.shift();}).replace(/ntblock/g,function(){returnblocks.shift();}).replace(/~0$/,'').replace(/人nn/,'').replace(/nn$/,'');};而对于markdown生成的<a>标签和<img>标签中的href属性,必须要做URL有效性检测或者做xss的过滤。这样保证通过markdown生成的HTML代码也是没有XSS漏洞的。因为XSS的手段确实比较多,见XSSFilterEvasionCheatSheet。因此能够做粗暴的HTMLescape是最安全的,但是并不是每一个地方都可以通过markdown来代替HTML代码,所以不是每一个地方都能用HTMLescape,这个时候就需要其他的手段来过滤XSS漏洞了。XSS防范只能通过定义白名单的形式,例如只允许<p><div><a>标签,只允许hrefclassstyle属性。然后对每一个可能造成XSS的属性进行特定的过滤。现有的XSS过滤模块,一个是node-validator,一个是@雷宗民写的js-xss。不能够保证XSS模块可以防范住任意的XSS攻击,但是起码能够过滤掉大部分能够想象到的漏洞。node-validator的XSS()仍然有bug,对于<pon="></p>M式的代码,会有双引号不闭合的问题,导致HTML元素测漏。模版引擎导致的XSS攻击cnode社区采用的是ejs作为模版引擎,而在ejs中,提供了两种输出动态数据到页面的方法:<%=data%>〃进行xss过滤的输出<%-data%>//不过滤直接输出而所有的过滤必须有一个前提:模版文件中的HTML属性的值等,必须使用双引号。例如<imgsrc='<%=reply.author.avatar_url%>'title='<%=%>'/><imgsrc="<%=reply.author.avatar_url%>"title="<%=%>"/>上面两条语句,第一句由于使用的是单引号,用户可以通过构造一个avatar_url中带单引号,来截断src属性,后面就可以随意加javascript代码了。CSRF攻击CSRF攻击在node的web开发框架connect和express等中都有了解决方方案。通过在访客的session中存放一个随机的_csrf字段,模版引擎在生成HTML文件的时候将这个_csrf值传递到前端,访客提交的任意POST请求,都必须带上这个字段进行验证,保证了只有当前用户在当前页面上可以进行修改的操作。然而当页面存在XSS漏洞的时候,CSRF的这种防范措施就成了浮云。恶意攻击者完全可以通过javascript代码,获取到其他用户的_csrf值,并直接模拟用户的POST请求进行服务端数据的更改

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论