1.命令执行
命令执行是指计算机程序或系统执行由用户输入的命令或指令的过程。用户可以通过命令行界面(CommandLine lnterface, CLI) 或图形用户界面 (Graphical User Interface,GUI) 等方式向计算机系统发送命令,系统会解释和执行这些命令。
2.命令执行漏洞
远程命令执行漏洞(Remote Command Execution),简称RCE。命令执行是用户与计算机系统进行交百的一种重要方式,尤其在一些服务器、操作系统和开发环境中,命令行界面被广泛应用。然而,命令执行也可能面临一些安全风险。如果用户的输入未经过充分验证和过滤,恶意用户可能通过注入恶意命令来执行一些危险的操作,这就是所谓的命令注入攻击
3.场景
一般出现这种漏洞,是因为应用系统从设计上需要给用户提供指定的远程命令操作的接口,比如我们常见的路由器、防火墙、入侵检测等设备的web管理界面上,一般会给用户提供一个ping操作的web界面,用户从web界面输入目标IP,提交后后台会对该IP地址进行一次ping测试,并返回测试结果。如果设计者在完成该功能时,没有做严格的安全控制,则可能会导致攻击者通过该接口提交恶意命令,从而导致漏洞的发生
4.命令执行&代码执行
命令执行指用户或程序向系统发送命令,然后系统执行这些命令的过程代码执行指程序或系统执行编程代码的过程,这些代码可以是脚本、程序或其他形式的可执行代码
5.危害
攻击者可以利用远程命令执行漏洞远程控制受影响系统。攻击者可以在不需要直接物理访问的情况下执行命令,修改系统配置,执行恶意代码等
6.相关函数
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
(1)Exec
语法格式:exec(command, output, return_var);
作用: 执行一个外部程序,exec()执行command参数所指定的命令;第二个参数是执行命令返回的结果,这是一个可选参数,如果不提供,exec函数会直接将输出打印到页面上;第三个参数用来取得命令执行的状态码,这是一个可选参数,通常执行成功都是返回0。
<?php
highlight_file(__FILE__);// 将当前文件的源代码以语法高亮的形式输出
echo exec('whoami');
?>
<?php
highlight_file(__FILE__);
echo exec('ipconfig');
?>
系统中执行同样的命令并实际返回信息:
(2)System
语法格式:system(command, return_var);
作用:system函数执行给定的command命令,并将结果输出。第二个参数用于存储命令的返回状态,这是一个可选参数。
<?php
highlight_file(__FILE__);
system('ipconfig');
?>
exec和system函数的区别:
A.返回值:
exec 函数: 返回最后一行输出的字符串,并将所有输出存储在一个数组中。system 函数: 直接输出命令的所有输出到标准输出,不返回任何值。
B.输出方式
exec 函数: 通过第二个参数(传入的数组)来存储命令的所有输出。
system 函数:将命令的输出直接发送到标准输出。
C.使用方式:
exec通常用于获取命令的输出,因为它将所有输出存储在一个数组中,方便进一步处理。
system通常用于执行命令并将结果直接输出,适合在命令行界面中展示结果。
(3)Shell_exec
语法格式:shell_exec(command)
作用:shell exec 函数执行命令,并将命令的输出作为字符串返回
<?php
highlight_file(__FILE__);
echo shell_exec('ipconfig');
?>
(4)反引号
效果等同于shell_exec
<?php
echo 'ipconfig';
?>
7.CTF中命令执行的小技巧
(1)想查看某个文件的内容,但是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`
(2)空格被过滤
< 、<>、$IFS$9、${IFS}、$IFS、$IFS[*]、$IFS[@]等
(3)文件名被过滤,例如/etc/passwd
/e?c/?asswd
/e*c/*asswd
/??c/?asswd
/??c/?assw?
(4) 获取用户的输入,然后将输入的内容与系统命令结合进行执行,可以尝试以下符号:
A. cmd1;cmd2:cmd1执行完再执行cmd2,windows下无法用(;)
B. cmd1|cmd2:不管cmd1命令成功与否,都会去执行cmd2命令
C. cmd1||cmd2:首先执行cmd1命令再执行cmd2命令,如果cmd1命令执行成功,就不会执行cmd2命令;相反,如果cmd1命令执行不成功,就会执行cmd2命令。
D. cmd1&cmd2:&也叫后台任务符,代表首先执行命令cmd1,把cmd1放到后台执行再执行命令cmd2,如果cmd1执行失败,还是会继续执行命令cmd2。也就是说命令cmd2的执行不会受到命令cmd1的干扰。
E. cmd1&&cmd2:首先执行命令cmd1再执行命令cmd2,但是前提条件是命令cmd1执行正确才会执行命令cmd2,在cmd1执行失败的情况下不会执行cmd2命令。所以又被称为短路运算符。
8.开发框架,组件中的命令执行漏洞
ApacheShiro远程命令执行漏洞:
Apache Shiro是一个Java安全框架,提供了身份验证、授权、加密、会话管理等安全功能。它可以集成到任何Java应用程序中,包括Web、企业、桌面和移动应用程序。shiro-550是Apache shiro项目的一个问题编号,指的是一个已经被修复的漏洞。该漏洞存在于Shiro的RememberMe功能中,攻击者可以使用Cookie中的信息重新创建会话并获取未经授权的访问权限。该漏洞的CVE编号为CVE-2016-4437。
Apache Shiro框架提供了记住密码的功能 (RememberMe),用户登录成功后用户信息会经过加密编码后存储在cookie中。在Cookie 读取过程中有用AES对 Cookie 值解密的过程,对于AES 这类对称加密算法,一日秘钥泄霞,加密便形同虚设。若秘钥可控,同时 Cookie 值是由攻击者构造的恶意 Pavload,就可以将流程走通,触发危险的 Java 反序列化,从而导致远程命令执行漏洞。所以此漏洞的关键点就是密钥的泄露,一些网站使用了默认的密钥就存在泄露的风险。
框架发现:
(1)在访问及登录时进行抓包
若是响应头中出现rememberME=deleteME,说明使用了shiro框架
(2)使用bp插件BurpshiroPassiveScan
(3)使用Liqunkit工具
不仅可以发现是否采用shiro框架,而且若存在使用shiro框架,还能爆出密钥和链组合