一.远程命令执行漏洞
1.命令执行
命令执行是指计算机程序接受用户输入的命令,并按照命令的要求执行相应的操作。命令可以执行各种操作,例如读取文件、创建文件、修改文件、运行程序、删除文件等。
命令执行通常是通过一个命令行界面或终端窗口进行的。在命令行界面中,用户可以输入各种命令来操作计算机系统,而系统会相应地执行这些命令。命令行界面通常用于系统管理员、程序员或高级用户等需要更精细控制计算机系统的人员使用。
2.命令执行漏洞
远程命令执行漏洞(remote command execution),简称RCE。一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后后台会对该IP地址进行一次ping测试,并返回测试结果。 如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令,从而导致漏洞的发生。
3.漏洞危害
- 系统控制方面:攻击者可完全控制服务器,如安装恶意软件;修改系统配置,如防火墙规则;操纵系统服务,如停用安全监控服务。
- 数据安全方面:窃取服务器数据,如用户信息和商业机密;篡改或删除数据,如修改价格或删除业务记录。
- 网络攻击传播方面:发动 DDoS 攻击;进行横向渗透,以被入侵服务器为跳板攻击其他设备。
4.命令执行相关函数
PHP:system()、exec()、shell_exec()、passthru()、penti_exec()、popen()、proc_pen()等,此外还有反引号命令执行,这种方式实际上是调用 shell_exec()函数来执行。
ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
Python:system()、popen()、subprocess.call
PHP命令执行相关函数
-
exec
-
格式:exec(string $command,array &$output, int &$return_var)
- $command:要执行的命令,这是一个字符串,包含了你想要执行的系统命令。
- $output(可选):一个引用参数,用于存储命令的输出结果。如果命令输出多行,每一行将作为数组的一个元素存储在此数组中。
- $return_var(可选):另一个引用参数,用于存储命令的返回状态码。通常,返回状态码为 0 表示命令执行成功,非零值表示出现错误。
-
作用:执行一个外部程序并返回结果,通常执行成功返回0。
<?php echo exec('whoami');?>
-
PS:exec执行命令时不会输出全部结果,而是返回结果的最后一行。
-
-
-
system
-
格式:system(string $command,int &$return_var)
- $command:要执行的命令,是一个字符串,包含你想要运行的系统命令。
- $return_var(可选):一个引用参数,用于存储命令的返回状态码。和 exec 函数一样,通常返回状态码为 0 表示命令执行成功,非零值表示出现错误。
-
作用:用于执行外部程序的一个函数。
<?php system('whoami');?>
-
PS:system和exec的区别在于,system在执行系统外部命令时,直接将命令的输出打印到标准输出(通常是网页或命令行终端),而不会像 exec 函数那样将输出存储在一个数组中。
-
-
-
shell_exec
-
格式:shell_exec(string $command)
- $command:要执行的命令,是一个字符串,包含你想要运行的系统命令。
-
作用:用于执行外部 shell 命令的一个函数。
<?php # 将 ipconfig 命令的执行结果存储在变量 $output 中。 $output = shell_exec('ipconfig'); # 使用 echo 函数将存储在 $output 中的结果输出到网页上。 # <pre> 标签:格式化输出文本,使输出更具可读性。 echo "<pre>$output</pre>"; ?>
-
-
反引号``
-
作用:效果等同 shell_exec
<?php echo `ipconfig`;?>
-
拓展知识
-
除了以上的函数可以造成命令执行之外,php中还有许多其它的函数可以造成命令执行漏洞,比如:passthru、popen()等。
-
命令执行常见绕过方式
- cmd1;cmd2:cmd1执行完再执行cmd2,windows下无法用(;)
- cmd1|cmd2:不管cmd1命令成功与否,都会去执行cmd2命令
- cmd1||cmd2:首先执行cmd1命令再执行cmd2命令,如果cmd1命令执行成功,就不会执行cmd2命令;相反,如果cmd1命令执行不成功,就会执行cmd2命令。
- cmd1&cmd2:&也叫后台任务符,代表首先执行命令cmd1,把cmd1放到后台执行再执行命令cmd2,如果cmd1执行失败,还是会继续执行命令cmd2。也就是说命令cmd2的执行不会受到命令cmd1的干扰。
- cmd1&&cmd2:首先执行命令cmd1再执行命令cmd2,但是前提条件是命令cmd1执行正确才会执行命令cmd2,在cmd1执行失败的情况下不会执行cmd2命令。所以又被称为短路运算符。
-
当cat被过滤时,可以使用以下命令代替
ca""t
ca\t
more:一页一页的显示档案内容
less:与 more 类似
head:查看头几行
tac:从最后一行开始显示,可以看出 tac 是 cat 的反向显示
tail:查看尾几行
nl:显示的时候,顺便输出行号
od:od指令会读取所给予的文件的内容,并将其内容以八进制字码呈现出来
vi:一种编辑器,这个也可以查看
vim:一种编辑器,这个也可以查看
sort:将文本文件内容加以 ASCII 码的次序排列
uniq:用于检查及删除文本文件中重复出现的行列
file -f:报错出具体内容
paste:把每个文件以列对列的方式,一列列地加以合并
反引号+base64编码:`echo Y2F0IC9ldGMvcGFzc3dk |base64 -d` -
空格被过滤
< 、<>、$IFS$9、${IFS}、$IFS、$IFS[*]、$IFS[@]等
-
/etc/passwd被过滤
/e?c/?asswd
/e*c/*asswd
/??c/?asswd
/??c/?assw?
二.组件、开发框架中的命令执行漏洞
由于新的漏洞不断被发现和修复,所以这些组件、开发框架是否存在漏洞随着时间的推移而变化。以下是一些已知的开发框架和库,它们在过去的一段时间内曾经存在过命令执行漏洞:
- Apache Struts:Apache Struts是一个用于构建企业级Java Web应用程序的框架,它在过去曾经多次发现命令执行漏洞,例如2017年发现的漏洞CVE-2017-5638。
- Ruby on Rails:Ruby on Rails是一个使用Ruby语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2013年发现的漏洞CVE-2013-0156。
- Django:Django是一个使用Python语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2015年发现的漏洞CVE-2015-5143。
- Laravel:Laravel是一个使用PHP语言编写的Web应用程序框架,它在过去也曾经发现过多个命令执行漏洞,例如2021年发现的漏洞CVE-2021-3129。
- jQuery:jQuery是一个广泛使用的JavaScript库,它在过去也曾经发现过多个命令执行漏洞,例如2015年发现的漏洞CVE-2015-9251。
这里只是列举了一些已知的开发框架和库,在实际情况中,任何开发框架和库都可能存在安全漏洞,因此在开发应用程序时,需要不断关注它们的安全更新和漏洞修复。
1.Apache Shiro远程命令执行漏洞
- Shiro:Apache Shiro是一个Java安全框架,提供了身份验证、授权、加密、会话管理等安全功能。它可以集成到任何Java应用程序中,包括Web、企业、桌面和移动应用程序。
- Shiro-550:Shiro-550是Apache Shiro项目的一个问题编号,指的是一个已经被修复的漏洞。该漏洞存在于Shiro的RememberMe功能中,攻击者可以使用Cookie中的信息重新创建会话并获取未经授权的访问权限。该漏洞的CVE编号为CVE-2016-4437。
A.漏洞原理
Apache Shiro 框架提供了记住密码的功能( RememberMe ),用户登录成功后用户信息会经过加密编码后存储在 cookie 中。在 Cookie 读取过程中有用 AES 对 Cookie 值解密的过程,对于 AES 这类对称加密算法,一旦 秘钥泄露 加密便形同虚设。若秘钥可控,同时 Cookie 值是由攻击者构造的恶意Payload ,就可以将流程走通,触发危险的 Java 反序列化,从而导致远程命令执行漏洞。
所以此漏洞的关键点就是密钥的泄露,一些网站使用了默认的密钥就存在泄露的风险。
B.漏洞复现
-
环境搭建
-
新建docker-compose.yml文件,将以下内容复制进去
version: '2' services:web:image: vulhub/shiro:1.2.4ports:- "8080:8080"
-
然后执行:docker-compose up -d
-
启动后访问:http://your-ip:port/
-
-
漏洞复现
-
组件发现
-
首先需要知道目标是否使用该组件,在访问及登录时抓包,如果响应头 set-cookie 中显示 rememberMe=deleteMe ,说明使用了 Shiro 组件。
-
除此之外,还可以自己在请求包中的Cookie处添加 rememberMe=1 然后查看响应头是否有 rememberMe=deleteMe
-
还可以使用一些指纹探测工具 -- Finger指纹探测工具
-
以及Burp Suite插件进行被动扫描。
-
-
漏洞利用
-
在获取到目标网站使用了Shiro组件之后,可以再使用其他的工具爆破密钥,例如LiqunKit综合漏洞利用工具,运行该工具需要有java环境。
-
-