• Web系统常见安全漏洞介绍及解决方案-XSS攻击


    XSS简介

    跨站脚本攻击(Cross Site Script),为了和众所周知的样式表CSS进行区分,它在安全领域简称XSS。xss攻击是由于Web应用程序对用户的输入过滤不足而产生的。攻击者利用网站漏洞把恶意的脚本代码注入到网页之中,当其他用户浏览这些网页时,就会执行其中的恶意代码,对受害用户可能采取 Cookie资料窃取、会话劫持、钓鱼欺骗等各种攻击。在一开始,这种攻击的案例通常是跨域的,所以叫做跨站脚本攻击。但是发展到今天,由于JavaScript的强大功能以及网站前端应用的复杂化,是否跨域已经不再重要,但是由于历史原因,XSS这个名字一直保留下来。
    具体攻击方法和防护方案本文后面会有介绍。目前所有知名不知名的网站,凡是我们能看到的,基本都做了xss漏洞防御,下面这个图是我在一个小网站的搜索框输入<script>alert(1)</script> 之后得到的提示信息。如果想自己测试具体攻击过程,可以搭建一个dvwa靶场,DVWA是由PHP代码开发的,所以需要先搭建PHP运行环境,如wampserver或者PhpStudy等,感兴趣的朋友可以尝试一下,非安全专业同学可以仅作了解。
    在这里插入图片描述

    XSS分类介绍

    xss根据效果的不同可以分为以下几类:

    • 反射型XSS
      反射性XSS只是简单的把用户输入的数据“反射”给浏览器,也就是说,攻击者需要诱导用户点击一个恶意链接,才能攻击成功。反射性XSS也叫做“非持久型XSS”.
    • 存储型XSS
      存储型XSS会把用户输入的数据“存储”在服务器端,所以这种攻击也叫做“持久型XSS”。比较常见的一个场景是,黑客写下一篇含有恶意JavaScript代码的博客文章,文章发表后,所有访问该文章的用户都会在他们的浏览器中执行这段恶意代码。
    • Dom Based XSS
      通过修改页面的DOM节点形成的XSS攻击,成为Dom Based XSS,从效果上来说它也是反射型XSS,单独划分出来是因为这种攻击的形成原因比较特别,发现它的安全专家提出了这个概念,由于历史原因这个分类也保留了下来。
      举个例子,这里有个简单的html页面:
    <div id="divid"></div>
    <input type="text" id="text" value="" />
    <input type="button" id="s" value="save" onclick="test()"/>
    
    <script>
    function test(){
    	var str = document.getElementById("text").value;
    	document.getElementById("divid").innerHTML="a href='"+str+"' >testLink</a>";
    }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    点击"save"按钮后会在当前页面插入一个超链接,跳转地址为当前用户输入的内容。在这里,通过innerHTML把一段用户输入数据当作HTML写入到页面中,这就造成了Dom Based XSS。
    假设构造这样的数据' onclick=alert(1) // 输入后页面代码就变成了:

    <a href='' onclick=alert(1) //'>testLink</a>
    
    • 1

    首先用一个单引号闭合掉href的第一个单引号,然后插入一个onclick事件,最后再注释掉第二个单引号,点击这个新生成的链接,alert脚本将被执行。。。

    XSS 的威力和危害

    XSS 攻击成功后,攻击者能够对用户当前浏览器的页面植入恶意脚本控制用户的浏览器,这些用以完成具体功能的恶意脚本,被称为XSS Payload. XSS Payload实际上就是Javascript脚本(也可以是Flash等),所以任何JavaScript脚本能实现的功能,XSS Payload都能做到,比如读取浏览器的Cookie对象发起“Cookie劫持”攻击,后端开发应该经常见这样的场景,我们登录系统后通过F12查看当前访问网页的Cookie,然后在POSTMAN或者其他接口测试工具中输入当前的Cookie参数,就可以在不登陆系统的情况下测试系统接口的返回数据,本地测试自己开发的系统肯定没问题,但是如果让攻击者劫持到Cookie信息后果还是很可怕的。
    XSS可能造成的危害还包括:

    1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
    2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
    3. 盗窃企业重要的具有商业价值的资料
    4. 非法转账
    5. 强制发送电子邮件
    6. 网站挂马
    7. 控制受害者机器向其它网站发起攻击

    XSS防御措施

    HttpOnly

    严格来说,HttpOnly并非是为了对抗XSS-HttpOnly解决的是XSS后的Cookie劫持攻击。前面说了XSS可能会窃取用户的Cookie,然后就直接登录了该用户的账户,但是如果Cookie设置了HttpOnly,则这种攻击会失败,因为JavaScript读取不到Cookie的值。
    一个Cokie的使用过程如下:

    1. 浏览器向服务器发起请求,这时候没有Cookie.
    2. 服务端返回时发送Set-Cookie头,向客户端浏览器写入Cookie.
    3. 在该Cookie到期前,浏览器访问该域下的所有页面时都会发送该Cookie.

    HttpOnly就是在Set-Cookie时标记的:

    Set-Cookie:<name>=<value>
    [;<Max-Age>=<age>]
    [;expires=<date>]
    [;domain=<domain-name>]
    [;path=<path-name>]
    [;secure]
    [;HttpOnly]
    // 不同语言在Cookie中添加HttpOnly的写法可能不同
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    输入检查

    常见的web漏洞如XSS/SQL Injection等,都要求攻击者构造一些特殊字符,这些特殊字符可能是正常用户不会用到的,所以在设计网站的时候对用户提交的内容进行严格的过滤非常有必要
    输入检查,在很多时候也被用于格式检查。例如用户在网站注册时填写的用户名,会被要求只能为字母、数字的组合等,电话号码应该是不长于16位的数字。检查校验的逻辑必须放在服务器端的代码中实现,如果只是存在于客户端用js进行输入检查,很容易被攻击者绕过。

    输出检查

    • 使用安全的编码函数 在变量输出到HTML页面时,可以使用编码或转义的方式防御XSS攻击,如escapeJavascript()函数
    • 处理富文本 用户提交的富文本呢数据,其语义时完整的HTML代码,在标签的选择、css样式等方面都要特殊处理,一般前端的框架已经集成了公共的处理方法。

    小结

    XSS漏洞理论上看着好像比较复杂,但却是可以彻底解决的。从风险的角度看,用户之间有互动的页面受攻击的可能性会更大,安全人员需要吮乳理解XSS攻击的原理,根据不同页面的危险高低,在设计方案的时候针对不同场景使用不同的方法。

  • 相关阅读:
    JNI相关总结
    angr原理与实践(二)—— 各类图的生成(CFG CG ACFG DDG等)
    【嵌入式面试题】常见面试题梳理二
    【技术积累】Vue.js中的核心知识【二】
    MTK8183/MT8183安卓4G核心板_联发科安卓手机开发板主板方案定制
    ISCSI - 磁盘管理
    【C#】生成WebAPI实现简单调用本地数据库
    简化MRO工业品供采交易路径,S2B2B商城助力企业构建业务一体化管理优势
    蓝牙学习三(GAP)
    c#中字段和属性的区别,委托和事件的区别
  • 原文地址:https://blog.csdn.net/qq_42887496/article/details/125564111