【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。两个函数对这同一个字节的处理不一样,形成绕过。

相关推荐
郭萌6962 小时前
多商户平台的优惠券,真正的设计对象是「适用范围」而不是券模板
php
额额额对了2 小时前
嵌入式 Linux 启动程序文件
开发语言·嵌入式硬件·php
v:ychya20183 小时前
独立站外贸建站公司怎么选?建站就要建营销型网站
前端·php
梅菲塔亚4 小时前
华为云从入门到实战
开发语言·华为云·php
要吃这碗饭4 小时前
AI 智能体如何通过 auth.md 注册 Bright Data 账号
数据库·人工智能·php
霸道流氓气质4 小时前
幂等性与 Upsert:防止重复操作产生副作用的技术
开发语言·php
qq_543447826 小时前
DNS解析怎么排查?故障处理与运维实用手册
运维·服务器·网络·php
ZHOUPUYU6 小时前
PHP 9.0 前瞻:下一代 PHP 会带来哪些新功能?
android·开发语言·php
ZHOUPUYU7 小时前
PHP 8.2 的核心高级特性,包括只读类、类型系统增强
android·性能优化·php
ZHOUPUYU7 小时前
PHP 8.0 高级技术实战:从新特性到性能优化
android·性能优化·php