2026isg观安杯-ezrealworld
原创
識.
識.
0xNyx
2026年8月19日 21:01
安徽
在小说阅读器读本章
去阅读
访问靶机
dirsearch扫一下目录
很明显存在adminer用户,尝试登录admin账户失败,弱口令无效
开始分析题目的内容与系统的版本号是否存在cve。通过/zentao,得知这是个装在子目录里的 Web 应用说明这个系统存在默认的通用接口但是不会被dirsearch扫到,根据经验想到可以翻看Burp的HTTP history记录
发现了api.php页面,发包查看响应
这里的未授权接口比较隐蔽
经过仔细的搜索发现testcase模块的savexmindimport未授权接口测试发现api.php的格式是api.php?m=模块&f=方法拼接/zentao/api.php?m=testcase&f=savexmindimport&HTTP\_X\_REQUESTED\_WITH=XMLHttpRequest&productID=upkbbehwgfscwizoglpw&branch=zqbcsfncxlpopmrvchsu
这里要注意把cookie删去不然无法得到新的cookie把新的cookie复制下来这里就是漏洞的重点了,savexmindimport 未授权但是服务器依然顺手给它发了zentaosid有了令牌就可以尝试去访问其他接口api.php/v1/users这里我们发现了这个系统的重大漏洞,不需要认证依然可以注册用户的json
成功注册了ctfadmin8用户,通过浏览器重新访问并抓包
但是burp要重新发包,因为我们需要令牌后续推进
下面我们要重置admin1的密码,获取更高权限
重置密码后重新登录,但是这里要注意一点,要重新删除登录状态,然后登录admin账户
浏览器访问获取权限
全程要注意zentaosid令牌的交换探索并抓包分析
这个内容似乎可以发布,抓包看看回显。用 ADMIN\_SESSION,发第一个repo-create:
响应是\"fail\",但失败信息里漏出了路径:\"message\":{\"client\":\"... /opt/zbox/app/zentao/tmp/log/version\_6a840b729bc61.log ...\"}检查逻辑会判断\"这个 version 日志文件存不存在\"。如果存在一个同名的目录,它也会认为\"验证过了\"。用升级模块的moveExtFiles来创建。路径里拼上/test,让它建的是目录而不是文件:
这里采用..%2F..%2F来替换../../,从www目录跳两级到app/zentao/,再进tmp/log/。这里必须关闭不跟随重定向302 会跳到升级完成页,跳过去会刷新 Session,导致version\_\.log重新生成。一旦刷新,前面配对的路径就作废,必须从 6.2 重来。
⚠️小白必记:Repeater 里关闭 \"Follow redirects\"(不跟随重定向)!*这个 302 会跳到升级完成页,跳过去会刷新 Session**,导致 version_*.log 重新生成。一旦刷新,前面配对的路径就作废,必须从 6.2 重来。Burp 操作:Repeater 右上角 Follow redirection 选 Off,发完保持会话不变,直接做下一步。
响应(重点分析!):\"result\":\"fail\",\"message\":{\"submit\":\"连接代码库失败…执行命令:cp\t…\t--context=\r\
sed\t…\t--in-place=\r\
mv\t…\t--suffix=\r\
mv\t…\t--suffix= info --username --password dGVzdAo= --non-interactive --no-auth-cache \\"\\" 2>&1\
错误结果(1):mv:unrecognizedoption '--username'\"}用能用的后门(本次是x.php.bak):
→uid=65534(nobody) gid=65534(nogroup) groups=65534(nogroup)当前是nobody用户。读根目录的 flag:访问浏览器获取flag
写到这里,这道题算是从零啃完了。打完复盘感觉比较麻烦的地方有很多,对于我这样的小白很难度还是很大的。第一条肯定是未授权接口,这很考验基本功,审计出为未授权,对于像我这样的0基础代码的人来说很困难,但是我还是想说只要愿意开始,终有一天可以审出来。(愿你我都能成为网安大手子)
未授权的最大的价值往往是泄露出来的凭据与会话。一开始如果老想着“未授权就等于直接
拿到最高权限”,方向就很容易走偏。后来才慢慢回过味来:漏洞利用很多时候不是一步到位的,它是给你递一块垫脚石,后面的路得你自己接。一个能正常响应的未授权接口,加上一个依赖会话信任的接口,拼在一起就是一条进后台的路。这类接口在真实环境里也常见,不一定要多严重,有时候一点点信任上的马虎就够用。
第二条,就是那个重定向。很多新手小白(例如我)做题的习惯是“看见重定向就跟着跳”,因为在浏览器里根本不用管这个,如果不是这个题目的302跳转有问题,我肯定不会注意到这个点。但打这种多步链,会话就是整个链条的胶水——跟了一次重定向,会话一变,前面做的一切全作废,而且它还不报错,你根本没有感觉,只有几次真实的尝试,反复折腾才能看到问题。这道题让我最意外的,是后台管理员这东西没有想象的那么遥不可及。密码居然可以重置,从零开始,最后居然能拿到真正的管理员会话去做远程代码执行,靠的全是一环扣一环、把权限一点点垒起来。每一步单独看都感觉没什么用,连起来才是一条完整的链。打这类题真的别急。我中间容易多次产生放弃的念头,怀疑是不是环境出了问题,结果都是自己某个细节没看仔细。卡住的时候,把每一步的请求原样过一遍,尤其盯死三样东西:请求头里的凭据有没有变、重定向有没有自动跟随、编码有没有被代理工具悄悄改掉,多半就能找到问题。希望后来的人能少走点弯路,别再在重定向机制上耗费无谓的时间。
最后是技术文章的参考:本题考察了多个漏洞的串联性利用
其中有QVD-2024-15263考认证绕过:会话与登录分离,zentaosid 只是临时编号,登录态由接口自查;而RESTAPI只看有没有session、不验证登录,于是未授权拿到的会话可直建管理员、重置并解锁admin。CNVD-2023-02709 考命令注入:repo-create的client 被拼进 shell 执行,用 Tab、换行加哑参数吞掉 --version,配合 moveExtFiles 预建目录伪造\"客户端已验证\",再靠302不跟随保住 Session 一致,最后 sed 替换入口文件落地 webshell。核心是信任模型与多步链的状态一致性。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。









评论