文章目錄
  1. 1. 变量覆盖漏洞原理
  2. 2. 修复方案
  3. 3. 一些思考
  4. 4. 参考资料

变量覆盖漏洞原理

变量覆盖漏洞原理比较简单,《代码审计》书中和网上都有了不少分析。主要是以下几个场景:$$使用不当,extract()函数使用不当,parse_str()函数使用不当,import_request_variables()使用不当,开启了全局变量注册等。具体可以参考代码审计|变量覆盖漏洞

修复方案

从原理上来讲,只需要注册变量之前判断变量是否存在,如果存在就跳过或者退出变量注册,返回错误信息,就可以避免变量覆盖漏洞。

一些思考

PHP的全局变量相关的设计增强了编程了的灵活性,但是也引入的不少安全问题。后期也进行了不少改进,注册全局变量功能的移除也证明了自动注册全局变量这个事情是本身是一个不好的设计。

register_globals 从php5.4起移除。

import_request_variables 自php5.4移除

而extract的第二个参数。如果不指定,默认值是EXTR_OVERWRITE。覆盖已经存在的变量。

默认会覆盖变量这个设计,我觉得违背了安全设计原则中的默认安全了。虽然如果默认skip的话可能会导致bug,但是默认覆盖也是会导致更严重的安全bug。所以采用默认加前缀,或者默认跳过都应该是更好的选择。也许后续的php版本中会有改进。

参考资料

代码审计之wdcp多处漏洞

文章目錄
  1. 1. 变量覆盖漏洞原理
  2. 2. 修复方案
  3. 3. 一些思考
  4. 4. 参考资料