zoukankan      html  css  js  c++  java
  • (五)跨站脚本攻击

    01 漏洞描述

    当应用程序没有验证输入数据并产生输出时,这个时候就会产生XSS漏洞,攻击者可利用此漏洞进行Cookie窃取、会话劫持、钓鱼等攻击。

    “一切输入都是不安全的”,Web应用的漏洞几乎都是由一个原因造成:不能在使用前正确验证输入的数据。XSS便是其中之一,攻击者可以在网页中写入恶意脚本,用户访问或点击的时候就会被执行。通常是由JavaScript编写,偶尔也会使用ActionScript、VBScript。XSS能利用到何种程度,取决于如何编写脚本,当然,和上下文环境也有关系。

    02 漏洞检测

    要判断系统是否存在XSS,只需要测试能否操纵应用程序参数输入,使其产生恶意输出即可,因此XSS漏洞的检测,有三大要点:输入点,输出点,以及恶意输出。

    输入点,数据输入的参数位置。客户端与服务器端的交互,是通过请求和响应实现的,请求的时候往往会附带一些参数,这些参数就是数据的输入点,我们需要修改这些参数的值来影响服务器端的响应,并根据响应找出输出点。

    输出点,输入数据的输出位置。有些数据输入后,经过服务器处理,往往会返回给客户端,可能出现在html标签中,也可能出现在script脚本中,我们需要根据位置的不同而使用不同的XSS构造方式。

    恶意输出,在XSS中通常是指由JavaScript编写的代码。这些代码能实现一定功能和页面效果:弹框、发送Cookie、键盘记录等。

    寻找输入点

     

    页面有两个输入框,要求输入名字和姓氏,然后点击GO,姓名就会显示在下方。我们现在来检测这个功能是否存在XSS。

    开启抓包工具,设置好代理,输入名字和姓氏。

     

    点击GO,抓到如下请求包。请求行中有三个参数,其中两个参数正好对应两个输入框,这三个参数都是潜在的XSS输入点,特别是输入框对应的firstname参数和lastname参数。

     
     

    寻找输出点

    输出点我们可以通过在响应中查找输入点的值来找到。以firstname为例,我们在响应中查找bwapp这个值的位置。

     
     

    发现响应中有8个匹配的值,难道有8个输出点?很多时候,为了更快速、准确的找出输出点,我们通常会将输入点的值修改为独一无二的值,如1234567,abcde等,以保证不会和系统其他参数值雷同。

     
     

    这样就准确找到了firstname这个输入点的输出点。

    恶意输出

    最终XSS的检测需要结合输入点和输出点。在输入点的值中加入恶意代码,查看输出点是否会产生恶意输出。

     <script>alert(1)<script>
     

     
     

    发现服务端没有对用户输入做任何处理就直接输出到页面上,弹出一个警告框。这就证明firstname参数存在XSS。依此流程检测,发现lastname同样存在XSS,但form参数不存在XSS。

    03 漏洞修复

    输入过滤;对用户的输入进行检测,过滤掉输入中的非法字符。

    输出编码;在将输入输出到页面之前,将输入中未过滤的特殊字符进行转义,使其以文本形式展示,而不是被解析成页面结构或脚本。



    作者:安全小白团
    链接:https://www.jianshu.com/p/79a73c38784a
    来源:简书
    简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

  • 相关阅读:
    ELK扫盲及搭建
    重构支付接口(二)重构方案
    重构支付接口(一)支付接口存在的问题
    redis的持久化(RDB与AOF)
    死锁、活锁、性能问题
    Android控件_RecycleView+CarView+Palette联合应用
    窗体间传值 ,子窗体传给父窗体
    【Android-自定义控件】 漂亮的Toast
    【Android-关闭所有Activity】关闭activity之前的所有activity,重启actibity
    【Android-自定义控件】SwipeRefreshDemo 下拉刷新,上拉加载
  • 原文地址:https://www.cnblogs.com/uestc2007/p/11009232.html
Copyright © 2011-2022 走看看