数据库注入( inject)是黑客入侵大型网站常用的手法之一。与其他攻击方式相比,这种方式能轻易穿透防火墙,绕过账户破解等障碍查询、修改、删除数据库内的重要数据资料。在这一章中,我们先了解注入攻击的原理及如何发现注入点,然后学习如何防范这种攻击。
SQL注入攻击概述
一个水桶无论有多高,它盛水的高度取决于最低的那块木板,这就是著名的短板理论。网站的安全系统亦如此,即使拥有严密的防火墙保护及安装了高效的杀毒软件,链接数据库的网站源代码也可能是“木桶”中最低的那块木板,只要黑客构造特殊的注入语句,便可突破重重防护,威胁储存大量重要数据的数据库。
SQL注入攻击的原理
SQL(Structured Query Language,结构化查询语言)是一种用于检索、操控和存取数据库的数据库子语言。它的核心只有Seleci、Cre:rUe、insert、update、delete、grant六个常用动词,没有任何可用的流程控制语句,必须依赖于数据库管理系统才能执行。这种功能看似单一、只能用于与数据库交互的语言,事实上为何成为注入攻击的帮凶?
在揭开这个谜底之前,我们先来做一个实验,假设有一个简单的数据奁询系统,只要在Check.htm输入学号,它就会调用Cx.asp该学员成绩(cj表)中的语文(字段ywcj)成绩,
接下来,在浏览器中执行:,正是第二条额外命令,在系统不允许的情况下,偷偷修改了数据库中的成绩。同理,用户只要精通SQL数据库,就可以在“;”号后任意添加要执行的语句.以达到各种入侵的目的。利用网站应用程序的Bug,从网址栏注入额外的执行语句并在服务器端执行,这就是SQL注入攻击的真相所在。
当然,要构造出合适的攻击语句并不是一件简单的事情。在实际攻击中,不太可能获得网站的源程序,要猜解数据库名称及字段将会非常困难,
SQL注入攻击的危害
从SQL攻击的原理不难看出,程序人员编写的网站程序不够严密,是SQL注入攻击得逞的主要原因之一,所以,注重安全的网站会十分注意过滤用户输入数据的合法性,始终使用相关函数行检测输入内容的类型、长度、格式等内容,然后才提交给数据库处理。但此举并不能完全防御SQL注入式攻击。
因为许多网站放置在服务供应商数据中心的共享主机上,同一台主机可能有数个网站同时运作,只要其中一个网站存在SQL注入漏洞,黑客成功入侵就可以获得数据库的操作权限。假如服务供应商没有严格限制数据库权限,那么,所有共享这台数据的其他网站将陷于危险的境地。
SQL攻击具有隐蔽性,通常以大量的扫描作为前奏,管理员可以轻易通过浏览防火墙日志得知网站受到安全威胁。SQL注入攻击,利用公开的80端口非法注入SQL命令,防火墙将它当成普通的访问操作,根本不会发出警报,所以,许多受到SQL注入攻击、被篡改数据的主机,往往在造成重大损失后才会被管理员察觉
寻找SQL注入攻击目标
黑客是如何发现存在SQL注入问题的主机呢?方法有人工判断、软件扫描两种。其中,软件扫描通常用f快速、批量评估动态网站中具有提交功能的文件是否存在安全问题,优点是处理速度快,缺点是经常会发生误判。人工判断是指手动构造注入语句,通过试探指定的动态页面拽出注入漏洞,这种方式通常用于攻击严密防护且不存在已知注入漏洞的安全网站。
使用NBSI探测SQL注入漏洞虽然NB( NetBuilder)联盟已经解散,但他们推出的NBSI却成为探测SQL注入漏洞的’代经典名器。利用它提供的自动扫描、注入漏洞分析、表单猜解和列名猜解等功能,可以快速找出程序中的漏洞,并猜解数据库的大致结构。使用NBSI探测SQL注入漏洞的方法如下:
留意结果为中等,较高、极高的项目。从程序底部的“注入地址”栏位复制相应的链接,以便进一步实行SQL注入攻击。
假如程序设计人员对数据表的命名方式比较独特,那么,免赞版猜解的难度将大大增加,建议用户寻找全自动猜解的商用版本,或参考“12.3.2手动获取数据库表及字段名称”小节,通过命令方式获得数据表及字段名称。
手动获取数据库表及字段名称继续以“12.1+1 SQL注入攻击的原理”为例,由于cx.asp是提交查询请求并输出查询结果的页面,所以,不妨构造以下语句,让数据库报错并逐一给出表单字段。
·报出当前表名和第一个字段名:
如果原来的查询网址是http:xxxx,那么,就变成。
此时,查询必然会出错,并在出错信息中提供表单名称以及表单的第一个字段名称No,如图12-17所示。
报出第二个及其他字段:
http://正常浏览网址group by第一个字段名having l=1--
如果原来的查询网址是http:xxxx,获得的第一个字段为No,那么,接下来输入,即可获得第二个字段ywcj,如图12-18所示。
依次采用同样的方法,可以获取该表的所有字段名称。取得表名称和字段名称之后,只要运用SQL语言基础,即可构造出自己所需的注入语句了。
利用SQL注入漏洞展开攻击
这些程序仅针对使用特定源码构造的网站才有效,随着网站升级,这些利用程序将会失效。所以,黑客高手通常不会四处寻觅什么注入利用程序,而会开动脑筋,自行利用漏洞展开攻击。
如何构造注入语句
发现网站存在注入漏洞后,如何利用漏洞展开攻击呢?其实,只需在网址后附上自己构造的注入语句就可以了。例如在“SQL注入攻击的原理”一节中,用于修改成绩的“;update cj set ywcj=78where No=12”就是一个注入语句。注入语句是如何构造出来的呢?这主要从以下三个方面着手:
第一,获得数据库的表及字段名称。此类资料是构造注入语句的基础。如果还没有获得表及字段名称,建议先参阅“获取数据库表及字段名称”一节的内容。
第二,从网页功能和传输参数逆推存在漏洞的ASP网页.原有的数据库处理语句。要做好这一步,除了要具备SQL语言基础之外,还需要一定的经验。假如你对这方面感到比较棘手,建议先下载并研究主流的网站模板。从网站源代码中可以接触到形形色色的查询、修改、更新语句。
第三,深入了解SQL语言。要构造注入语句,SQL语言是必须掌握的技术基础。假如对SQL语言一知半解,只能依赖工具软件,注入效果自然会大打折扣。
经典注入语句剖析
针对入门黑客薄弱的SQL语言基础
防御SQL注入攻击
分析SQL注入攻击的原理后发现,这类攻击并非利用系统或数据库的漏洞,即使系统及SQL数据库本身安装了所有补丁也无济于事。由于注入攻击利用于Web服务器必须开放的80端口,所
以防火墙也帮不上忙。面对SQL注入攻击,数据库管理员、系统管理员及网络管理员真的完全无能为力吗?当然不是,他们可以通过设置将SQL注入攻击的危险降至最低。
1.数据库管理员
数据库管理员从数据库服务器上移除所有示例脚本,减少冗余脚本造成的安全隐患。
移除不需要使用的储存过程,特别是访问注册表的储存过程,使用SQL 2000等旧式数据库的管理员必须移除cmd Shefl储存过程。
为每一个网站分配一个专用的低特权账户,避免使用sa、dba等访问整个服务器的高权限账户。
2.应用程序设计员
解除SQL注入攻击威胁唯一的办法是完善网站的源程序,加强用户提交内容检查与过滤机制。需要做的工作主要有以下几项:
·在一些长度固定的输入中严格检测输入长度。例如根据证件号码查询时,检查用户提交的内容是否超长,超长则不予处理。
·拒绝包含二进制数据、转义序列和注释字符的输入内容,这有助于防止脚本注入,防止某些缓冲区溢出攻击。例如在处理用户邮箱地址时可以参考以下源代码
·养成良好的编程习惯,多使用安全参数。在SQL Server数据库中提供的Parameters集合,具有检查和验证双重功能。它首先检查用户提交内容的长度,接着会将输入内容转换为纯文本资料,从而封堵了黑客构造注入语句的可能。
3.系统管理员
虽然注入攻击可以绕过防火墙、防病毒等安全防线,但是系统管理员也可以作出一些防御设置,以提高系统抵御SQL注入攻击的能力。
.移除不必要的系统组件和命令行工具,让入侵者难以获取有用的Shell,或者利用系统命令工具进一步入侵主机。假如你已经删除了XP的命令行,那么黑客注入http://xxxx ”一语句只能无功而返了。
·不要轻易开放iis等网站后台程序的写入、执行功能
本文内容所提及均为本地测试或经过目标授权同意,旨在提供教育和研究信息,内容已去除关键敏感信息和代码,以防止被恶意利用。文章内提及的漏洞均已修复,作者不鼓励或支持任何形式的非法行为。