介绍
我目前正在试验 PHP 黑盒分析,找不到任何有用的信息。有一些方法可以确定例如 Apache 版本,但对于 PHP,互联网似乎只知道所谓的“PHP 复活节彩蛋”。在php.net上,我发现了很多关于 PHP 错误、不推荐使用的函数和更改日志的信息,但无法在任何地方找到与我在这里搜索的内容相似的任何内容(某种综合列表或工具或论文,或者至少是想法) . 所以在重新发明自行车之前,我会在这里碰碰运气。
我们必须接受一些限制,我在下面列出。现在我也接受基于错误的测试(因为如果不启用 PHP 错误消息就很难做出任何猜测),但并不是在每台服务器上都启用了 PHP 错误消息。
我们没有:
phpinfo()- PHP 复活节彩蛋(因为 PHP>=5.5.0 已弃用且 PHP<5.5.0 可能会使用或
expose_php=off(X-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 版本,或者漏洞利用只能应用于我们在这里没有的一些特殊情况。