命令&代码执行漏洞

本文内容来自蚁景网安课程

命令执行基本介绍

命令执行定义

当应用需要调用一些外部程序去处理内容的情况下,就会用到一些执行系统命令的函数。如PHP中的system,exec,shell_exec等。

PHP命令执行的函数

1
2
3
4
5
6
7
system(); //执行外部程序,并显示输出
exec(); //执行一个外部程序
shell_exec(); //通过shell环境执行命令,并且将完整的输出以字符串的方式返回。
passthru(); //执行外部程序并且显示原始输出
pcntl_exec(); //在当前进程执行指定程序
popen(); //打开进程文件指针
proc_open(); //执行一个命令,并且打开用来输入/输出的文件指针

Java命令执行的函数

1
java.lang.Runtime.getRuntime(.exec(command))

Python命令执行的函数

1
2
3
4
system() #执行系统指令
popen() #popen()方法用于从命令打开一个管道
subprocess.call #执行由参数提供的命令
spawn #执行命令

命令执行函数讲解

system

system()用于执行外部程序,并且显示输出。

1
<?php system('whoami'); ?>

exec

exec()函数用于执行一个外部程序。

1
<?php echo exec('whoami'); ?>

passthru

passthru函数用于执行外部程序并且显示原始输出。

1
<?php passthru('whoami'); ?>

反引号

反引号`是PHP执行运算符,PHP会尝试将反单引号中的内容作为shell命令来执行,并返回其输出信息。

1
<?php echo `whoami`; ?>

命令执行漏洞

简介

RCE(Remote Command/Code Execute),远程命令/代码执行。

远程系统命令执行(操作系统命令注入或简称命令注入)是一种注入漏洞,攻击者注入的payload作为操作系统命令执行,仅当Web应用程序代码包含操作系统调用并且调用中使用了用户输入时,才可能进行OS命令注入攻击。它们不是特定语言的,命令注入漏洞可能会出现在所有让你调用系统外壳的命令语言中:C, Java, PHP, Perl, Ruby, Python等。

形成原因

应用程序的某些功能需要调用可以执行系统命令的函数,如果这些函数或函数的参数被用户控制,就有可能通过命令连接符将恶意命令拼接到正常的函数中,从而随意执行系统命令,这就是命令执行漏洞。

一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后后台会对该IP地址进行一次ping测试,并返回测试结果。如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令,让后台进行执行,从而获得后台服务器权限。

漏洞危害

1.继承Web服务程序的权限去执行系统命令或读写文件。

2.反弹shell,获得目标服务器的权限。

3.进一步内网渗透。

场景举例

某个网站里有个ping功能,比如站长工具的ping功能,正常情况下用户输入IP,它就会对该IP发起ping的请求。

cmd1;cmd2

cmd1执行完再执行cmd2,windows下无法用;

127.0.0.1;whoami

cmd1|cmd2

不管cmd1命令成功与否,都会去执行cmd2命令。

127.0.0.1|whoami

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命令。所以又被称为短路运算符。

代码执行漏洞

基本介绍

代码注入攻击与命令注入攻击不同,因为需求设计,后台有时需要把用户的输入作为代码的一部分执行,也就造成了远程代码执行漏洞。不管是使用了代码执行函数还是使用了不安全的反序列化等。

通过代码注入或远程代码执行(RCE),攻击者可以通过注入攻击执行恶意代码、向网站写webshell、控制整个网站甚至服务器。其实际危害性取决于服务器端解释器的限制(如PHP、Python等)。在某些情况下,攻击者可能能从代码注入升级为命令注入。

形成原因

因为业务需求,在PHP中有时需要调用一些执行命令的函数,如eval()、assert()、preg_place()、create_function()等,如果存在一个使用这些函数且未对可被用户控制的参数进行检查过滤的页面,那么这个页面就可能存在远程代码执行漏洞。

代码执行函数

eval(),把字符串code作为PHP代码执行。

eval()函数传入的参数必须为PHP代码,即要以分号结尾;

函数eval()语言结构是非常危险的,因为它允许执行任意PHP代码。不要允许传入任何由用户提供的、未经完整验证过的数据。

assert(),检查一个断言是否为FALSE,如果assertion是字符串,它将会被assert()当作PHP代码来执行。

assert()函数是直接讲传入的参数当作PHP代码执行,不需要以分号结尾。

小于php7 assert拼接之后依然可以代码执行,eval不行。

preg_replace(),执行一个正则表达式的搜索和替换。

1
preg_replace('正则规则','替换字符','目标字符');

PCRE修饰符e:preg_place()在进行了对替换字符串的后向引用替换之后,将替换后的字符串作为PHP代码评估执行(eval函数方式),并使用执行结果作为实际参与替换的字符串。

1
<?php echo preg_replace("/test/e",$_POST["cmd"],"just test");?>

call_user_func(),第一个参数callback是被调用的回调函数,其余参数是回调函数的参数。把第一个参数作为回调函数调用。

1
<?php call_user_func($_POST['id'],$_POST['cmd']);?>

Shiro命令执行漏洞

Shiro介绍

Apache Shiro是一款开源安全框架,提供身份验证,授权,加密和会话管理。Shiro框架直观、易用,同时也能提供健壮的安全性。

Apache Shiro 1.2.4及以前版本中,加密的用户信息序列化后存储在名为remember-me的Cookie中。攻击者可以使用Shiro的默认密钥伪造用户Cookie,触发Java反序列化漏洞,进而在目标机器上执行任意命令。

Shiro特征

可以在cookie头部追加一个remeberMe=xx的字段,这个字段是rememberMeManager默认的,然后看响应头部是否有Set-Cookie: rememberMe=deleteMe; 的字段则可以判断是Shiro框架。

Shiro检测

GitHub地址

漏洞利用

GitHub地址