使用黑盒分析从 phpinfo 猜测 PHP 版本和信息

信息安全 php 指纹识别 黑盒子
2021-08-19 13:37:51

介绍

我目前正在试验 PHP 黑盒分析,找不到任何有用的信息。有一些方法可以确定例如 Apache 版本,但对于 PHP,互联网似乎只知道所谓的“PHP 复活节彩蛋”。php.net上,我发现了很多关于 PHP 错误、不推荐使用的函数和更改日志的信息,但无法在任何地方找到与我在这里搜索的内容相似的任何内容(某种综合列表或工具或论文,或者至少是想法) . 所以在重新发明自行车之前,我会在这里碰碰运气。

我们必须接受一些限制,我在下面列出。现在我也接受基于错误的测试(因为如果不启用 PHP 错误消息就很难做出任何猜测),但并不是在每台服务器上都启用了 PHP 错误消息。

我们没有:

  • phpinfo()
  • PHP 复活节彩蛋(因为 PHP>=5.5.0 已弃用且 PHP<5.5.0 可能会使用或expose_php=offX-Powered-By禁用)重写规则)
  • 没有文件夹,来自已知框架的文件
  • 没有特定于框架的 cookie、标头或任何其他参数
  • 对源代码的任何访问(唯一例外:公共验证码生成器或一些 PayPal/Xsolla/whatever... 或其他第三方脚本)
  • 目录列表已关闭
  • 如果有 PHP 错误,那么暴露的路径不会告诉我们 PHP 的版本或框架等
  • 在这个给定的例子中,所谓的“谷歌黑客”并不能帮助我们收集任何额外的信息

服务器是安全的——嘿,伙计,它属于 Chuck Norris——所以没有依赖于利用任何漏洞的解决方案,无论是 0days、SQL 注入、远程代码执行还是其他任何东西。

我们有:

  • PHP 在给定服务器上运行的知识
  • PHP 错误 ( display_errors=on) - 错误的输入类型,例如:foo.php?id[]=1相反foo.php?id=1,错误的脚本,host/foo.php/foo.php允许在一些模糊的边缘情况下导致 PHP 错误(例如文件上传)等。
  • .php 扩展名可能是可选的,所以foo.php?id=bar或只是/foo/bar/

到目前为止我能找到的

猜测PHP版本:

- several built-in PHP functions found by analysing PHP error messages
    → PHP change logs → check if any of exposed functions is deprecated in some PHP versions
- PHP<5.3.X allows strings to contain null bytes \0
    → problems with include(), copy(), ... (but we don't have such vulnerabilities on that server, e.g. only Alphanumeric input and chars: {.,-_} are allowed, special chars will be replaced with '')
- IF PHP<5.3.0: strlen(Array) = 5
- IF PHP>=7.0.0: casting NaN or infinity to integer = always 0, not more undefined and platform-dependent
- .php3: PHP=3.x.x, .php4: PHP=4.x.x. (trivial)

从 phpinfo 猜测信息(没有任何访问权限):

- foo.php?id=99...99 (large number) → IF response contains:
    → "2 147 483 647" → 32bit system (extra whitespaces for better readability)
    → "9 223 372 036 854 775 807" → 64bit system
- max_post_size VS upload_max_filesize
- number of allowed input parameters:
    → p1[]=1&p2[]=1&... (use fake parameters in some parameter checking loop which doesn't expect wrong input type)
    → e.g. error based detection
- float precision: 2.9999999999999999=3 (16 digits) VS 2.999999999999999=2 (15 digits)
- determine "Timeouts", error based

问题

还有什么可以或多或少通用的方法来确定服务器的 PHP 版本并猜测我们通常在 phpinfo() 中看到的更多信息(→ php.ini 和其他 .ini 文件)。

我听说也可以测量服务器响应时间并将它们与使用的 PHP 函数或 PHP 版本相关联,但我没有看到任何好的示例 - PHP 脚本可能非常复杂,所以我不知道如何方法应该有效。

边注

让我们完全矫枉过正,收集所有可能的已知 PHP 漏洞,实施它们并通过增加 PHP 版本的漏洞来暴力破解服务器(如果 PHP=5.xx 的漏洞不起作用,测试更高版本的 PHP 漏洞)(我'我在这里谈论纯粹的理论可能性和学术研究的背景)。除了所有道德和法律问题(我们在这里牢记)之外,还有两种可能性:

a)一些漏洞利用会起作用(服务器将被这个理论漏洞利用工具自动黑客或 DoS-ed,无论如何),我们将能够确定正确的 PHP 版本(任务完成)。

b)所有漏洞利用都将失败,这告诉我们服务器具有最新的 PHP 版本,或者漏洞利用只能应用于我们在这里没有的一些特殊情况。

1个回答

很容易想象如何构建一个分类法来识别不同 PHP 版本和运行时的特征——建立一个实验室,在不同版本的 PHP 上运行不同的框架和应用程序类型等,并观察响应时间、流量等。这个过程很常见,通常可以大大自动化发现差异。PHP 足够有机,可能有许多特定于版本的识别特征。

也就是说,正如帖子本身所说,PHP 不是一个独立的实体。作为被分析系统的一个组件,它必然只是一小部分——一个运行在许多不同操作系统之上的运行时,承载着许多不同且不同的程序,连接到无数种其他系统,等等。

PHP 运行时中的任何特定识别特征都可能因系统其他必要部分的变化而以多种方式混淆,PHP 离不开这些变化。特定版本的 PHP 在线传输字节的方式可能会因为它在 Windows 而不是 Linux 上运行(以及其中的特定版本,它们本身有自己的指纹)而被混淆。

因此,我会警告这种“PHP 黑盒分析”活动,没有其他特别是关于混淆差异的上下文。任何发现都可能受到污染。

与此相关的是,Web 服务黑盒分析当然是一回事,该过程的一个有价值的发现可能是——哦,这个服务看起来像是用 PHP 编写的,可能是版本 A 或版本 B,使用框架 W,在 OS Blah 上,出于 X、Y 和 Z 的原因。总体分类非常有价值。

根据我的经验,在没有对其他必要部分进行分类的情况下,特定于组件的识别尝试经常被误导。