# 命令执行漏洞

### 漏洞简述

命令执行漏洞，指有时应用需要调用一些执行系统命令的函数，如system()、exec()、shell\_exec()、eval()、passthru()，代码未对用户的可控参数进行过滤，当用户能控制这些函数中的参数时，就会将恶意系统命令拼接到正常命令中，造成命令执行的攻击。

在操作系统中，“&、|、||”都可以作为命令连接符使用，用户通过浏览器提交执行命令，由于服务器端没有针对执行函数做过滤，导致在没有指定绝对路径的情况下就执行命令。

* 命令执行与代码执行漏洞区别

命令执行漏洞是可以直接调用操作系统命令，代码执行漏洞是靠执行脚本代码调用操作系统命令

* 命令执行&代码执行漏洞危害

可以执行代码、系统命令进行读写文件、反弹shell等操作，拿下服务器，进一步内网渗透等等。

* **代码执行，文件读取，命令执行的函数都有哪些**

命令执行：

system(), exec(), shellexec(), passthru() ,pcntlexec(), popen(),proc\_open()

代码执行：eval,pregreplace+/e,assert,calluserfunc,calluserfuncarray,create\_function

文件读取：

filegetcontents(),highlightfile(),fopen(),read file(),fread(),fgetss(), fgets(),parseinifile(),showsource(),file()等

### 漏洞实例

#### Apache SSI 远程命令执行漏洞 <a href="#toc-15" id="toc-15"></a>

在测试任意文件上传漏洞的时候，目标服务端可能不允许上传php后缀的文件。如果目标服务器开启了SSI与CGI支持，我们可以上传一个shtml文件，并利用语法执行任意命令。

```
service docker start    启动docker
cd httpd/ssi-rce/   进到靶机环境目录
docker-compose up -d     构建环境
```

\
访问kali的ip8080端口

![](https://raw.githubusercontent.com/hongriSec/Web-Security-Attack/master/Part1/Day13/files/assets/kB4iEBRNidoNFGnm.png)

这里我们是无法上传正常的PHP，所以就上传个构造好的shtml文件

![](https://raw.githubusercontent.com/hongriSec/Web-Security-Attack/master/Part1/Day13/files/assets/SmLqa6VkfhMflauz.png)

```
<!--#exec cmd="whoami" -->
```

上传后，访问\ <br>

![](https://raw.githubusercontent.com/hongriSec/Web-Security-Attack/master/Part1/Day13/files/assets/MuVH29LcolYYpW7a.png)

![](https://raw.githubusercontent.com/hongriSec/Web-Security-Attack/master/Part1/Day13/files/assets/UQWLqvW8bk48OtJX.png)

### 漏洞修复

```
命令执行修复方案
1 尽量少用执行命令的函数或者直接禁用
2 参数值尽量使用引号包括
3 在使用动态函数之前，确保使用的函数是指定的函数之一
4 在进入执行命令的函数/方法之前，对参数进行过滤，对敏感字符进行转义
5 能使用脚本解决的工作，不要调用其他程序处理。尽量少用执行命令的函数，并在disable_functions中禁用
6 对于可控点是程序参数的情况下，使用escapeshellcmd函数进行过滤，对于可控点是程序参数值的情况下，使用escapeshellarg函数进行过滤
7 参数的值尽量使用引号包裹，并在拼接前调用addslashes进行转义
8 对由特定第三方组件引发的漏洞，我们要做的就是及时打补丁，修改安装时的默认配置。
```

{% embed url="<https://xz.aliyun.com/t/6970#toc-17>" %}
