• WebWall-03.XSS(跨站脚本漏洞)


    1.跨站脚本漏洞概述

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

    ​ XSS是一种发生在Web前端的漏洞,所以其危害的对象也主要是前端用户

    ​ XSS漏洞可以用来进行钓鱼攻击、前端js挖矿,用户cookie获取。甚至可以结合浏览器本身的漏洞对用户主机进行远程攻击

    在这里插入图片描述

    跨站脚本漏洞常见类型

    • 反射型

      交互数据一般不会被存在在数据库里,一次性,所见即所得,一般出现在查询类页面

    • 存储型

      交互数据会被存在在数据库里面,永久性存储,一般出现在留言板,注册等页面

    • DOM型

      不与后台服务器产生数据交互,是一种通过DOM操作前端代码输出的时候产生的问题,一次性也属于反射型

    xss漏洞形成原因

    ​ 形成xss漏洞的主要原因是程序对输入和输出的控制不够严格,导致“精心构造”的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。

    2.如何寻找存在跨站脚本漏洞

    1. 在目标站点上找到输入点,比如查询接口,留言板等;
    2. 输入一组“特殊字符+唯一识别字符”,点击提交后,查看返回的源码,是否有做对应的处理;
    3. 通过搜索定位到唯一字符,结合唯一字符前后语法确认是否可以构造执行js的条件(构造闭合)
    4. 提交构造的脚本代码(以及各种绕过姿势),看是否可以成功执行,如果成功执行则说明存在XSS漏洞

    注意:

    • 一般查询接口容易出现反射性XSS,留言板和评论容易出现存储型XSS;
    • 由于后台可能存在过滤措施,构造的script可能会被过滤掉,而无法生效,或者环境限制了执行(浏览器);
    • 通过变化不同的script,尝试绕过后台过滤机制;

    3.攻击实验

    反射性xss攻击

    首先在输入框输入“‘kaikai<>”,在下面会把输入的信息不做处理的输出出来。

    在这里插入图片描述

    在这里输入的时候我们可以看见字符的限制,但是前端的限制是不靠谱的,我们可以通过前端的开发者工具修改限制

    在这里插入图片描述

    我们把这里的值修改为200,然后在这里输入

    界面就会有弹窗显示

    在这里插入图片描述

    GET和POST请求的区别:

    ​ GET是以url方式提交数据

    ​ POST是以表单方式在请求体里面提交

    GET方式的XSS漏洞更加容易被利用,一般利用的方式是将带有跨站脚本的URL伪装后发送给目标

    POST方式由于是以表单方式提交,无法直接使用URL方式进行攻击

    存储型xss攻击

    在留言板可以填写"<>"kaikai

    在源代码可以看出来是没有经过处理

    在这里插入图片描述

    可以输入之后每次进入这个界面都会弹出这个界面

    在这里插入图片描述

    DOM型xss攻击

    Dom的类型

    在这里插入图片描述

    通过JavaScript,可以重构整个HTML文档,你可以通过添加、移除、改变或重排页面上的项目。DOM可以理解为一个一个访问HTML的标准编程接口。

    首先通过看前端源码

    <script>
        function domxss(){
        	var str = document.getElementById("text").value;
        	document.getElementById("dom").innerHTML = "what do you see?";
    					}
    </script>
    <!--<a href="" onclick=('xss')>-->
    <input id="text" name="text" type="text"  value="" />
    <input id="button" type="button" value="click me!" onclick="domxss()" />
    <div id="dom"></div>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    这里输入的数据会触发 js 里面的domxss() ,domxss函数会获取输入的数据然后补充到

    what do you see? 里面的+str+部分,然后显示在div中间

    这样就给我们机会了,我们可以闭合

    #' onclick="alert('xss')">

    #' onclick='alert("xss")

    然后点击生成的链接就可以弹出 弹窗

    在这里插入图片描述

    DOM型xss-x

    在DOM漏洞利用情况下,有的访问是通过URL进行请求的,可以通过伪装url诱导用户进行访问,触发危险的js

    4.xss进行案例攻击

    再进行这个测试之前,需要打开xss的管理页面

    在这里插入图片描述

    按照要求进行初始化,登录

    在这里插入图片描述

    cookie获取

    • get方式

    在xss漏洞输入

    可以在后台获取到cookie

    在这里插入图片描述

    然后就可以通过cookie进行操作了

    • post方式

    在这里插入图片描述

    通过伪装的页面进行post请求

    做这个测试之前,必须先登录

    在这里插入图片描述

    伪装界面源码为,把这个界面发送给用户

    
    
    
    	
    
    
    	
    //这里的url是漏洞的页面 //这里是xss管理后台
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16

    在这里插入图片描述

    获取到cookie,账户,密码

    xss钓鱼攻击

    这个在phpstudy部署的情况下面是无法实现的,原因是完成下面的条件是php必须以模块方式运行,但是这里的phpstudy使用的是CGI协议模式,所以无法获取用户名与密码。按照下面的文章就可以实现这个功能。

    Pikachu漏洞靶场系列之XSS钓鱼攻击后续 - 腾讯云开发者社区-腾讯云 (tencent.com)

    在这里插入图片描述

    攻击者伪装正常界面,用户把账户密码等重要信息输入,被发送伪装站点在存储的xss的漏洞的地方,可以填写

    理论上,用户填写之后,会把账户密码发送给后台的xss管理站点

    在这里插入图片描述

    键盘记录

    需要修改代码中的地址

    在这里插入图片描述

    键盘的操作已经被发送到后台了

    在这里插入图片描述

    在这里插入图片描述

    拓展

    xss盲打

    在一些环境下,我们不知道自己的信息是否被提取,我们可以通过把攻击的js直接进行提交,如果对方没有对存入的数据进行处理,那么在管理员登陆管理员界面的时候就可以盗取管理员的cookie或者账户密码。

    可以在提交界面输入入侵的js代码

    登陆管理员账户,可以在管理员后台获取管理员cookie和信息

    这里使用我们上面的cookie获取

    在这里插入图片描述

    现在登录留言板的后台

    http://127.0.0.1/pikachu/vul/xss/xssblind/admin_login.php

    点击登录之后,cooke就会不上发送到后台了

    在这里插入图片描述

    xss绕过

    转换

    • 前端限制绕过;直接抓包重放,或者修改html前端代码
    • 大小写;
    • 拼凑;pt>alert(111)pt>
    • 使用注释进行干扰;pt>alert(111)ript>

    编码/使用html编码

    可以把alert('xss')进行html编码

    htmlspecialchars

    htmlspecialchars()函数把预定义的字符转换我HTML实体

    &:转换为&
    ":转换为"
    ':转换为成为 '
    <:转换为<
    >:转换为>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    ENT_COMPAT:默认。仅编码双引号。

    ENT_QUOTES:编码双引号和单引号。

    ENT_NOQUOTES:不编码任何引号。

    href输入

    由于标签可以

    文本

    可以在输入 javascript:alert(111)这样就没有编码问题

    解决措施:

    ​ 在输入标签内容的时候,只允许其通过http,https的协议内容

    js输出

    <script>
        $ms='111';
        if($ms.length != 0){
            if($ms == 'tmac'){
                $('#fromjs').text('tmac确实厉害,看那小眼神..')
            }else {
    //            alert($ms);
                $('#fromjs').text('无论如何不要放弃心中所爱..')
            }
    
        }
    </script>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    把数据放入到$ms=‘tesx’;中间,但是可以在构造闭合。

    $ms='x'';

    我们输入的部分是x'

    解决措施:

    ​ js的输出点应该使用\的特殊字符进行转义

    防范措施

    输入做过滤,输出做转义

    过滤:只允许输入指定的格式的东西

    转义:所有的输出到前端都进行编码

  • 相关阅读:
    java基础(冒泡排序)精简
    【大模型】自动化问答生成:使用GPT-3.5将文档转化为问答对
    从事嵌入式工作有哪些优势?
    anaconda,python,VSCode
    10种流行的机器学习算法进行泰坦尼克幸存者分析
    攻防世界-WEB-ics-05
    【DFIR】蘇小沐的微信公众号
    Docker搭建RK3568开发环境
    RabbitMQ消息确认机制
    国考省考行测:主旨题结构分析法,总分,分总,分分,分总分,总分总,主旨题错误选项的设置规律
  • 原文地址:https://blog.csdn.net/a13554371686/article/details/126517587