java 最新Xss攻击与防护(全方位360°详解)
前沿
XSS防范属于前端还是后端的责任?
XSS防范是后端RD(研发人员)的责任,后端RD应该在所有用户提交数据的接口,对敏感字符进行转义,才能进行下一步操作。
所有要插入到页面上的数据,都要通过一个敏感字符过滤函数的转义,过滤掉通用的敏感字符后,就可以插入到页面中。
公司的搜索页面如果你是下面的写法。那么他可能存在Xss注入
"> 您搜索的关键词是:<%=getParameter("keyword")%>
1.什么是xss攻击?
Xss即(CrossSiteScripting)中文名称为:跨站脚本攻击。XSS的重点不在于跨站点,而在于脚本的执行。
1.1原理
恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。而由于直接在用户的终端执行,恶意代码能够直接获取用户的信息,或者利用这些信息冒充用户向网站发起攻击者定义的请求。
1.2分类
Xss攻击最主要有如下分类:反射型Xss(非持久型)、存储型Xss(持久型)和DOMXss。
1.2.1反射型Xss(了解)
原理
反射性xss一般指攻击者通过特定的方式来诱惑受害者去访问一个包含恶意代码的URL。当受害者点击恶意链接url的时候,恶意代码会直接在受害者的主机上的浏览器执行。
步骤
- 攻击者在url后面的参数中加入恶意攻击代码。
- 当用户打开带有恶意代码的URL的时候,网站服务端将恶意代码从URL中取出,拼接在html中并且返回给浏览器端。
- 用户浏览器接收到响应后执行解析,其中的恶意代码也会被执行到。
- 攻击者通过恶意代码来窃取到用户数据并发送到攻击者的网站。攻击者会获取到比如cookie等信息,然后使用该信息来冒充合法用户的行为,调用目标网站接口执行攻击等操作。
演示
csrf攻击 xxs攻击 testcookie攻击
//第一个链接可以弹出指定的弹窗 router.get('/xss',(ctx,next)=>{ ctx.body=''; }); //获取当前的所有cookie router.get('/testcookie',(ctx,next)=>{ console.log(ctx.cookies.get('connect.sid')); ctx.body=''; next(); });
1.2.2存储型Xss(了解)
原理
主要是将恶意代码上传或存储到服务器中,下次只要受害者浏览包含此恶意代码的页面就会执行恶意代码。
场景
比如我现在做了一个博客网站,然后攻击者在上面发布了一篇文章,内容是如下:如果我没有对该文章进行任何处理的话,直接存入到数据库中,那么下一次当其他用户访问该文章的时候,服务器会从数据库中读取后然后响应给客户端,那么浏览器就会执行这段脚本,然后攻击者就会获取到用户的cookie,然后会把cookie发送到攻击者的服务器上了。
步骤
- 攻击者将恶意代码提交到目标网站数据库中。
- 用户打开目标网站时,网站服务器将恶意代码从数据库中取出,然后拼接到html中返回给浏览器中。
- 用户浏览器接收到响应后解析执行,那么其中的恶意代码也会被执行。
- 那么恶意代码执行后,就能获取到用户数据,比如上面的cookie等信息,那么把该cookie发送到攻击者网站中,那么攻击者拿到该
cookie然后会冒充该用户的行为,调用目标网站接口等违法操作。
1.2.3DOM-based型Xss(了解)
原理
我们客户端的js可以对页面dom节点进行动态的操作,比如插入、修改页面的内容。比如说客户端从URL中提取数据并且在本地执行、如果用户在客户端输入的数据包含了恶意的js脚本的话,但是这些脚本又没有做任何过滤处理的话,那么我们的应用程序就有可能受到DOM-basedXss的攻击。
步骤
- 攻击者构造出特殊的URL、在其中可能包含恶意代码。
- 用户打开带有恶意代码的URL。
- 用户浏览器收到响应后解析执行。前端使用js取出url中的恶意代码并执行。
- 执行时,恶意代码窃取用户数据并发送到攻击者的网站中,那么攻击者网站拿到这些数据去冒充用户的行为操作。调用目标网站接口
执行攻击者一些操作。
攻击代码
- 使用document.write直接输出导致浏览器解析恶意代码
- 使用innerHTML直接输出导致浏览器解析恶意代码
- 使用location/location.href/location.replace/iframe.src造成的XSS
vars=location.search;//返回URL中的查询部分(?之后的内容) //为了方便演示,我们假如url是如下这样的 //http://127.0.0.1/xsstest.html?url=javascript:alert('xsstest'); //然后我们的是s的值就为如下: s="?url=javascript:alert('xsstest')"; s=s.substring(1,s.length);//返回整个查询内容 varurl="";//定义变量url if(s.indexOf("url=")>-1){//判断URL是否为空 varpos=s.indexOf("url=")+4;//过滤掉"url="字符 url=s.substring(pos,s.length);//得到地址栏里的url参数 }else{ url="url参数为空"; } document.write('url: "'+url+'"');
2.Xss有什么危害?
2.1劫持访问
劫持访问就是在恶意脚本中插入诸如的代码,那么页面就会跳转到百度首页.像http://qq.com这样的域名下出现...,那么在发送钓鱼链接时就可以通过http://qq.com等域名进行跳转,一般人一看到http://qq.com之类的域名警惕性会下降,也就更容易上当了。
2.2盗用cookie实现无密码登录
由于盗取的cookie需要传回给攻击者,因此往往需要一个服务器来接收盗取的cookie。
2.3配合csrf攻击完成恶意请求
Csrf攻击就是在未经你许可的情况下用你的名义发送恶意请求(比如修改密码,银行转账等)
2.4其他危害
DOS(拒绝服务)客户端浏览器。
挂马
劫持用户Web行为,甚至进一步渗透内网。
删除目标文章、恶意篡改数据、嫁祸。
蠕虫式挂马攻击、刷广告、刷浏量、破坏网上数据
蠕虫式的DDoS攻击。
3.防范手段
3.1两大要素
XSS攻击有两大要素:
- 攻击者提交恶意代码(输入过滤)。
- 浏览器执行恶意代码。
xss攻击要能达成往往需要较长的字符串,因此对于一些可以预期的输入可以通过限制长度强制截断来进行防御。
3.2预防方案
3.2.1输入过滤
- 对输入的内容诸如,服务端会解析出请求参数keyword,得到">,拼接到HTML中返回给浏览器,页面就出现如下内容,alert会弹出两次。
"> 您搜索的关键词是:">2.Xss的转义攻击
"> 您搜索的关键词是:<%=escapeHTML(getParameter("keyword"))%>escapeHTML()按照如下规则进行转义:|字符|转义后的字符||-|-||&|&||<|<||>|>||"|"||'|'||/|/|
经过了转义函数的处理后,最终浏览器接收到的响应为:
您搜索的关键词是:"><script>alert('XSS');</script>小结论
- 通常页面中包含的用户输入内容都在固定的容器或者属性内,以文本的形式展示。
- 攻击者利用这些页面的用户输入片段,拼接特殊格式的字符串,突破原有位置的限制,形成了代码片段。
- 攻击者通过在目标网站上注入脚本,使之在用户的浏览器上运行,从而引发潜在风险。
- 通过HTML转义,可以防止XSS攻击。。
3.Xss过滤攻击
当请求为:http://xxx/?redirect_to=javascript:alert('XSS')时
">跳转... 当攻击URL为http://xxx/?redirect_to=javascript:alert('XSS'),服务端响应就成了:
跳转... 虽然代码不会立即执行,但一旦用户点击a标签时,浏览器会就会弹出“XSS”。
解决方案过滤
//禁止URL以"javascript:"开头 xss=getParameter("redirect_to").startsWith('javascript:'); if(!xss){
"> 跳转... }else{ 跳转... } 4.Xss的大小写攻击
当请求为:http://xxx/?redirect_to=%20javascript:alert('XSS')时%20javascript:alert('XSS')经过URL解析后变成javascript:alert('XSS'),这个字符串以空格开头。这样攻击者可以绕过后端的关键词规则,又成功的完成了注入。
解决方案白名单
//根据项目情况进行过滤,禁止掉"javascript:"链接、非法scheme等 allowSchemes=["http","https"]; valid=isValid(getParameter("redirect_to"),allowSchemes); if(valid){
"> 跳转... }else{ 跳转... } 大结论
- 在HTML中内嵌的文本中,恶意内容以script标签形成注入。
- 在内联的JavaScript中,拼接的数据突破了原本的限制(字符串,变量,方法名等)。
- 在标签属性中,恶意内容包含引号,从而突破属性值的限制,注入其他属性或者标签。
- 在标签的href、src等属性中,包含javascript:等可执行代码。
- 在onload、onerror、onclick等事件中,注入不受控制代码。
- 在style属性和标签中,包含类似background-image:url("javascript:...");的代码(新版本浏览器已经可以防范)。
- 在style属性和标签中,包含类似expression(...)的CSS表达式代码(新版本浏览器已经可以防范)。
总之,如果开发者没有将用户输入的文本进行合适的过滤,就贸然插入到HTML中,这很容易造成注入漏洞。攻击者可以利用漏洞,构造出恶意的代码指令,进而利用恶意代码危害数据安全。
6.附常见的XSS攻击方法
JavaScript注入
IMG标签XSS
IMG标签无分号无引号
HTML编码(必须有分号)
换码过滤的JavaScript
\";alert('XSS');//
结束Title标签
Iframe
DIVbackground-image
节省[http:]
XSS 到此这篇关于java最新Xss攻击与防护(全方位360°详解)的文章就介绍到这了,更多相关javaXss攻击防护内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!