题目提示这个可以爆,访问靶机地址发现是一个类似网站程序安装配置数据库的地址,输入默认的 localhost/3306/ctf/root/123456 和把密码修改成 root 都提示 数据库连接失败,就在我想找个密码字典来爆破一下的时候突然发现五个文本框都空着什么都不填点击 确认无误,开始安装 居然提示数据库连接成功,但是在 Edge 浏览器开发人员工具的网络选项卡中看不到对 checkdb.php 和 install.php 的两个请求的预览和响应,于是复制 checkdb.php 的请求 URL 和负载 a=&p=&d=&u=&pass= 使用 HackBar 发送请求居然就获得了 flag ctfshow{545ffbc5-7abf-4aea-bf07-a9935ac2b98d},这应该是一个 bug 或者说非预期做法,因为题目的 Hint 提示说使用Chrome浏览器抓包,进行暴力破解密码,使用 Chrome 测试也是一样的表现,使用 Firefox 发现向 checkdb.php 发送的请求显示 NS_BINDING_ABORTED,也不知道是什么原因,图片下面是 Gemini 3.6 Flash 的回答

Image

Image

根据你贴出的前端 HTML/JS 源码,真相完全大白了!

前端代码有两个非常典型的设计漏洞/BUG,正好完美解释了你遇到的所有现象:


原因一:为什么网络请求提示 NS_BINDING_ABORTED / 看不到响应?

看按钮和 <form> 的写法:

<form action="">
    ...
    <div class="pc-kk-form-btn">
        <button onclick="check();">确认无误,开始安装</button>
    </div>
</form>
  1. <button> 标签在 <form> 内部如果没有显式指定 type="button",默认类型就是 type="submit"。
  2. 当你点击按钮时,优先触发了 onclick="check()" 发起 AJAX 异步请求去连接 checkdb.php;
  3. 但因为 JS 函数 check() 里没有阻止默认表单提交行为(既没有写 return false;,也没有在事件对象上调用 e.preventDefault()),导致浏览器在发起 AJAX 的同一毫秒,立刻触发了 <form action=""> 的默认提交,直接刷新了当前页面!
  4. 页面一刷新,前面刚发出的 checkdb.php 异步请求就被浏览器强制打断(Abort)了:

原因二:为什么全部留空反而成功拿到 Flag?

看 AJAX 提取输入框值的写法:

data:{
    'a':$('#a').val(),
    'p':$('#p').val(),
    'd':$('#d').val(),
    'u':$('#u').val(),
    'pass':$('#pass').val()
}
$host = $_POST['a'] ? $_POST['a'] : '127.0.0.1'; // 发现为空,直接回退使用正确的默认配置!
$port = $_POST['p'] ? $_POST['p'] : '3306';
// ...

或者 PHP 的 mysqli_connect("", "", "", "") 传空时,底层会直接回退使用本地配置连接,导致鉴权被意外绕过,直接判定数据库连接成功并返回了包含 Flag 的 JSON。


总结

  1. 浏览器里失败:因为 <button> 触发了表单刷新,把 AJAX 请求给夭折(Abort)掉了;
  2. HackBar 成功:HackBar 避开了前端这个会触发页面刷新的坑按钮,直接向 checkdb.php 发送了空参数 POST 请求,正好触发了后端的空参数回退漏洞,成功拿到 Flag!