命令执行漏洞

漏洞简述

命令执行漏洞,指有时应用需要调用一些执行系统命令的函数,如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 远程命令执行漏洞

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

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

访问kali的ip8080端口

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

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

上传后,访问

漏洞修复

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

Last updated

Was this helpful?