四、试图控制Web站点主机
一些攻击利用web服务器上运行的软件的漏洞来让服务器执行攻击者的代码。一类臭名昭著的攻击方法就是向缓存写入大量的数据从而使缓存器崩溃。下面所摘录的一段C++代码就很容易受到这样的攻击,因为它没有边界检查。
void ByYourCommand( char* pszData )
{ char szBuffer[ 255];
strcpy( szBuffer, pszData ); ...}
如果执行strcpy()过程使堆栈溢出,将会产生什么结果呢?图4向你展示了系统堆栈溢出后的情况。如果攻击者在缓存中写入了太多的数据,它将覆盖函数调用记录。这是一个数据结构,它包含了保存函数入口代码的寄存器,还有函数的返回地址。如果攻击者的代码覆盖了函数的返回地址,攻击者就可以在你的计算机上执行任何代码。
图4 通过使缓存溢出,攻击者把攻击代码加载到内存,
代替函数的返回地址,从而执行攻击代码
攻击者是如何把他的攻击代码移植到你的电脑上的呢?他使用的方法就是把代码写进数据缓存,传递这个例子函数的字符串很容易感染上“特洛伊木马”这样的黑客程序。有许多文章已经介绍过这类的攻击方式。
黑客知道易攻击的函数(例如上面所举的函数例子)通常易被回应用户输入的代码所调用。攻击者发送一个不可能的长字符串给服务器。如果缓存溢出,处理他的请求的线程将崩溃。攻击者得到HTTP超时的消息提示就表明请求线程已被破坏。
如何阻止你Web站点的应用程序被利用呢?首先,给系统软件添加最新的安全补丁。然后,检查使用允许直接访问内存的语言(例如:C、C++和Delphi)编写的程序代码,看是否有安全漏洞。
检查代码可以给你无尽的信心,因为你可以发现一个应用程序并不是很容易就受到缓存溢出这样的攻击的。如果你要完全避免这样的问题,只能不使用直接访问内存的语言来编写代码。你可以使用一些脚本语言(例如:JavaScript、Perl)或使用解释性的语言(例如Java)。如果使用安全的语言来编写代码,Web站点的操作员就可以被解放出来,不用天天担心缓存溢出这样的安全攻击。
另外,你也不要盲目地相信各种安全技术,厂商虽然为了推销自己的产品而做出了很好的安全质量承诺,但是你要知道没有任何技术能够保证你的Web不遭受攻击。所以你需要一定的时间和精力去研究和发现Web的缺点,然后找出解决问题的方法。
Web的安全性问题非常复杂,范围很广,在本文中,我们只是从外部的攻击角度出发,讨论了如何避免Web应用程序和Web数据遭到破坏和窃取,来防止非法用户对Web应用程序的越权访问,提高Web站点的安全性。