非持久型xss攻击:非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的连接,用户访问该连接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。javascript
持久型xss攻击:持久型xss,会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在。html
反射型、存储型、DOM型java
经常使用测试代码:跨域
onmouseover="alert(xss);" <script>alert(xss);</script> <a href="javascript:alert(xss);">xss</a> <img onerror="alert(xss);" src=>
主要原理:闭合标签,构造恶意代码浏览器
输入用户可构造,好比搜索框,评论留言区,注册名字,联系方式等,同时页面里常常会有hidden属性的input,这时直接burp抓包改就能够了,隐藏属性很差点击,可用如下代码 不一样浏览器实现的快捷键方式不一样,而且可能和其它快捷方式冲突服务器
accesskey="X" onclick="alert(xss)"
dom
DOM XSS是在浏览器的解析中改变页面DOM树,且恶意代码并不在返回页面源码中回显xss
页面跳转经过JS跳转,使用location.href、location.replace()、location.assign(),能够经过javascript伪协议执行JS脚本函数
Location |
当前网页的URL地址 |
window.name |
当前网页 tab 的名字,它被不一样的网站赋值,也就是说这个网页为window.name 赋值后再跳转到其它网站,window.name 的值依然不变 |
document.title |
是当前网页的标题,能够在搜索框输入控制它的内容 |
document.referer |
表示来路,表示从哪一个网页URL访问过来的 |
postMessage |
是HTML5 的一种跨域机制,但不少时候开发者没有正确的作来源检测,会致使 DOM XSS 的发生 |
location |
它触发 JS 一般是以跳转到 JS URI 的方式执行 |
eval |
是JS 内置的动态JS执行器 |
innerHTML |
能为一个网页元素赋值 |
document.write |
能够输出一个页面流 |
Function |
能经过函数生成一个函数,能够传入动态JS代码 |
setTimeout |
会延时执行JS代码 |
setInterval |
表示循环执行 JS 代码 |
有时网站对输入字符进行了过滤,此时能够经过编码来进行绕过
原理:URL 请求时会对百分号等 URL 的编码方式进行转码;浏览器接收到页面数据后,会对 HTML 实体编码进行转码;执行 JS 时会对 JSUnicode 等 JS 支持的方式进行转码。post
url编码 %+16进制数字 https://www.w3school.com.cn/tags/html_ref_urlencode.html url base64编码 data:text/html;base64,PHNjcmlwdD5hbGVydCgveHNzLyk7PC9zY3JpcHQ+ html编码 '&' + '约定名称' + ';' 的形式,其实还有 '&#' + '十进制数字' + ';' 和 '&#x' + '十六进制数字' + ';' 十进制和十六进制后面的;能够省略 JS Unicode 编码 规则是 '\u' + '四位十六进制数字' jsfuck https://www.bugku.com/tools/jsfuck/
在script标签钟插入一个空格或者是tab <script >alert(1)</script> <script >alert(1)</script> 也能够对tab,换行,回车进行编码来绕过 <script	>alert(1)</script> <script
>alert(1)</script> <script
>alert(1)</script> 对标签进行大小写 <ScRipT>alert(1)</sCriPt> 插入null字节,在xss payload的任何地方插入null字节,有时候能够绕过filter <%00script>alert(1)</script> <script>al%00ert(1)</script>
对于ie版本小于10的 html属性支持反引号` 可用其来闭合双引号,从而绕过htmlspecialchars()