【WEB】cat flag

php 复制代码
$cmd = $_GET['cmd'];
if (!preg_match('/flag/i', $cmd)) {   // ① 输入里不能出现 flag(忽略大小写)
    $cmd = escapeshellarg($cmd);      // ② 整段被单引号锁成"一个参数"
    system('cat ' . $cmd);            // ③ 命令固定是 cat,只能控制它读哪个文件
}

管理员用浏览器访问过真 flag 文件,这个请求会被记进 nginx 访问日志 。日志路径不含 flag,能直接 cat:

php 复制代码
?cmd=/var/log/nginx/access.log

真文件就叫 this_is_final_flag_e2a457126032b42d.php ,在网站根目录 /var/www/html/。但名字里有 flag,直接读会被正则拦。

escapeshellarg 在 Linux 上内部用 php_mblen() 判断多字节字符,PHP 7.3 的源码逻辑大致是:

cs 复制代码
for (每个字节) {
    int mb_len = php_mblen(当前位置, 剩余长度);
    if (mb_len < 0) {
        continue;                 // ★ 判定为"非法多字节字符" → 直接丢弃这个字节!
    } else if (mb_len > 1) {
        整段多字节字符原样复制;     // 合法的多字节字符(如 UTF-8 汉字)保留
    } else {
        正常处理(单引号转义);
    }
}

而 0x80 是一个孤立的 UTF-8"尾字节" (continuation byte),单独出现时构不成合法字符,php_mblen 返回 -1,于是这个字节被静默删除 。所以我们可以把 %80 塞进 flag 中间,变成 fla + 0x80 + g。两个函数对这同一个字节的处理不一样,形成绕过。

相关推荐
aixingpan9 小时前
aixingpan.cn API开发文档:前端查询夏令时和时区接口指南
前端·php
4SAPI15 小时前
多国产模型混合调度与企业级治理生产选型指南:4SAPI、硅基流动与 OpenRouter 的架构权衡
大数据·人工智能·架构·php
tommyjiatong18 小时前
资安底座连环雷:从 PHP2Shell 到 Node2Shell
node.js·php
青峰讲运维19 小时前
OpenStack Heat 编排:用模板一键交付云业务,告别手动点页面
开发语言·php·openstack
协作者19 小时前
PHP根本影响不到Domino
php·oidc·domino·notes·inotes·verse
神仙别闹20 小时前
基于Python+MySQL实现(Web)个人博客系统
python·mysql·php
dingzd9520 小时前
TikTok账号登录态失效的Cookie字段排查路径
开发语言·php·跨境电商·营销策略
vipxieliang1 天前
Laravel 框架内核:请求生命周期、IoC 容器与中间件管道(附 ThinkPHP 选型对比)
php
忆~遂愿1 天前
极空间部署XiaoMusic:把NAS里的本地音乐接入小爱音箱,搜索、播放和远程控制一起完成
php
ESDWAN1 天前
SD-WAN 是什么?工作原理、适用场景与选型要点
开发语言·网络·数据库·架构·php