找回密码
 立即注册
首页 业界区 安全 浅谈 webshell 构造之如何获取恶意函数

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

裴涛 2025-7-4 15:50:18
前言

这篇文章主要是总结一下自己学习过的 “恶意函数” 篇章,重点是在如何获取恶意函数。
get_defined_functions

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)
get_defined_functions — 返回所有已定义函数的数组
我们主要是可以通过这个获取危险的函数
比如
1.png

比如
[img=720,62.608695652173914]https://www.yijinglab.com/guide-img//d9634e2f-3b66-42e7-8279-c0877cdd70e5/d0f60b45-92c9-417b-be93-62a733ff9d5e.png[/img]

当然还有许多,如何执行命令就很简单了
代码如下
  1. [/code][align=center] 2.png [/align]
  2. [size=5]get_defined_constants[/size]
  3. get_defined_constants — 返回所有常量的关联数组,键是常量名,值是常量值
  4. 那获取的常量是不是可以为我们所用呢?
  5. [align=center][img=720,377.23943661971833]https://www.yijinglab.com/guide-img//d9634e2f-3b66-42e7-8279-c0877cdd70e5/65650a81-4fa2-4d9e-9175-a8f061fd00cf.png[/img][/align]
  6. 可以看到是有 system 关键字的,我们就可以直接去获取它的 key,然后截取不就是 system 了吗
  7. 代码如下
  8. [code]
复制代码
[img=720,637.1270718232045]https://www.yijinglab.com/guide-img//d9634e2f-3b66-42e7-8279-c0877cdd70e5/f4594a26-e2e4-4301-9905-d759791f24e1.png[/img]

自定义方法

通过自定义的方法,从毫无头绪的数字获取到 system 函数,拿出广为流传的例子
  1. [/code]以上示例的输出类似于:
  2. [code]<?php
  3. function fun($a){
  4.    $s = ['a','t','s', 'y', 'm', 'e', '/'];
  5.    $tmp = "";
  6.    while ($a>10) {
  7.        $tmp .= $s[$a%10];
  8.        $a = $a/10;
  9.    }
  10.    return $tmp.$s[$a];
  11. }
  12. echo fun(451232);
复制代码
那岂不是我们如果可以控制自己的文件名或者目录,那不就构造出来了吗
代码如下
  1. [/code][align=center][img=720,156.38709677419354]https://www.yijinglab.com/guide-img//d9634e2f-3b66-42e7-8279-c0877cdd70e5/4c81ad2b-fbcb-4d4f-b435-6ba9ed8a7585.png[/img][/align]
  2. 运行结果
  3. [align=center] 3.png [/align]
  4. 确实是获取到了
  5. [size=5]pack[/size]
  6. 这个函数很有意思的
  7. pack — 将数据打包成二进制字符串
  8. 可以构造出字符串
  9. pack(string $format, mixed ...$values): string
  10. 将输入参数打包成 format 格式的二进制字符串。
  11. 这个函数的思想来自 Perl,所有格式化代码(format)的工作原理都与 Perl 相同。但是,缺少了部分格式代码,比如 Perl 的 “u”。
  12. 注意,有符号值和无符号值之间的区别只影响函数 unpack(),在那些使用有符号和无符号格式代码的地方 [b]pack()[/b] 函数产生相同的结果。
  13. 看了一下大概,再看下官方的例子
  14. 这是一些它的格式
  15. [align=center] 4.png [/align]
  16. [b]示例 #1 *pack()* 范例[/b]
  17. [code]
复制代码
输出结果为长度为 6 字节的二进制字符串,包含以下序列 0x12, 0x34, 0x78, 0x56, 0x41, 0x42。
那我们按照构造出 system 的思路
  1. [/code]这两个结果都是 system
  2. [list]
  3. [*]"C6" 是格式字符串,其中 C 表示将后续的六个参数视为无符号字符(即 ASCII 字符),6 表示有六个字符。
  4. [*]传入的参数
  5.  
  6. [code]<?php$dir = new DirectoryIterator(dirname(__FILE__));foreach ($dir as $fileinfo) {    echo $fileinfo->getFilename() . "\n";}?>
复制代码
 
是 ASCII 码值。

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

构造出来的就是 system

  • "H*" 是格式字符串,其中 H 表示将后续传递的参数视为十六进制字符串,* 表示任意长度。
    1. .
    2. ..
    3. apple.jpg
    4. banana.jpg
    5. index.php
    6. pear.jpg
    复制代码
     
    是一个十六进制表示的字符串。将其转换为 ASCII 字符:

    • 73 是 s
    • 79 是 y
    • 73 是 s
    • 74 是 t
    • 65 是 e
    • 6d 是 m
    构造出来的也是system

[img=720,598.3673469387755]https://www.yijinglab.com/guide-img//d9634e2f-3b66-42e7-8279-c0877cdd70e5/50e0dd64-f55e-4807-9b4e-7fb775ea1d55.png[/img]

更多网安技能的在线实操练习,请点击这里>>
  

来源:豆瓜网用户自行投稿发布,如果侵权,请联系站长删除

相关推荐

您需要登录后才可以回帖 登录 | 立即注册