RCE毛病函数

打印 上一主题 下一主题

主题 941|帖子 941|积分 2823

一、rce毛病概述


        在Web应用开发中为了灵活性、简便性等会让应用调用代码执行函数或体系下令执行函数处理,若应用对用户的输入过滤不严,容易产生远程代码执行毛病或体系下令执行毛病;
二、常见RCE毛病函数


1.体系下令执行函数



(1)   system():能将字符串作为OS下令执行,且返回下令执行效果;自带有“输出”,直接输出即可实现。
实例测试:
   在文件中写入效果 :
  <?php
  system('echo "<?php phpinfo();//" > 11111.php');
  


   效果实现 :  先输入   127.0.0.1/demo.php    页面创建成功后输入   127.0.0.1/11111.php  即可
  

 
(2)exec():能将字符串作为OS下令执行,但是只返回执行效果的最后一行(约等于无回显);没有“输出” 必要自己写入,才可实现。
实例测试:
   <?php
  // 输出运行中的 php/httpd 进程的创建者用户名
  // (在可以执行 "whoami" 下令的体系上)
  $output=null;
  $retval=null;
  exec('whoami', $output, $retval);
  echo "Returned with status $retval and output:\n";
  print_r($output);
  ?>
  效果实现:

(3)passthru():能将字符串作为OS下令执行,只调用下令不返回任何效果,但把下令的运行效果原样输出到标准输出设备上;与system() 类似,也可以直接输出。
实例测试:
   <?php
  passthru("whoami");
  ?>
  

(4)shell_exec():能将字符串作为OS下令执行,通过 shell 执行下令并将完备的输出以字符串的方式返回。
实例测试:
   <?php
  $output = shell_exec('whoami');
  echo "<pre>$output</pre>";
  ?>
  

(5)popen():打开进程文件指针,fread管道 ,打开了一个指向进程的管道,该进程由派生给定的 command 下令执行而产生。
注:有一个模式   'r' 表示阅读,'w' 表示写入。
在 Windows 上,popen() 默认是文本模式,即任何从管道中读取/写入的 \n 字符都将转换为 \r\n。如果制止这种情况,可以通过将 mode 设置为 'rb' 和 'wb' 来强制执行二进制模式。
实例测试:
   <?php
  $handle = popen('whoami', 'r');
  echo "'$handle'; " . gettype($handle) . "\n";
  $read = fread($handle, 2096);
  echo $read;
  pclose($handle);
  ?>
  

(6)proc_open():与popen()类似,但是 proc_open() 提供了更增强盛的控制步伐执行的本事。
pcntl_exec():在当进步程空间执行指定步伐;
   <?php
  $descriptorspec = array(
     0 => array("pipe", "r"),  // 标准输入,子进程从此管道中读取数据
     1 => array("pipe", "w"),  // 标准输出,子进程向此管道中写入数据
     2 => array("file", "d:/aaa.txt", "a") // 标准错误,写入到一个文件
  );
  $process = proc_open('whoami', $descriptorspec, $pipes);
  if (is_resource($process)) {
      $output =stream_get_contents($pipes[1]);
      fclose($pipes[1]);
      $returnValue =proc_close($process);
      echo "0utput:".$output;
      echo "Return Value:".$returnValue;
  }
  ?>
  

注:反引号``:反引号``内的字符串会被解析为OS下令;

2.代码执行函数


(1)eval():将字符串作为php代码执行;
(2)assert():将字符串作为php代码执行;
(3)call_user_func():回调函数,第一个参数为函数名,第二个参数为函数的参数;
   <?php
  call_user_func('assert',$_REQUEST['pass'])
  ?>
    127.0.0.1/demo.php?pass=phpinfo()
  
 
(4)array_filter():使用回调函数过滤数组的元素
base64 :assert 编码  YXzZXJ0
   <?php
  $e = $_REQUEST['e'];  //编码assert
  $arr = array($_POST['pass'],);  //phpinfo()
  array_filter($arr,base64_decode($e));  //'assert'
  ?>
    127.0.0.1/demo.php?pass=phpinfo()&e=YXNzZXJO
  

注:可变函数:若变量后有括号,该变量会被当做函数名为变量值(前提是该变量值是存在的函数名)的函数执行;


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

灌篮少年

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表