一、漏洞描述
命令执行漏洞是指服务器没有对执行的命令进行过滤,用户可以随意执行系统命令,这种漏洞属于高危漏洞之一,因为攻击者可以利用它来执行恶意命令,从而控制整个网站甚至整个服务器,在PHP中,命令执行漏洞主要是基于一些函数的参数过滤不足导致的,如system()、exec()、shell_exec()等函数,当攻击者可以控制这些函数中的参数时,就可以将恶意的系统命令拼接到正常命令中,从而造成命令执行攻击。
二、漏洞原理
应用程序有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_open等,当黑客能控制这些函数中的参数,并且开发人员对这个参数没有严格的过滤时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行漏洞。
三、漏洞危害
继承Web服务器程序的权限:去执行系统命令或读写文件。
反弹shell:攻击者可以通过命令执行漏洞获取服务器的Shell访问权限,进而控制整个服务器。
控制整个网站:甚至控制整个服务器,造成严重的数据泄露和损失。
四、漏洞产生的原因
1、没有对用户输入进行过滤或过滤不严:没有过滤&、&&、|、||等连接符。
2、系统漏洞造成的命令执行:如bash破壳漏洞(CVE-2014-6271),该漏洞可以构造环境变量的值来执行具有攻击力的脚本代码,会影响到bash交互的多种应用,如http、ssh和dhcp等。
3、调用的第三方组件存在代码执行漏洞:如php(system()、shell_exec()、exec()、eval()),JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)。
五、常见的危险函数
1、PHP代码相关:
eval()
assert()
preg_replace
call_user_func()
call_user_func_array()
create_function
array_map()
2、系统命令执行相关:
system()
passthru()
exec()
pcntl_exec()
shell_exec()
popen()
proc_open()
(反单引号)
ob_start()
symlink()
getenv
putenv($a)
六、命令执行的类型
1、代码层过滤不严格:商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用。
2、系统的漏洞造成命令注入:比如bash破壳漏洞(CVE-2014-6271)。
3、调用的第三方组件存在代码执行漏洞:如WordPress中用来处理图片的imageMagick组件,Java中的命令执行漏洞(struts2/ElasticsearchGroovy等),ThinkPHP命令执行。
七、危险函数利用示例
1、system:
if(isset($_REQUEST['url'])){ $url = ($_REQUEST['url']); $b = system($url, $a); echo $a.PHP_EOL; echo $b.PHP_EOL; }
恶意代码执行:?url=dir。
文件写入:?url=echo 1111 > flag.php。
2、passthru:
if(isset($_REQUEST['url'])){ $url = ($_REQUEST['url']); passthru($url,$a); echo $a.PHP_EOL; }
文件写入:?url=dir > 22.txt。
3、exec:需要注意的一点exec要有echo才有回显。
if(isset($_REQUEST['url'])){ $url = ($_REQUEST['url']); echo exec($url); }
4、shell_exec:
if(isset($_REQUEST['url'])){ $url = ($_REQUEST['url']); echo shell_exec($url); }
5、反引号:
if(isset($_REQUEST['url'])){
$url = ($_REQUEST['url']);
echo$url
;
}
八、常用过滤绕过方法
1、编码绕过:URL编码是web端进行命令执行绕过最常用的方法,如cat%20%2Fetc%2Fpasswd,Base64编码绕过:将想要执行的命令进行base64编码,然后添加到下面的双引号里面,如echo "d2hvYW1p" | base64 -d | bash。
2、通配符绕过:如cat /et?/p?*sswd。
3、命令拼接:可以使用&、&&、|、||这几种方式来进行命令拼接,如ls & cat /etc/passwd。
4、**注释符#进行绕过**:如cat /etc/passwd #anything。
5、字符拼接:如cat /"e"tc/'p'a's'swd。
6、转义拼接:如cat /etc/passwd。
7、命令拼接:如a=ca;b=t;$a$b /etc/passwd。
8、填充垃圾字符绕过:如cat /etc/passwd xxx。
9、分号(;):如cmd1;cmd2。
10、反引号`和$()
:如echo "result :whoami`"或echo "result : $(whoami)"。
11、重定向绕过:如cat<1.txt(可绕过空格)。
12、单引号和双引号:如c""at 1.tx''t。
13、反斜杠绕过:如cat 1.txt。
14、**$1、$@、$*绕过**:如$1、$@、$*绕过 c$1a$1t。
九、防范措施
为了防范命令执行漏洞,开发者应该采取以下措施:
1、严格过滤用户输入:确保所有用户输入都经过严格的过滤和验证,避免恶意命令的注入。
2、使用安全的函数:尽量避免使用可能引发命令执行漏洞的函数,如eval()、system()等,如果必须使用,请确保对输入参数进行严格的过滤和验证。
3、更新和修补系统漏洞:及时更新操作系统和应用程序的安全补丁,修复已知的漏洞和安全问题。
4、限制权限:为Web服务器分配最小权限,限制其对系统资源的访问范围,减少潜在的风险。
5、安全审计和监控:定期对系统进行安全审计和监控,及时发现并处理异常行为和潜在的安全威胁。
各位小伙伴们,我刚刚为大家分享了有关命令执行 漏洞的知识,希望对你们有所帮助。如果您还有其他相关问题需要解决,欢迎随时提出哦!
本文来源于互联网,如若侵权,请联系管理员删除,本文链接:https://www.9969.net/86390.html