Polar 2024春季赛:从入门到精通,实战拆解CTF核心Web漏洞

张开发
2026/4/14 3:04:33 15 分钟阅读

分享文章

Polar 2024春季赛:从入门到精通,实战拆解CTF核心Web漏洞
1. Polar CTF春季赛入门指南Web漏洞攻防全景对于刚接触CTF竞赛的新手来说Web类题目往往是最容易上手的突破口。今年Polar春季赛的Web方向集中呈现了PHP反序列化、文件包含、SQL注入三大经典漏洞类型这些恰好是实际渗透测试中最常遇到的攻击面。我们先从整体上理解这些漏洞的杀伤链PHP反序列化就像把快递包裹重新拆封组装攻击者通过精心构造的序列化数据触发对象魔术方法形成RCE远程代码执行链条。比赛中那道PHP_Deserialization题目就是利用Day类的__toString方法实现文件读取。文件包含类似于图书馆管理员拿错书通过路径遍历如../../或伪协议php://filter读取敏感文件。实战中常用php://filter/readconvert.base64-encode/resource 来绕过内容检测。SQL注入好比伪造身份证混入禁区通过拼接恶意SQL片段获取数据库权限。比赛中search题目需要掌握空格绕过/**/和大小写混淆技巧。建议新手先用Docker搭建本地靶场复现这些漏洞推荐vulhub和WebGoat这两个开源项目。我在最初练习时会刻意把每道题的解题过程录屏事后用0.5倍速回放分析操作逻辑。2. PHP反序列化漏洞深度拆解2.1 魔术方法触发链条让我们解剖比赛中最典型的反序列化题目。核心漏洞出现在这段代码class Polar { public $night; public function __wakeup() { $this-night-hacker($this-night_arg); } } class Day { public function __toString() { return file_get_contents($this-filename); } }攻击链构造需要三步走通过Polar类的__wakeup触发Night对象的__call魔术方法将Day对象作为参数传递触发其__toString方法修改filename属性实现任意文件读取我调试时发现个有趣现象当filename设置为/flflagag时str_replace(flag,,$filename)正好变成/flag。这种绕过技巧在真实渗透中也很常见。2.2 实战payload构造生成有效载荷的完整过程如下$a new Polar(); $a-night new Night(); $a-night_arg new Day(); $a-night_arg-filename /flflagag; echo base64_encode(serialize($a));这里有个坑点PHP7环境下需要保证序列化字符串中的属性数量与实际一致。有次比赛我就因为属性计数错误调试了半小时后来发现可以用O:5:Polar:2强制声明属性个数。3. 文件包含的奇技淫巧3.1 伪协议利用的艺术比赛中phar题目展示了文件包含的高级玩法?filephp://filter/readconvert.base64-encode/resource./funs.php这种手法有三大优势base64编码可绕过内容检测能读取php文件源码而不触发执行不受allow_url_include配置限制我习惯用这个顺序尝试伪协议php://filterzip://phar://data://3.2 日志污染实战有个隐蔽的技巧是包含Apache日志?file/var/log/apache2/access.log通过User-Agent注入PHP代码再包含日志文件就能getshell。不过要注意新版Apache默认日志权限已调整这个方法在CTF中更常见。4. SQL注入的现代绕过技术4.1 非常规绕过手法比赛中的search题目演示了进阶注入技巧1/**/and/**/uPdatexmL(1,coNcat(...))这里包含几个关键点用/**/替代空格绕过WAF大小写混淆规避关键字检测updatexml报错注入快速获取数据我在实际渗透测试时会优先尝试这些现代注入技术布尔盲注substr()ascii()组合时间盲注sleep()if()组合报错注入updatexml()或extractvalue()堆查询分号多语句执行4.2 预处理语句绕过遇到PDO预处理不要慌试试这些方法# 参数污染 id1id2 union select 1,2,3-- # 十六进制编码 id0x3120756e696f6e2073656c6563742031最近遇到个真实案例开发者用prepare但直接拼接ORDER BY参数导致注入漏洞。这种错误在快速开发中相当常见。5. 防御方案设计与实战建议5.1 PHP反序列化防护生产环境建议采用白名单校验$allowed_classes [SafeClass1, SafeClass2]; $data unserialize($input, [allowed_classes $allowed_classes]);我在代码审计时重点关注这些危险方法__wakeup()__destruct()__toString()__call()5.2 文件包含加固必须实施的防护措施设置open_basedir限制访问范围禁用危险协议php.ini中设置allow_url_includeOff真实路径校验$realpath realpath($input); if(strpos($realpath, /var/www/) ! 0){ die(Hacking attempt!); }5.3 SQL注入终极防御除了参数化查询还要注意PDO的ERRMODE_EXCEPTION模式最小权限原则应用数据库账号只给必要权限自定义过滤函数function safe_query($db, $sql, $params) { foreach($params as $k$v){ if(preg_match(/union|select|sleep/i, $v)){ $params[$k] ; } } $stmt $db-prepare($sql); $stmt-execute($params); return $stmt; }在最近的银行项目中我们就通过组合预处理语句存储过程权限控制实现了零注入漏洞的安全目标。CTF中的技巧虽然炫酷但企业级安全更需要扎实的防御体系。

更多文章