命令执行漏洞 Command Execute
命令执行漏洞(Command Injection)是一种安全漏洞,指的是攻击者能够在应用程序的命令行中注入并执行恶意命令。简单来说,就是攻击者可以利用这个漏洞让程序执行自己指定的命令,而不是程序原本应该执行的命令。
举个例子:假设有个网站可以让用户输入一个文件名,然后程序根据这个文件名去执行操作(比如显示文件内容)。如果这个程序没有对用户输入进行足够的检查,攻击者可能会输入类似“; rm -rf /”这样的内容,导致程序不仅执行正常的命令,还执行了恶意命令(比如删除文件)。
原理
命令执行代码示例:
<?php system($_GET['cmd']); ?>
<?php @eval($_GET['cmd']); ?>
命令执行(Command Execute)漏洞即攻击者通过执行系统命令或恶意代码命令,以此实现非法操作,比如获取敏感信息、拿到系统权限等。
- 命令执行漏洞分为系统命令执行(又称 OS 命令注入)和代码命令执行(命令注入),区别在于前者直接执行系统级命令,后者需调用恶意代码命令。我们经常听到的 “RCE”远程代码执行,就是属于代码命令执行漏洞。
- 命令执行漏洞形成原因,本质是在系统服务器或应用程序端,没有对用户输入进行安全检测过滤,导致恶意代码被执行。
- 命令执行漏洞通常发生在各种Web组件,包括Web容器、Web框架、CMS软件、安全组件等,比如Apache Struts2、Thinkphp等。
系统命令执行 常见管道符
&:后台执行命令(nohup) 示例:command &
&&:前一条命令执行成功,才执行后面一条命令 示例:command1 && command2
|:上一条命令输出作为下一条命令的输入参数 示例:command1 | command2
||:上一条命令执行失败后才执行下一条命令 示例:command1 || command2
;:多个命令顺序执行(不管前面的命令是否成功) 示例:command1; command2; command3
\n或0x0a:换行符
通过以上管道符可以拼接一些非法操作,达到系统命令执行的目的
代码命令执行 常见执行函数
PHP:system()、shell_exec()、exec()、passthru()、popen()、proc_open()、pcntl_exec(),dl()
Python:eval()、os.system()、os.Popen()、subprocess.Popen()、subprocess.call(xx,
shell=True)、commands.getstatus/output()
Java:存在Runtime类,在该类中提供了exec方法用以在单独的进程中执行特定的字符串命令
其他:ImageMagick组件、bash漏洞、struts2系列、thinkphp命令执行等拼客科技版权所有拼客
危害
- 执行恶意代码
- 获取系统敏感信息
- 获取系统管理权限
防御方案
- 不使用命令执行函数
- 如果使用命令执行函数,则强制执行输入验证
- 输入的命令进制使用占位符,而不要直接拼接变量
- 在disable_functions中禁用
- escapeshellcmd函数(程序参数)escapeshellarg函数(程序参数的值)进行参数过滤
- 使用safe_mode_exec_dir指定可执行文件的路径
绕过手段
- 逻辑运算符绕过
- 在 win 下执行 bat 时可以使用 %1a 绕过过滤
- 如果是 php 环境可以使用 %0a、%0d ,分别表示换行符\n和回车符\r
- 引号绕过c"“at /etc/passwd、c”“at /etc/pas”“swd、c”"at /etc/pas’'swd
- 反斜杠绕过 c\at /etc/pas\swd
- 通配符绕过 /b??/??t /???/p??s??
- 使用数字地址绕过 ip 限制
- IFS绕过空格(注意切换成bash)
- 编码绕过
echo "Y2F0IC9ldGMvcGFzc3dk="|base64 -d