职业IT人-IT人生活圈

 找回密码
 成为会员
搜索
查看: 715|回复: 9

XSS漏洞处理

[复制链接]
找不到我 发表于 2011-9-1 12:07 | 显示全部楼层 |阅读模式
最近被Fortify整得有点抓狂,因为一直都是做企业的内部应用,一直不是很留意XSS这一块,应用已经上线很久,最近忽然搞安全扫描。

看了下网上关于XSS的漏洞和攻击介绍,自己大概总结了一下,XSS一般是由于没有对用户输入做严格校验,然后之后的页面把这个可能有恶意代码的输入存到数据库或者直接用于显示了,才会造成XSS漏洞。(不知道我的理解对不对,网上很多文章都有点语焉不详,没有太具体的代码,多数是一句话带过)

关于XSS的处理,有些人说用urlencode就能避免,但看到网上还是有不少方法是可以绕过这类encode的,例如
<div
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo
de(88,83,83));'))">

好像白名单的方式对解决,例如在这个帖子 http://www.iteye.com/topic/472103 里面提到的cleanHtml方法,但如果项目引入了较多的库,那这个方式工作量非常大,而且没办法找到现成的解决方式。被这个问题弄得很是头痛。大家有没有好一点的解决方式?

另外,抛砖引玉讨论一下,根据扫描报告,以下这段代码有XSS漏洞,但根据我的理解这段代码不应该有XSS漏洞,大家讨论一下,谢谢!

  
<SCRIPT type="text/javascript">   
var myuserid='<%=request.getParameter("lockuser")%>';   
</script>   
  
//不相关代码   
  
var userId='';   
if(myuserid!='' && myuserid!=null)userId=myuserid;   
if(!userId)userId='';  

<SCRIPT type="text/javascript">
var myuserid='<%=request.getParameter("lockuser")%>';
</script>

//不相关代码

var userId='';
if(myuserid!='' && myuserid!=null)userId=myuserid;
if(!userId)userId='';


除了这两处,页面就再没有其它地方使用myuserid,出了这个页面也再没有用到这个字符串的地方,这和我理解的xss漏洞有出入,是软件的问题?

紫衿 发表于 2011-9-1 12:07 | 显示全部楼层
欢迎使用HetaoBlogXssHTMLFilter,我在开源的一个一个产品上改进了下
看这里的第一篇,http://tool.hetaoblog.com/


走失的猫咪 发表于 2011-9-1 12:07 | 显示全部楼层
欢迎使用HetaoBlogXssHTMLFilter,我在开源的一个一个产品上改进了下
看这里的第一篇,http://tool.hetaoblog.com/



谢谢你! 能否帮忙看看我的代码例子呢?我觉得只有真正理解了问题才能解决问题,谢谢!

叫我小乖 发表于 2011-9-1 12:07 | 显示全部楼层
就你那段代码的问题,
简单的模拟问题,假设你在浏览器里面输入这样的请求,就可以看到效果了[如果后台没有对其他做限制,直接这样一个jsp页面的话], 如果有其他限制你可以重新写一个jsp,只包括输入lockuser和刚才这段代码;
http://yoursite/yourpage?lockuser=window.location%3D'http%3A%2F%2Ftool.hetaoblog.com'
其实就是你输入lockuser的地方输入window.location='http://tool.hetaoblog.com',

你应该可以看到网页被重定向到我的网站了;

由于你没有对输入做校验,注入了脚本就使得访问你这个网页的人被重定向到其他页面,
或者弹出一些其他的内容, 比如你在输入lockuser的地方输入alert('hello')也可以看到类似的效果;

然后我把这个链接发给别人,别人如果点击了这个链接,都会被重定向到我的网站,甚至做一些其他更严重的事情,
比如窃取一些信息等;



最近被Fortify整得有点抓狂,因为一直都是做企业的内部应用,一直不是很留意XSS这一块,应用已经上线很久,最近忽然搞安全扫描。

看了下网上关于XSS的漏洞和攻击介绍,自己大概总结了一下,XSS一般是由于没有对用户输入做严格校验,然后之后的页面把这个可能有恶意代码的输入存到数据库或者直接用于显示了,才会造成XSS漏洞。(不知道我的理解对不对,网上很多文章都有点语焉不详,没有太具体的代码,多数是一句话带过)

关于XSS的处理,有些人说用urlencode就能避免,但看到网上还是有不少方法是可以绕过这类encode的,例如
<div
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo
de(88,83,83));'))">

好像白名单的方式对解决,例如在这个帖子 http://www.iteye.com/topic/472103 里面提到的cleanHtml方法,但如果项目引入了较多的库,那这个方式工作量非常大,而且没办法找到现成的解决方式。被这个问题弄得很是头痛。大家有没有好一点的解决方式?

另外,抛砖引玉讨论一下,根据扫描报告,以下这段代码有XSS漏洞,但根据我的理解这段代码不应该有XSS漏洞,大家讨论一下,谢谢!

  
<SCRIPT type="text/javascript">   
var myuserid='<%=request.getParameter("lockuser")%>';   
</script>   
  
//不相关代码   
  
var userId='';   
if(myuserid!='' && myuserid!=null)userId=myuserid;   
if(!userId)userId='';  

<SCRIPT type="text/javascript">
var myuserid='<%=request.getParameter("lockuser")%>';
</script>

//不相关代码

var userId='';
if(myuserid!='' && myuserid!=null)userId=myuserid;
if(!userId)userId='';


除了这两处,页面就再没有其它地方使用myuserid,出了这个页面也再没有用到这个字符串的地方,这和我理解的xss漏洞有出入,是软件的问题?


曾经的小孩 发表于 2011-9-1 12:07 | 显示全部楼层
非常感谢!实际操作过才知道原理啊!
还有两个问题不是很理解
1、那这里假设我有一个validate的方法,可以清除非法字符或者直接不让非法输入传入,例如这样
var myuserid='<%=utils.validateUrl(request.getParameter("lockuser"))%>';
就可以基本解决问题了,或者用你的项目来过滤。
2、如果我自身的站点没有set domain,那是不是可以排除我自身被跨域的可能,只是还存在xss的漏洞,可以注入脚本?



就你那段代码的问题,
简单的模拟问题,假设你在浏览器里面输入这样的请求,就可以看到效果了[如果后台没有对其他做限制,直接这样一个jsp页面的话], 如果有其他限制你可以重新写一个jsp,只包括输入lockuser和刚才这段代码;
http://yoursite/yourpage?lockuser=window.location%3D'http%3A%2F%2Ftool.hetaoblog.com'
其实就是你输入lockuser的地方输入window.location='http://tool.hetaoblog.com',

你应该可以看到网页被重定向到我的网站了;

由于你没有对输入做校验,注入了脚本就使得访问你这个网页的人被重定向到其他页面,
或者弹出一些其他的内容, 比如你在输入lockuser的地方输入alert('hello')也可以看到类似的效果;

然后我把这个链接发给别人,别人如果点击了这个链接,都会被重定向到我的网站,甚至做一些其他更严重的事情,
比如窃取一些信息等;



最近被Fortify整得有点抓狂,因为一直都是做企业的内部应用,一直不是很留意XSS这一块,应用已经上线很久,最近忽然搞安全扫描。

看了下网上关于XSS的漏洞和攻击介绍,自己大概总结了一下,XSS一般是由于没有对用户输入做严格校验,然后之后的页面把这个可能有恶意代码的输入存到数据库或者直接用于显示了,才会造成XSS漏洞。(不知道我的理解对不对,网上很多文章都有点语焉不详,没有太具体的代码,多数是一句话带过)

关于XSS的处理,有些人说用urlencode就能避免,但看到网上还是有不少方法是可以绕过这类encode的,例如
<div
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo
de(88,83,83));'))">

好像白名单的方式对解决,例如在这个帖子 http://www.iteye.com/topic/472103 里面提到的cleanHtml方法,但如果项目引入了较多的库,那这个方式工作量非常大,而且没办法找到现成的解决方式。被这个问题弄得很是头痛。大家有没有好一点的解决方式?

另外,抛砖引玉讨论一下,根据扫描报告,以下这段代码有XSS漏洞,但根据我的理解这段代码不应该有XSS漏洞,大家讨论一下,谢谢!

  
<SCRIPT type="text/javascript">   
var myuserid='<%=request.getParameter("lockuser")%>';   
</script>   
  
//不相关代码   
  
var userId='';   
if(myuserid!='' && myuserid!=null)userId=myuserid;   
if(!userId)userId='';  

<SCRIPT type="text/javascript">
var myuserid='<%=request.getParameter("lockuser")%>';
</script>

//不相关代码

var userId='';
if(myuserid!='' && myuserid!=null)userId=myuserid;
if(!userId)userId='';


除了这两处,页面就再没有其它地方使用myuserid,出了这个页面也再没有用到这个字符串的地方,这和我理解的xss漏洞有出入,是软件的问题?




broken 发表于 2011-9-1 12:07 | 显示全部楼层
1. validate输入是可以的, 不过话说xss非常复杂,其列表、可能性非常之多,
http://ha.ckers.org/xss.html

所以通常输入验证使用白名单, 所以我的hetaoblogxssfilter和其他一些xssfilter项目基本都是基于白名单的方式来验证;

欢迎使用、验证或者再我的项目之上继续改进:)

2.
跨域的问题也非常复杂,除了document.domain以外,还有cookie等其他一些可能
http://www.80sec.com/cross_domain_attack.html



非常感谢!实际操作过才知道原理啊!
还有两个问题不是很理解
1、那这里假设我有一个validate的方法,可以清除非法字符或者直接不让非法输入传入,例如这样
var myuserid='<%=utils.validateUrl(request.getParameter("lockuser"))%>';
就可以基本解决问题了,或者用你的项目来过滤。
2、如果我自身的站点没有set domain,那是不是可以排除我自身被跨域的可能,只是还存在xss的漏洞,可以注入脚本?



就你那段代码的问题,
简单的模拟问题,假设你在浏览器里面输入这样的请求,就可以看到效果了[如果后台没有对其他做限制,直接这样一个jsp页面的话], 如果有其他限制你可以重新写一个jsp,只包括输入lockuser和刚才这段代码;
http://yoursite/yourpage?lockuser=window.location%3D'http%3A%2F%2Ftool.hetaoblog.com'
其实就是你输入lockuser的地方输入window.location='http://tool.hetaoblog.com',

你应该可以看到网页被重定向到我的网站了;

由于你没有对输入做校验,注入了脚本就使得访问你这个网页的人被重定向到其他页面,
或者弹出一些其他的内容, 比如你在输入lockuser的地方输入alert('hello')也可以看到类似的效果;

然后我把这个链接发给别人,别人如果点击了这个链接,都会被重定向到我的网站,甚至做一些其他更严重的事情,
比如窃取一些信息等;



最近被Fortify整得有点抓狂,因为一直都是做企业的内部应用,一直不是很留意XSS这一块,应用已经上线很久,最近忽然搞安全扫描。

看了下网上关于XSS的漏洞和攻击介绍,自己大概总结了一下,XSS一般是由于没有对用户输入做严格校验,然后之后的页面把这个可能有恶意代码的输入存到数据库或者直接用于显示了,才会造成XSS漏洞。(不知道我的理解对不对,网上很多文章都有点语焉不详,没有太具体的代码,多数是一句话带过)

关于XSS的处理,有些人说用urlencode就能避免,但看到网上还是有不少方法是可以绕过这类encode的,例如
<div
style="x:expression((window.r==1)?'':eval('r=1;alert(String.fromCharCo
de(88,83,83));'))">

好像白名单的方式对解决,例如在这个帖子 http://www.iteye.com/topic/472103 里面提到的cleanHtml方法,但如果项目引入了较多的库,那这个方式工作量非常大,而且没办法找到现成的解决方式。被这个问题弄得很是头痛。大家有没有好一点的解决方式?

另外,抛砖引玉讨论一下,根据扫描报告,以下这段代码有XSS漏洞,但根据我的理解这段代码不应该有XSS漏洞,大家讨论一下,谢谢!

  
<SCRIPT type="text/javascript">   
var myuserid='<%=request.getParameter("lockuser")%>';   
</script>   
  
//不相关代码   
  
var userId='';   
if(myuserid!='' && myuserid!=null)userId=myuserid;   
if(!userId)userId='';  

<SCRIPT type="text/javascript">
var myuserid='<%=request.getParameter("lockuser")%>';
</script>

//不相关代码

var userId='';
if(myuserid!='' && myuserid!=null)userId=myuserid;
if(!userId)userId='';


除了这两处,页面就再没有其它地方使用myuserid,出了这个页面也再没有用到这个字符串的地方,这和我理解的xss漏洞有出入,是软件的问题?






话说我当年 发表于 2011-9-1 12:08 | 显示全部楼层
解决XSS的基本法则:
1、所有输出默认Encode,只有在确定不Encode的时候提供方法来进行Raw输出,这一点ASP.NET的Razor模板做得不错,默认是Encode的,需要的时候用@Html.Raw来输出非Encode的内容
2、不允许用户提交HTML,注意不是过滤用户提交的HTML,而是完全不允许用户提交任何的HTML。富文本用BBCode或者MarkDown来传输,这是典型的“白名单”策略,即使用“黑名单”过滤永远不可能100%,所以干脆全部过滤然后开“白名单”来给予有限的许可。
3、一但用户不能提交HTML,那就永远不会有“需要把用户提交的内容原样输出”这样的情况,富文本的输出也变得简单了:
[code=java]
String content = getContentFromDatabase();
content = htmlEncode(content); // 先不管三七二十一全部Encode
content = replaceBBCode(content); // 然后再对xx之类的转成HTML
output.raw(content); // 最后HTML原样输出

4、所有的SQL使用命名参数传递,这样数据库自己会处理,不会有SQL注入的问题(同样的,你试图从用户的输入过滤掉SQL注入的关键字符,这就是个无底洞,永远也过滤不干净)。

 楼主| 找不到我 发表于 2011-9-1 12:08 | 显示全部楼层
赞同,
不过话说很多网站需要提供可视化编辑或者html编辑,bbcode不一定完全满足需求,
这个时候就可以使用我的hetaoblogxsshtmlfilter项目对输入的html做白名单验证


解决XSS的基本法则:
1、所有输出默认Encode,只有在确定不Encode的时候提供方法来进行Raw输出,这一点ASP.NET的Razor模板做得不错,默认是Encode的,需要的时候用@Html.Raw来输出非Encode的内容
2、不允许用户提交HTML,注意不是过滤用户提交的HTML,而是完全不允许用户提交任何的HTML。富文本用BBCode或者MarkDown来传输,这是典型的“白名单”策略,即使用“黑名单”过滤永远不可能100%,所以干脆全部过滤然后开“白名单”来给予有限的许可。
3、一但用户不能提交HTML,那就永远不会有“需要把用户提交的内容原样输出”这样的情况,富文本的输出也变得简单了:
[code=java]
String content = getContentFromDatabase();
content = htmlEncode(content); // 先不管三七二十一全部Encode
content = replaceBBCode(content); // 然后再对xx之类的转成HTML
output.raw(content); // 最后HTML原样输出

4、所有的SQL使用命名参数传递,这样数据库自己会处理,不会有SQL注入的问题(同样的,你试图从用户的输入过滤掉SQL注入的关键字符,这就是个无底洞,永远也过滤不干净)。


feiguo 发表于 2011-9-1 12:08 | 显示全部楼层
赞同,
不过话说很多网站需要提供可视化编辑或者html编辑,bbcode不一定完全满足需求,
这个时候就可以使用我的hetaoblogxsshtmlfilter项目对输入的html做白名单验证


如果我有决定权的话,我会扩展BBCode,而不是开放全部的HTML再过滤……BBCode和HTML长得还是很像的,扩展其实容易


无处不在 发表于 2011-9-1 12:08 | 显示全部楼层
赞同,
不过话说很多网站需要提供可视化编辑或者html编辑,bbcode不一定完全满足需求,
这个时候就可以使用我的hetaoblogxsshtmlfilter项目对输入的html做白名单验证


如果我有决定权的话,我会扩展BBCode,而不是开放全部的HTML再过滤……BBCode和HTML长得还是很像的,扩展其实容易


话说你后台怎么验证输入的是bbcode和合法内容?请求可以随便造,随便一个input都可以发送html过来
您需要登录后才可以回帖 登录 | 成为会员

本版积分规则

QQ|手机版|小黑屋|网站帮助|职业IT人-IT人生活圈 ( 粤ICP备12053935号-1 )|网站地图
本站文章版权归原发布者及原出处所有。内容为作者个人观点,并不代表本站赞同其观点和对其真实性负责,本站只提供参考并不构成任何投资及应用建议。本站是信息平台,网站上部分文章为转载,并不用于任何商业目的,我们已经尽可能的对作者和来源进行了通告,但是能力有限或疏忽造成漏登,请及时联系我们,我们将根据著作权人的要求立即更正或者删除有关内容。

GMT+8, 2024-5-7 13:11 , Processed in 0.120092 second(s), 24 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表