前言:
接上次代码执行漏洞之后,还有一个跟它相似的命令执行漏洞。这两者的区别就是代码执行漏洞完全限制与语言本身,也就是php代码执行漏洞就要遵循PHP语言规则才能执行;而命令执行漏洞只受限制于网站所在系统,也就是Linux网站遵循Linux系统命令,Windows网站遵循windows系统命令。
参考文献:水清云影的教学视频
正文:
关于命令执行漏洞的概念:命令执行漏洞是程序将不安全的用户数据(表单,cookie,http头等)传递给系统shell时,就有可能存在命令注入。该漏洞的存在原理和代码执行漏洞有点类似,只是使用的函数有所不同。
关于命令执行漏洞的利用条件:一是存在可执行系统命令的高危函数,二是用户可以直接或间接控制该函数的参数,三是对该参数的过滤不够严谨。
关于命令执行漏洞的类型:
- 代码层过滤不严造成的命令执行漏洞;
- 系统本身存在的命令执行漏洞;
- 调用的第三方组件存在命令执行漏洞。
PHP中可能造成命令执行漏洞的函数:
system()函数
:原型string system( string $command [,int &$return_var ])
,本函数执行command
参数所指定的命令, 并且输出执行结果。如果 PHP 运行在服务器模块中, system() 函数还会尝试在每行输出完毕之后, 自动刷新 web 服务器的输出缓存。passthru()函数
:原型void passthru(string $command [,int &$return_var])
,passthru() 函数 也是用来执行外部命令(command
)的。常用来执行诸如 pbmplus 之类的可以直接输出图像流的命令。 通过设置 Content-type 为 image/gif, 然后调用 pbmplus 程序输出 gif 文件, 就可以从 PHP 脚本中直接输出图像到浏览器。exec()函数
:原型string exec(string $command[,array &$output[,int &$return_var]])
,执行command
参数所指定的系统命令。shell_exec()函数
:原型string exec( $command, [$output, [return_var]])
,PHP中的一个内置函数,用于通过shell执行命令并以字符串的形式返回完整的输出。shell_exec是backtick操作符的别名,用于*nix。如果命令失败,则返回NULL,并且这些值对于错误检查不可靠。
命令执行函数使用实例:
system()
1
2
3
4
5system.php
<?php
$shell=$_GET['shell'];
system($shell);
?>执行效果如下:
这个函数可以直接将命令带入系统之中,并将结果存为字符串返回输出到浏览界面。而且该函数还可以将结果当作一个字符串返回值进行操作。
passthru()
1
2
3
4
5passthru.php
<?php
$shell=$_GET['shell'];
passthru($shell);
?>执行效果如下:
该函数直接将结果打印到浏览器上,没有返回值。
exec()函数
1
2
3
4
5exec.php
<?php
$shell=$_GET['shell'];
echo exec($shell);
?>执行效果如下:
该函数执行命令后并不会将结果返回到浏览器上,而且之后保存其中最后一行的结果,这里为方便演示,使用了一个输出关键字,但这并不代表结果是exec函数输出的,只能说明exec在执行完命令后会保存最后一行结果。
shell_exec()
1
2
3
4
5shell_exec.php
<?php
$shell=$_GET['shell'];
echo shell_exec($shell);
?>执行效果如下;
该函数与exec函数相似,同样不会直接输出结果到浏览器,但会将命令执行后的所有结果保存下来。与之相似的还有一个反引号,功能与shell_exec()函数完全一样。
命令执行漏洞的防范:
- 代码层方面对用户的传参进行严格的过滤,如果能将参数写死,尽量不要用可控变量代替;
- 系统方面注意定期为系统打补丁;
- 有命令执行了漏洞的第三方软件能不要尽量不要使用。
总结:
本篇文章中主要记录代码层造成的命令注入漏洞,系统层面和第三方组件暂时不做总结,以后找到环境了在总结一波,这些就是我目前掌握的命令执行漏洞,如果有有不正确和不完整的地方,还请大佬们多多批评: