zoukankan      html  css  js  c++  java
  • 信息安全学习笔记--XSS

    一、XSS简介

      XSS (Cross Site Scripting)是一种经常出现在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被黑客用来编写危害性更大的phishing攻击而变得广为人知。对于跨站脚本攻击,黑客界共识是:跨站脚本攻击是新型的“缓冲区溢出攻击”,而JavaScript是新型的“ShellCode”。

    二、XSS分类

      第一种:反射型XSS

      反射型XSS是最简单的XSS,即输入XSS脚本或输入XSS脚本点击按钮即可完成XSS攻击,同时也称作非持久型XSS。漏洞主要存在于URL地址栏,搜索框等。

      第二种:存储型XSS

      存储型XSS主要是将用户输入的“数据”存储在服务器端,该类型的攻击比较稳定,只要用户访问该数据就会被攻击,所以存储型XSS也叫做持久型XSS。该类型的漏洞主要存在于发帖,回帖评论等模块,以及用户注册等模块。跨站脚本

      第三种:DOM Based XSS

      通过修改页面的DOM节点来进行XSS。

    三、XSS原理

      1.反射型XSS

      基本的检测脚本为“<script>alert(1)</script>”,或者为加上简单的HTML闭合语句如类似“><script>alert(1)</script><”的形式。

      主要存在漏洞的位置:

      (1)、URL地址栏

      如URL为“http://www.test.com/test.php?id=123”的形式,可能存在XSS,可以用加上检测语句如“<script>alert(1)</script>”、“><script>alert(1)</script><” 、“’><script>alert(1)</script><’”等来进行XSS检测。

      (2)、搜索框

      搜索框的检测方式同URL地址栏的检测方式基本一致,但是其中有一点不同就是如果需要闭合HTML标签时的语句有一些不一样。需要改变成类似“%'><script>alert(1)</script><'%'='”的语句,因为搜索框的闭合方式同一般的闭合有所差别。

      (3)、登录框

      登录框基本和URL地址栏是相同的,语句基本一致,如果不需要闭合标签则可直接输入“<script>alert(1)</script>”验证,如需要闭合标签则加上对应的闭合标签即可。

      2.存储型XSS

      存储型的XSS主要体现为论坛等地方,攻击者可以在论坛中发表包含有XSS代码的文章,用户一旦访问该文章就会遭受到攻击,所以这种攻击方式也被称为持久型攻击,存储型XSS的重点以及难点在于如何构造form表单,以及如何闭合form表单。

      简单的存储型XSS如在留言板中进行,如果不需要闭合标签,就可以直接用“<script>alert(1)</script>”这样的语句来进行验证,如果需要闭合,则可用类似“’><script>alert(1)</script><’”来进行验证。

      3.DOM Based XSS

      DOM Based XSS漏洞是基于文档对象模型Document Object Model,DOM)的一种漏洞。DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。DOM中有很多对象,其中一些是用户可以操纵的,如URI ,location等。客户端脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM Based XSS漏洞。

      DOM Based XSS攻击源于DOM相关的属性和方法,被插入用于XSS攻击的脚本。一个典型的例子如下:

      HTTP请求"http://www.test.com/hello.html?name=test"使用以下的脚本打印出登录用户test的名字,即

      <SCRIPT>

        var pos=docmnent.URL.indexOf(“name=”)+5;

        document.write(document.URL.substring(pos,document.URL.length));

      </SCRIPT>

      如果这个脚本用于请求http//www.test.com/hello.html?name=<script>alert(1)</script>时,就导致XSS攻击的发生。当用户点击这个链接,服务器返回包含上面脚本的HTML静态文本,用户浏览器把HTML文本解析成DOM,DOM中的document对象URL属性的值就是当前页而的URL。在脚本被解析时,这个URL属性值的一部分被写入HTML文本,而这部分HTML文本却是JavaScript脚本,这使得<script>alert(1)</script>成为页面最终显示的HTML文本,从而导致DOM Based XSS攻击发生。

     

    三、XSS防御

      1.启用HttpOnly

      启用HttpOnly并不能防止XSS,但可以有效的解决XSS攻击之后的cookie劫持问题。

      但是在Apache中支持的一个header是TRACE,可以绕过HttpOnly。

      2.输入检查

      常见的web漏洞如SQL注入,XSS都是攻击者构造一些特殊的字符,然后进行攻击,而这些字符正常用户是不会用到的。所以要对用户输入的数据进行过滤。比如注册时的电话,邮箱,生日等要有一定的规范。

      可以利用黑名单或白名单的方式。

      3.输出检查

      一般来说,除了富文本的输出之外,在变量输出到HTML页面之前,可以使用编码或转义的方式来防御XSS攻击。

      可以采用安全的编码函数、多种编码方式并存等方式来防御XSS。

      4.正确的预防XSS

      想要正确的预防XSS,必须要了解XSS的成因,造成XSS的罪魁祸首是变量,变量可以存在的场景有:在HTML标签中输出、在HTML属性中输出、在<script>标签中输出、在事件中输出、在CSS中输出、在地址中输出等。

      要严格检查这些地方的变量,以此来正确的预防XSS。

      5.处理富文本

      富文本主要是用户自定义的HTML代码,这种代码风险性比较高,处理富文本时,主要用到输入检查。而且在检查时应该使用白名单,避免使用黑名单。

      (通过学习和理解整理了关于XSS的知识,记录下来)

    原创作者 @龙刃(JDragons) 转载请注明出处 如有任何疑问请联系:JDragons@yeah.net
  • 相关阅读:
    Java实现构造无向图的欧拉回路( The Necklace)
    Java实现构造无向图的欧拉回路( The Necklace)
    Java实现构造无向图的欧拉回路( The Necklace)
    Java实现构造无向图的欧拉回路( The Necklace)
    Java实现构造无向图的欧拉回路( The Necklace)
    x64内联汇编调用API(需intel编译器,vc不支持x64内联汇编)
    屏蔽按CapsLock键切换到大写时,编辑框自动弹出的提示(UnregisterClass(TOOLTIPS_CLASS)后,重新设置WndProc并注意返回值)
    非常简单的利用CreateProcess注入DLL的方法
    Ring3下无驱动移除winlogon.exe进程ctrl+alt+del,win+u,win+l三个系统热键,非屏蔽热键(子类化SAS 窗口)
    设置windows2008系统缓存大小限制,解决服务器运行久了因物理内存耗尽出僵死(提升权限后,使用SetSystemFileCacheSize API函数,并将此做成了一个Service)
  • 原文地址:https://www.cnblogs.com/JDragons/p/4380971.html
Copyright © 2011-2022 走看看