一、缓冲区溢出攻击的原理
程序运行时,其在内存中的存储可划分为四个区:代码区、数据区、栈区、堆区,除了代码区,其他三个区都是缓冲区。栈保存了当前正在执行的函数的相关信息:
其中,返回地址是调用程序指令保存在内存中的地址,计算机执行完当前函数以后,将根据返回地址找到下一个程序指令并执行。
栈存储内容时是从下往上填充的,所以函数传参时,如果传递的数据大于参数缓冲区所准备的空间,超出空间的部分数据会覆盖下一个可用的内存地址,即返回地址缓冲区。缓冲区溢出攻击就是通过设置攻击步骤,使得参数缓冲区溢出,并在返回地址缓冲区中填充恶意代码的特定地址,这可能是同一台服务器上的其他内存地址或者保存在远程服务器上的程序指令,这样计算机执行完当前函数以后,就会根据返回地址缓冲区中的恶意代码地址找到恶意代码并执行,攻击者目的即可达成。
二、缓冲区溢出的后果
1. 注入式攻击:允许黑客插入代码、SQL语句或者任何可以注入应用程序的数据。
2. 特定代码攻击:在这种攻击中,黑客可以获得服务器操作系统的直接和根用户级别的访问,这样他们可以完全控制服务器。
3. 拒绝访问攻击:可以导致服务器在执行恶意代码后陷入困境(通常是一个无限循环或其他没有意义的指令),这样服务器就没有资源去执行其他正常任务。
4. 远程探索:也就是你的服务器被作为中间转接点来攻击其他服务器。
三、PHP规避缓冲区溢出攻击的理论基础
设计PHP本来是用于规避缓冲区溢出攻击的,那么其理论基础是什么呢?之所以会出现缓冲区溢出,是因为存储在参数缓冲区中的变量有数据大小的限制,当传递接收的数据超出大小限制,就发生缓冲区溢出,从而为攻击者提供了机会。而PHP本身并没有设置能够保存的数据大小限制,所以也就不会发生溢出。
但这只是在理论上行得通,现实中并没有这种无大小限制的变量。变量大小是有限制的,这些限制源自服务器上的可用内存以及PHP解释器所依赖的C语言和函数库。
四、如何规避缓冲区溢出攻击
1. 关注最新的安全警告
例如安全监察组织的安全公告,并做出相关应对措施,例如系统升级、语言版本升级、数据库版本升级等等。
2. 通过变量整理预防缓冲区溢出攻击
对变量数据进行整理、验证,其中,防止缓冲区溢出攻击最重要的检查是对数据长度的检查。
需要检查的主要数据来源:
(1)用户输入
(2)外部数据源,例如远程数据库、RSS、data feeds甚至命令行
(3)系统函数