文章总结: 文章总结了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 = pack("nvc*", 0x1234, 0x5678, 65, 66);?>
输出结果为长度为 6 字节的二进制字符串,包含以下序列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42。
那我们按照构造出 system 的思路
ounter(lineounter(lineounter(lineounter(lineounter(line<?php
echo pack("C6", 115, 121, 115, 116, 101, 109);echo pack("H*", "73797374656d"); ?>
这两个结果都是 system
"C6"是格式字符串,其中C表示将后续的六个参数视为无符号字符(即 ASCII 字符),6表示有六个字符。- 传入的参数
115, 121, 115, 116, 101, 109
是 ASCII 码值。
115对应的字符是s121对应的字符是y115对应的字符是s116对应的字符是t101对应的字符是e109对应的字符是m
构造出来的就是 system
-
"H*"是格式字符串,其中H表示将后续传递的参数视为十六进制字符串,*表示任意长度。 -
73797374656d是一个十六进制表示的字符串。将其转换为 ASCII 字符:
构造出来的也是system
-
73是s -
79是y -
73是s -
74是t -
65是e -
6d是m
学习网安实战课程,戳“阅读原文”
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:蚁景网安 《浅谈 webshell 构造之如何获取恶意函数》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论