浅谈webshell构造之如何获取恶意函数

admin 2026-02-10 14:34:08 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 文章总结了PHPWebshell中动态获取恶意函数以绕过检测的多种技术手法,包括利用get_defined_functions获取内置危险函数、通过get_defined_constants截取常量名构造system、自定义数字转字符算法、利用ParseError异常类截取报错信息获取字符串、借助DirectoryIterator类从可控文件名中提取恶意函数名,以及使用pack函数通过ASCII码或十六进制构造system字符串。这些方法的核心思想是通过PHP内置机制间接拼接或提取恶意函数名,避免直接写入敏感关键字以对抗静态检测。 综合评分: 78 文章分类: 免杀,WEB安全,渗透测试,代码审计,安全工具


运行结果

确实是获取到了

pack

这个函数很有意思的

pack — 将数据打包成二进制字符串

可以构造出字符串

pack(string$format, mixed...$values): string

将输入参数打包成 format 格式的二进制字符串。

这个函数的思想来自 Perl,所有格式化代码(format)的工作原理都与 Perl 相同。但是,缺少了部分格式代码,比如 Perl 的 “u”。

注意,有符号值和无符号值之间的区别只影响函数 unpack(),在那些使用有符号和无符号格式代码的地方 pack() 函数产生相同的结果。

看了一下大概,再看下官方的例子

这是一些它的格式

示例 #1 *pack()* 范例

ounter(line<?php$binarydata&nbsp;= pack("nvc*",&nbsp;0x1234,&nbsp;0x5678,&nbsp;65,&nbsp;66);?>

输出结果为长度为 6 字节的二进制字符串,包含以下序列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42。

那我们按照构造出 system 的思路

ounter(lineounter(lineounter(lineounter(lineounter(line<?php
echo&nbsp;pack("C6", 115, 121, 115, 116, 101, 109);echo&nbsp;pack("H*",&nbsp;"73797374656d");&nbsp;?>

这两个结果都是 system

  • "C6" 是格式字符串,其中 C 表示将后续的六个参数视为无符号字符(即 ASCII 字符),6 表示有六个字符。
  • 传入的参数
  115,&nbsp;121,&nbsp;115,&nbsp;116,&nbsp;101,&nbsp;109

是 ASCII 码值。

  • 115 对应的字符是 s
  • 121 对应的字符是 y
  • 115 对应的字符是 s
  • 116 对应的字符是 t
  • 101 对应的字符是 e
  • 109 对应的字符是 m

构造出来的就是 system

  • "H*" 是格式字符串,其中 H 表示将后续传递的参数视为十六进制字符串,* 表示任意长度。

  • 73797374656d
    

    是一个十六进制表示的字符串。将其转换为 ASCII 字符:

    构造出来的也是system

  • 73 是 s

  • 79 是 y

  • 73 是 s

  • 74 是 t

  • 65 是 e

  • 6d 是 m

学习网安实战课程,戳“阅读原文”


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:蚁景网安 《浅谈 webshell 构造之如何获取恶意函数》

评论:0   参与:  2