流行的PHP CMS的历史安全漏洞?

我正在创建一个PHP CMS,我希望公众可以使用它。安全性是一个主要问题,我想向一些流行的PHP CMS学习,如Wordpress,Joomla,Drupal等。他们过去有哪些安全漏洞或漏洞,我可以在应用程序中避免,我可以使用哪些策略来避免它们?我还需要关注哪些其他问题,他们可能没有作为漏洞面临,因为他们从一开始就正确地处理了它?您将包括哪些其他安全功能或措施,从细节到系统级安全方法?请尽可能具体。我通常知道大多数常见的攻击媒介,但我想确保覆盖所有基础,所以不要害怕提到显而易见的。假设 PHP 5.2+。

编辑:我正在将其更改为社区wiki。即使Arkh的出色答案被接受,我仍然对更多的例子感兴趣,如果你有它们的话。


答案 1

跨站点请求伪造 (CSRF)

描述:

基本思想是诱骗用户到一个页面,他的浏览器将向您攻击的CMS发起POST或GET请求。

想象一下,您知道CMS驱动的站点管理员的电子邮件。给他发一些有趣的网页,里面有你想要的任何东西。在此页面中,您将使用CMS的管理面板用于创建新的管理员用户的数据制作一个表单。将这些数据发送到网站管理面板,并将结果显示在网页的隐藏iframe中。瞧,你有自己的管理员帐户。

如何预防 :

通常的方法是在所有表单中生成随机的短寿命(15mn到小时)随机数。当您的CMS收到表单数据时,它会首先检查随机数是否正确。否则,不使用数据。

内容管理系统示例:

更多信息 :

在维基百科页面和OWASP项目上。

密码存储错误

描述:

想象一下,你的数据库被黑客入侵并发布在类似wikileak的东西上。知道很大一部分用户对许多网站使用相同的登录名和密码,您是否希望它们易于获取?

不。您需要减轻数据库数据公开时造成的损害。

如何预防 :

  • 第一个想法是对它们进行哈希处理。这是一个坏主意,因为彩虹表(即使哈希不是md5而是sha512)。
  • 第二个想法:在散列之前添加一个唯一的随机盐,以便黑客必须暴力破解每个密码。问题是,黑客可以快速计算出大量的哈希值。
  • 因此,目前的想法是使散列密码变慢 :您不在乎,因为您不经常这样做。但是攻击者在从每毫秒生成的1000个哈希值增加到1时会哭泣。

为了简化这个过程,您可以使用由一些密码大师开发的函数库phpass

内容管理系统示例:

  • 哎呀!: 盐渍 md5
  • ModX : md5
  • 错别字3:明文
  • Drupal :在这次讨论后切换到phpass。

更多信息 :

phpass 页面

跨站点脚本 (XSS)

描述

这些攻击的目的是使您的网站显示一些将由您的合法用户执行的脚本。

你有两种:持久与否。第一个通常来自用户可以保存的内容,另一个计数由发送的请求给出的参数。下面是一个示例,不是持久的:

<?php
if(!is_numeric($_GET['id'])){
  die('The id ('.$_GET['id'].') is not valid');
}
?>

现在,您的攻击者可以发送链接,例如http://www.example.com/vulnerable.php?id=<script>alert('XSS')</script>

如何预防

您需要筛选输出到客户端的所有内容。最简单的方法是使用htmlspecialchars,如果你不想让你的用户保存任何html。但是,当你让他们输出html(要么是他们自己的html,要么是从bbcode等其他东西生成的),你必须非常小心。这是一个使用img标签的“onerror”事件的老例子:vBulletin漏洞。或者你有旧的Myspace的Samy

内容管理系统示例:

更多信息 :

您可以查看维基百科OWASP。你在ha.ckers页面上也有很多XSS向量。

邮件头注入

描述:

邮件头由 CRLF () 序列分隔。当您使用某些用户数据发送邮件时(例如将其用于“发件人:”或“收件人:”)他们可以注入更多的标题。这样,他们就可以从您的服务器发送匿名邮件。\r\n

如何预防 :

筛选标头中的所有 、 和字符。\n\r%0a%0d

内容管理系统示例:

更多信息 :

维基百科像往常一样是一个良好的开端。

SQL 注入

描述:

古老的经典。当您使用直接用户输入形成 SQL 查询时,就会发生这种情况。如果此输入是根据需要精心制作的,则用户可以完全按照自己的意愿执行操作。

如何预防 :

简单。不要使用用户输入来形成 SQL 查询。使用参数化查询。考虑任何不是由您自己编码的输入作为用户输入,例如来自文件系统,您自己的数据库还是Web服务。

内容管理系统示例:

更多信息 :

维基百科OWASP在这个主题上有非常好的页面。

Http 响应拆分

描述:

与电子邮件标头一样,http 标头由 CLRF 序列分隔。如果您的应用程序使用用户输入来输出标头,则可以使用它来制作自己的标头。

如何预防 :

与电子邮件一样,过滤器 、和用户输入中的字符,然后再将其用作标头的一部分。您还可以对标头进行 url 编码\n\r%0a%0d

内容管理系统示例:

更多信息 :

我会让你猜猜一下,在哪里可以找到很多关于这种攻击的信息。OWASP维基百科

会话劫持

描述:

在这个项目中,攻击者希望使用另一个合法(并且希望经过身份验证)用户的会话。为此,他可以更改自己的会话cookie以匹配受害者的会话cookie,也可以使受害者使用他(攻击者)自己的会话ID。

如何预防 :

这里没有什么是完美的: - 如果攻击者窃取了受害者的cookie,您可以检查用户会话是否与用户IP匹配。但是,如果合法用户使用一些经常更改IP的代理,这可能会使您的网站无用。- 如果攻击者让用户使用自己的会话ID,只需使用session_regenerate_id在用户的权限更改(登录,注销,进入网站的管理部分等)更改用户的会话ID即可。

内容管理系统示例:

更多信息 :

关于这个主题的维基百科页面。

其他

  • 用户 DoSing :如果您通过禁用尝试的用户名而不是尝试来自的IP来防止暴力破解登录尝试,则任何人都可以在2mn中阻止所有用户。生成新密码时也是如此 :在用户确认新密码之前,不要禁用旧密码(例如,通过登录)。
  • 使用用户输入在文件系统上执行某些操作。过滤这个,如果它是癌症与艾滋病混合。这涉及在文件上使用包含和要求,其路径部分来自用户输入。
  • 使用evalsystemexec或任何此类具有用户输入的任何内容。
  • 不要将您不希望通过 Web 访问的文件放在 Web 可访问的目录中。

您可以在OWASP页面上阅读很多东西。


答案 2

我记得phpBB的一个相当有趣的。自动登录 Cookie 包含一个序列化数组,其中包含 userId 和加密密码(无盐)。将密码更改为值为 true 的布尔值,您可以以您想要的任何人身份登录。你不喜欢弱类型语言吗?

phpBB的另一个问题是在正则表达式中,用于突出显示具有回调(带有)的搜索关键字,这使您可以执行自己的PHP代码 - 例如,在不安全的系统上调用系统或仅输出配置文件以获取MySQL登录名/密码。e modifier

所以总结一下这个故事:

  • 注意 PHP 是弱类型 ( )。md5( "secretpass" ) == true
  • 小心所有可能在回调(或更糟的是,eval)中使用的代码。

当然,还有摆在我面前的其他问题。


推荐