我正在创建一个PHP CMS,我希望它能被公众使用.安全性是一个主要的问题,我想学习一些流行的PHP CMS,如Wordpress,Joomla,Drupal等.他们过去有哪些安全漏洞或漏洞,我可以避免在我的应用程序中使用我可以用什么策略来避免它们?我需要关注的其他问题是,他们可能没有面对漏洞,因为他们从一开始就正确处理了漏洞?您还需要提供哪些额外的安全功能或措施,从微小的详细信息到系统级安全方法?请尽可能具体.我一般都知道大多数常见的攻击媒介,但我想确保所有的基础都被覆盖,所以不要害怕提及明显的.假设PHP 5.2+.
编辑:我正在将其更改为社区维基.即使Arkh的优秀答案被接受,如果你有它,我仍然对进一步的例子感兴趣.
基本思想是欺骗用户访问他的浏览器将向您攻击的CMS发起POST或GET请求的页面.
想象一下,您知道CMS驱动的站点管理员的电子邮件.通过电子邮件向他发送一些有趣的网页,无论你想要什么.在此页面中,您可以使用CMS的管理面板使用的数据制作表单,以创建新的管理员用户.将这些数据发送到网站管理员面板,结果显示在您网页的隐藏iframe中.Voilà,您拥有自己的管理员帐户.
通常的方法是在所有表单中生成随机短寿命(1500万到小时)的随机数.当CMS收到表单数据时,它首先检查现时是否正确.如果不是,则不使用数据.
CMS变得简单
的Joomla!
Drupal的
镆铘
在维基百科页面和OWASP项目上.
想象一下,你的数据库被黑客攻击并发布在像wikileak这样的东西上.知道很多用户使用相同的登录名和密码进入很多网站,您是否希望它们易于获取?
不可以.如果您的数据库数据公开,您需要减轻损失.
第一个想法是哈希它们.由于彩虹表,这是一个坏主意(即使散列不是md5而是sha512).
第二个想法:在散列之前添加一个独特的随机盐,这样黑客就必须强制每个密码.问题是,黑客可以快速计算大量哈希值.
因此,目前的想法是让密码散列缓慢:你不关心,因为你不经常这样做.但是,当他从每毫秒产生的1000个哈希值变为1时,攻击者会哭.
为了简化这个过程,您可以使用由一些密码大师开发的库phpass.
的Joomla!:盐渍md5
ModX:md5
错字3:明文
Drupal:在讨论之后切换到phpass .
该phpass页面.
这些攻击的目的是让您的网站显示一些将由您的合法用户执行的脚本.
你有两种:持久性或非持久性.第一个通常来自用户可以保存的内容,另一个来自发送的请求给出的参数.这是一个例子,而不是持久性的:
现在你的攻击者可以发送像这样的链接 http://www.example.com/vulnerable.php?id=
您需要过滤输出到客户端的所有内容.最简单的方法是使用htmlspecialchars,如果你不想让你的用户保存任何HTML.但是,当你让他们输出html(他们自己的html或其他东西,如bbcode)时,你必须非常小心.这是一个使用img标签的"onerror"事件的旧示例:vBulletin漏洞.或者你有老Myspace的Samy.
CMS变得简单
Mura CMS
Drupal的
镆铘
你可以查看维基百科和OWASP.你在ha.ckers页面上也有很多XSS向量.
邮件头由CRLF(\r\n
)序列分隔.当您使用一些用户数据发送邮件时(比如将它用于From:或To :),他们可以注入更多标题.有了这个,他们可以从您的服务器发送匿名邮件.
过滤所有\n
,\r
,%0a
和%0d
在你的标题字符.
Jetbox CMS
维基百科像往常一样是一个良好的开端.
老经典.使用直接用户输入形成SQL查询时会发生这种情况.如果这个输入是按照需要制作的,那么用户可以完全按照自己的意愿行事.
简单.不要使用用户输入形成SQL查询.使用参数化查询.考虑任何未被自己编码为用户输入的输入,例如来自文件系统,您自己的数据库或Web服务.
Drupal的
的Joomla!
镆铘
帕尔斯CMS
维基百科和OWASP在这个主题上有很好的页面.
与电子邮件标头一样,http标头由CLRF序列分隔.如果您的应用程序使用用户输入来输出标题,他们可以使用它来制作自己的标题.
像电子邮件,过滤器\n
,\r
,%0a
和%0d
从用户输入的字符之前使用它作为一个报头的一部分.你也可以对你的标题进行urlencode.
德雷克CMS
Plone CMS
WordPress的
我会让你猜一下你在哪里可以找到关于这种攻击的很多信息.OWASP和维基百科.
在这一个中,攻击者想要使用另一个合法(并且希望经过身份验证的)用户的会话.为此,他可以更改自己的会话cookie以匹配受害者的一个,或者他可以让受害者使用他的(攻击者)自己的会话ID.
这里没有什么是完美的: - 如果攻击者窃取受害者的cookie,您可以检查用户会话是否与用户IP匹配.但是,如果合法用户使用一些经常更改IP的代理,这可能会使您的网站无用.- 如果攻击者让用户使用自己的会话ID,只需使用session_regenerate_id在用户权限发生变化时更改用户的会话ID(登录,注销,进入网站管理员等).
的Joomla!和Drupal
Zen Cart
关于这个主题的维基百科页面.
用户DoSing:如果您通过禁用尝试的用户名来阻止强制登录尝试,而不是尝试来自IP,则任何人都可以在2mn内阻止所有用户.生成新密码时也一样:在用户确认新密码之前不要禁用旧密码(例如,通过使用它进行登录).
使用用户输入在文件系统上执行某些操作.如果是癌症与艾滋病混合,就过滤掉它.这涉及对文件使用include和require,哪些路径部分来自用户输入.
使用eval,system,exec或任何此类用户输入.
不要在Web可访问目录中放置您不希望Web访问的文件.
您可以在OWASP页面上阅读很多内容.
我记得phpBB中有一个很有趣的.自动登录cookie包含一个包含userId和加密密码(无盐)的序列化数组.将密码更改为值为true的布尔值,您可以以任何人的身份登录.你喜欢弱文化的语言吗?
phpBB的另一个问题是正则表达式突出显示具有回调的搜索关键字(使用e modifier
),这使您能够执行自己的PHP代码 - 例如,系统调用不安全的系统或只输出配置文件获取MySQL登录名/密码.
所以总结这个故事:
注意PHP被弱化(md5( "secretpass" ) == true
).
小心可能在回调中使用的所有代码(或更糟糕的是,eval).
当然,在我之前已经提到过其他问题.