题目提示这个可以爆,访问靶机地址发现是一个类似网站程序安装配置数据库的地址,输入默认的 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 的回答
根据你贴出的前端 HTML/JS 源码,真相完全大白了!
前端代码有两个非常典型的设计漏洞/BUG,正好完美解释了你遇到的所有现象:
原因一:为什么网络请求提示 NS_BINDING_ABORTED / 看不到响应?
看按钮和 <form> 的写法:
<form action="">
...
<div class="pc-kk-form-btn">
<button onclick="check();">确认无误,开始安装</button>
</div>
</form><button>标签在<form>内部如果没有显式指定type="button",默认类型就是type="submit"。- 当你点击按钮时,优先触发了
onclick="check()"发起 AJAX 异步请求去连接checkdb.php; - 但因为 JS 函数
check()里没有阻止默认表单提交行为(既没有写return false;,也没有在事件对象上调用e.preventDefault()),导致浏览器在发起 AJAX 的同一毫秒,立刻触发了<form action="">的默认提交,直接刷新了当前页面! - 页面一刷新,前面刚发出的
checkdb.php异步请求就被浏览器强制打断(Abort)了:
- 在 Firefox 中明确标记报错为
NS_BINDING_ABORTED; - 在 Chrome/Edge 中导致开发者工具未成功记录/展示完整的 Response 内容(或者提示
net::ERR_ABORTED)。
原因二:为什么全部留空反而成功拿到 Flag?
看 AJAX 提取输入框值的写法:
data:{
'a':$('#a').val(),
'p':$('#p').val(),
'd':$('#d').val(),
'u':$('#u').val(),
'pass':$('#pass').val()
}- HTML 中只是 placeholder(占位文字):
输入框里显示的localhost、3306、ctf等都是placeholder="..."提示词,并不是 input 的默认 value! - **如果不手动输入,
$('#a').val()拿到的全是空字符串""**:
当你完全不填直接点提交时,发给后端的实际 POST 负载就是:a=&p=&d=&u=&pass=。 - 后端 PHP 撞上了默认配置逻辑:
后端的checkdb.php在接收到这五个空参数时,可能使用了类似下面的逻辑:
$host = $_POST['a'] ? $_POST['a'] : '127.0.0.1'; // 发现为空,直接回退使用正确的默认配置!
$port = $_POST['p'] ? $_POST['p'] : '3306';
// ...或者 PHP 的 mysqli_connect("", "", "", "") 传空时,底层会直接回退使用本地配置连接,导致鉴权被意外绕过,直接判定数据库连接成功并返回了包含 Flag 的 JSON。
总结
- 浏览器里失败:因为
<button>触发了表单刷新,把 AJAX 请求给夭折(Abort)掉了; - HackBar 成功:HackBar 避开了前端这个会触发页面刷新的坑按钮,直接向
checkdb.php发送了空参数 POST 请求,正好触发了后端的空参数回退漏洞,成功拿到 Flag!