第十六届极客大挑战 Web 题型复现
Expression
描述: 该程序使用了 Node.js + Express 框架,EJS 作为模板引擎。JWT 密钥未修改。
漏洞分析:
- 爆破 JWT 发现密钥为 secret。
- 用户名显示存在 SSTI(服务器端模板注入)风险。
- EJS 模板中
<% %>用于执行 JS 代码,<%= %>输出转义结果,<%- %>输出不转义结果。
利用思路:
通过构造 Payload 利用 setInterval.constructor('return process')() 获取 Node.js 的 process 对象,进而加载 child_process 模块执行系统命令。
// 通用 EJS 模板注入 Payload 示例
setInterval.constructor('return process')().mainModule.require('child_process').execSync('ls').toString()
Vibe SEO
描述: 目录扫到 sitemap.xml,根据报错信息缺少 filename 参数。
源码审计:
<?php
$flag = fopen('/my_secret.txt', 'r');
if(strlen($_GET['filename']) < 11) {
readfile($_GET['filename']);
} else {
echo "Filename too long";
}
?>
漏洞原理:
限制文件名长度小于 11 字符,但可以通过 Linux 特殊目录 /dev/fd/ 或 PHP 封装协议 php://fd/ 绕过。
/dev/fd/:类 Unix 系统文件描述符访问入口。php://fd/:PHP 对系统 的封装。

