vlambda博客
学习文章列表

洞见谈靶场 | 基于 PHP 的应用程序中的漏洞

PHP 是构建 Web 应用程序时最常用的语言之一,类似的其他语言还有 JS、go、RubyPython等 WordPress 和 Joomla 等内容管理系统都基于 PHP 构建。多年来,在 PHP 中发现了一些列漏洞,PHP开发团队也及时发布了新版本来纠正这些问题。今天我们就来探讨一下PHP开发的程序中可能遇到的漏洞。

类型欺骗

请看下面一行代码,

大家认为代码判断结果是什么?如果你的结果是True,恭喜你答对了。但大多人想法不应该是False吗?它们不仅不同,而且数据类型也不同。在比较不同类型的值之前,PHP 将它们转换为单一的可比较类型。在上述情况下,PHP 将尝试从字符串(7 个哈希)中提取整数7,然后将其与整数 7 进行比较,从而给出一个真值。考虑到不同的语言如何提供严格的比较,这乍一看似乎很奇怪。类型杂耍可能导致身份验证和业务逻辑绕过漏洞。

洞见谈靶场 | 基于 PHP 的应用程序中的漏洞

如上所示代码,如果您提供整数,例如0,您就可以以管理员身份登录了。因为在PHP中

洞见谈靶场 | 基于 PHP 的应用程序中的漏洞

当然这种一般的解决办法就是使用三等号(===)代替双等号(==),因为它将检查值以及操作数的类型是否相等。

空字节注入

PHP 5.3.4以前的版本中存在空字节注入,升级之后版本已经解决了此问题。除了 PHP,在 C 中也可以进行空字节注入

假设有一个应用程序要求您上传您的头像。头像需要有 .png 的扩展名才能上传。测试是否可以上传反向 shell 的最简单方法是使用 PHP 创建一个反向 shell,并将其重命名为reverseshell.php%00.png ,而无需使用任何代理。只要文件以 .png 扩展名结尾,它就会被客户端上传,这将允许它因为 .png 扩展名而逃避各种安全检查。但是,在解析它时,将省略 %00 后面的部分,因为它是 NULL 字节。通俗地说,NULL Byte 被视为表示进程结束的信号。结果,它会被服务器解释为 PHP 脚本,然后执行。结果,shell 将被上传,这将允许您在服务器上执行它,从而破坏它。

信息披露和错误处理问题

开发人员在发布新版本时忘记关闭调试器模式是很常见的。这可能会导致泄露完整路径,其中可能包含机密密钥、硬编码凭据或注释等。

将意外的值传递给程序可能会导致错误发生,这可能会导致堆栈跟踪或应用程序的其他内部信息泄漏。通常,它还会显示发生错误的源代码行的正上方和下方的行。当您在网站的用户名或密码字段中输入引号 (') 时,就要考虑 SQL 查询显示的错误消息。攻击者可以使用此信息对应用程序做出有根据的假设,这可能使攻击者更容易闯入系统。然而,这不仅适用于基于 PHP 的应用程序,也适用于用其他编程语言编写的程序。这可用于公开完整路径、公开完整查询的 SQL 查询中的错误等。

当我们发布版本时,关闭代码中的调试器模式并执行源代码审查,并测试可能导致错误的参数。如果导致错误,请确保将用户重定向到 404 页面并确保执行正确的错误处理。一般这些操作即可避免问题出现。

使用危险功能

删除 exec()、system()、passthru() 等函数。exec()、system()等函数用于通过 PHP 执行系统/操作系统命令,这可能导致在系统上执行任意代码和远程执行代码。如果需要保留这些函数,请确保使用 escapeshellarg() 或 escapeshellcmd() 以确保用户无法欺骗系统执行任意命令。

文件包含

洞见谈靶场 | 基于 PHP 的应用程序中的漏洞


应用程序从本地或远程位置读取文件是很常见的。但是当用户能够在本地或远程读取任何文件时,它被称为文件包含漏洞。当应用程序使用用户可控制的参数从服务器获取文件时会发生此漏洞,因此用户将能够操纵文件路径并可以从服务器读取敏感文件。如果恶意行为者能够从服务器本身读取文件,则称为本地文件包含,但如果他能够从远程源读取文件,则称为远程文件包含。

不要简单地将用户输入传递给 include() 函数。对用户的输入执行验证。您还可以维护用户可以访问的文件的白名单。

CSRF(跨站请求伪造)

使用 CSRF 令牌。对于用户发出的每个请求,也会发送一个 CSRF 令牌。攻击者不会知道受害者的 CSRF Token,所以所有的请求都会被渲染为无效,基本上可以解决此项问题。

跨站脚本


XSS 代表跨站点脚本。当应用程序接受用户的输入并且不对用户输入执行任何类型的清理因此浏览器认为源代码是应用程序的一部分并最终执行它时,就会出现此漏洞。XSS 可能导致严重的漏洞,例如窃取 cookie、将用户重定向到不同的网站等等。这可能导致页面变形、会话劫持、帐户接管等。自定义构建的应用程序最容易受到跨站点脚本攻击。

在程序开发中一定要对用户输入的任何输入执行输入清理和验证,拒绝一切无效数据。

总结

尽管开发人员越来越多地转向其他语言,例如 JS、Go 和 Ruby,但仍有大量应用程序正在开发中,并且是用 PHP 开发的。本文包含了一些在基于 PHP 的应用程序中相对常见的漏洞,并进行了详细讨论说明。从一些最严重的漏洞开始,然后逐步发展到更普遍的漏洞。

推荐

重庆洞见信息技术有限公司是一家专注网络安全产品研发、销售、服务及网络安全整体解决方案为一体的高科技企业。我们的网络靶场学习系统是一个包含学习、测评、训练为一体的综合平台,满足各大院校与企业日常授课、实操、考试等需求。旨在提高国民网络安全意识、培养网络安全人才。