渗透之路基础 -- 命令执行漏洞
漏洞原理
当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击,这就是命令执行漏洞。
常见调用的一些系统命令的函数,如PHP中的system(),exec(),shell(),passthru(),popen(),proc_popen()
等。
漏洞产生
-
应用调用执行系统命令的函数
-
存在系统命令的参数可以被用户输入并且拼接到参数中执行
-
未对用户输入进行过滤或过滤不严格
漏洞分类
-
代码层过滤措施不完善
Web应用中通过system函数来调用
-
系统的漏洞造成命令注入
bash破壳漏洞(CVE-2014-6271)
-
调用的第三方中间件或组件中存在的漏洞
如 WordPress 中用来处理图片的ImageMagick组件
Java中的命令执行漏洞(struts2/ElasticsearchGroovy等)
ThinkPHP命令执行
漏洞危害
- 利用Web服务器的权限去执行系统命令或读写文件
- 反弹Shell
- 控制整个网站甚至控制服务器
- 进一步内网渗透
- 等等
PHP中常见的漏洞代码
-
system("$arg");
// 直接输入即可 -
system("/bin/prog $arg");
// 直接输入;ls -
system("/bin/prog -p $arg");
// 和2一样 -
system("/bin/prog --p=\"$arg\"");
// 可以输入";ls;" -
system("/bin/prog --p='$arg'");
// 可以输入';ls;'
在Linux上,上面的
;
也可以用|
、||
代替
; 前面的执行完执行后面的
| 是管道符,显示后面的执行结果
|| 当前面的执行出错时执行后面的
在Windows上,不能用
;
可以用&
、&&
、|
、||
代替
A&B 前面的语句为假则直接执行后面的
A&&B A执行成功,然后才会执行B
A|B A的输出,作为B的输入
A||B A执行失败,然后才会执行B
漏洞防御
- 尽量少用执行命令的函数或者直接禁用
- 参数值尽量使用引号包括
- 在使用动态函数之前,确保使用的函数是指定的函数之一
- 在进入执行命令的函数/方法之前,对参数进行过滤,对敏感字符进行转义