【PHP代码审计】命令注入漏洞


欢迎新同学的光临
… …
人若无名,便可专心练剑


我不是一条咸鱼,而是一条死鱼啊!


命令注入漏洞产生的原因

命令注入攻击可被攻击者用来导入代码到某特定的计算机程序,以改变程序的运行进程或目的。

PHP命令注入则是由于Web应用程序对用户提交的数据过滤不严格,导致黑客可以通过构造特殊命令字符串的方式,将数据提交至Web应用程序中,并利用该方式执行外部程序或系统命令实施攻击,非法获取数据或者网络资源等

简介

PHP命令注入攻击漏洞是PHP应用程序常见漏洞之一

国内著名的PHP应用程序,如discuz!、dedecms等大型程序在网络中均被公布过存在命令注入攻击漏洞,黑客可以通过命令注入攻击漏洞快速获取网站权限,进而实施挂马、钓鱼等恶意攻击,造成的影响和危害十分巨大。

同时,目前PHP语言应用于Web应用程序开发所占比例较大,Web应用程序员应该了解命令注入攻击漏洞的危害。

需要注意PHP命令注入和Sql注入、PHP代码执行漏洞的区别:

  • Sql注入漏洞是将Sql语句注入到后台数据库中进行解析并执行

  • PHP代码执行漏洞是将PHP代码注入到Web应用中通过Web容器执行

  • 命令注入漏洞是指注入可以执行的系统命令(如windows中的CMD命令、linux中的Bash命令)并执行

相关函数

system()、exec()、passthru()、shell_exec()、popen()、proc_open()、pcntl_exec()一共7个函数

命令注入函数,分为三类

第一类函数

包括system()、exec()、shell_exec()、passthru()可以直接传入命令执行并返回结果,其中system()最简单,不需要输出函数,会自动打印命令执行结果,所以这里我们先讲解system()函数

代码如下,变量 $id 获取 get 方式传递的变量名为 bash 的变量值(值为一个字符串),
然后传入system()函数被当作命令执行
<?php
$id = $_GET['bash'];
system("$id");
?>

通过代码分析,构造我们的payload为:?bash=pwd时,页面就能成功返回当前当前.php文件所在目录的地址

其他几个函数类似相同的道理,比如exec()、shell_exec()、passthru()函数

  • exec() 函数
<?php
    $id = $_GET['bash'];
    $get = exec("$id");
    echo $get;
  • sehll_exec 函数
<?php
    $id = $_GET['bash'];
    $get = shell_exec("$id");
    echo $get;
  • passthru 函数
<?php
    $id = $_GET['bash'];
    $get = passthru("$id");
    echo $get;

第二类函数

resource popen ( string $command , string $mode )

打开一个指向进程的管道,该进程由派生给定的 command 命令执行而产生

  • 第一个参数 $command 会被当作命令执行
  • 第二个参数 $mode 决定执行模式,有两个取值r 或者 w ,来指明是读还是写

包括popen()、proc_open(),当使用这类函数传入命令时,命令会执行,但不会返回执行结果。

代码如下:

<?php
    $bash = $_GET['bash']; 
    popen("$bash",'r');

通过代码分析,构造我们的payload为:?bash=ifconfig >> /tmp/popen.txt时,页面没有返回信息,但我们这行命令的意思是将ifconfig 输出的信息写道路径为/temp 下的popen.txt里。

第三类函数

void pcntl_exec ( string $path [, array $args [, array $envs ]] )

以给定参数执行程序:

  • path : path必须时可执行二进制文件路径或一个在文件第一行指定了一个可执行文件路径标头的脚本(比如文件第一行是#!/usr/local/bin/perl的perl脚本)

  • args: args是一个要传递给程序的参数的字符串数组

  • envs :

envs是一个要传递给程序作为环境变量的字符串数组,
这个数组是 key => value格式的,key代表要传递的环境变量的名称,
value代表该环境变量值
$path 为可执行程序的路径,如果是perl或者Bash脚本,
则需要在文件头加上 #!/bin/bash来标识可执行程序路径,
args 表示传递给args表示传递给path程序的参数,$envs 则是执行这个程序的环境变量。 

命令注入漏洞防范

通常我们可以使用白名单对用户输入进行过滤,这是一种通用的手段。

  • 使用自定义函数或函数库来替代外部命令的功能

  • 使用 escapeshellarg()函数来处理命令参数

  • 使用 safe_mode_exec_dir 指定可执行文件的路径

参考链接:https://www.shiyanlou.com/courses/895


我自横刀向天笑,去留肝胆两昆仑


猜你喜欢

转载自blog.csdn.net/Ananas_Orangey/article/details/120591875
今日推荐