用户
搜索
  • TA的每日心情
    开心
    2016-6-27 12:11
  • 签到天数: 16 天

    连续签到: 2 天

    [LV.4]经常看看II

    i春秋-核心白帽

    Rank: 4

    46

    主题

    539

    帖子

    864

    魔法币
    收听
    0
    粉丝
    173
    注册时间
    2015-12-19

    春秋文阁i春秋签约作者

    发表于 2016-8-16 21:48:59 9682125
    本帖最后由 万年死宅 于 2016-8-17 21:19 编辑

    作者:万年死宅
    首发:i春秋社区
    注明:转载请务必注明i春秋社区(bbs.ichunqiu.com)


    0x00 目录

    0x00 目录
    0x01 MySQL注射的简单介绍
    0x02 对于information_schema库的研究
    0x03 注射第一步——确定查询语句的查询对象个数
    0x04 注射第二步——UNION联合查询
    0x05 注射第三步——MySQL基础信息收集
    0x06 注射第四步——通过利用点GET敏感表及列
    0x07 注射第五步——通过已知表、列GET数据

    0x01 MySQL注射的简单介绍

    MySQL的注射,我们已经在第4篇文章的演示过了,我们就来简单的总结下,我们MySQL注射的利用点。
    首先,我们先来说下现在几乎没什么网站用的Access数据库吧,在最早期的web安全技术的学习中,我们最早接触到的工具相信都是啊D和明小子,而这两款工具正是针对与Access数据库的注射漏洞的利用工具。
    而提到Access的注射,相信大家都能想到两个字“爆破”或者是“猜解”。对,这就是Access数据库存在SQL注射漏洞时的利用点,而我们第4篇文章中所演示的MySQL注射的利用点,自然不是“猜解”。(顺便说一下,我说的只是针对于MySQL5及以上版本)这种注射的利用点是information_schema这个默认数据库,这里面记录了该MySQL数据库所存储的所有数据。
    所以,针对于MySQL数据库的注射都是利用提取information_schema库里的信息来获取表名与列名的。

    0x02 对于information_schema库的研究


    既然这类注射的利用点在于information_schema这个默认库,那么自然,我们就应该增进对于这个库的一些了解,接下来,我们就来研究下这个information_schema库。
    首先,我们启动MySQL服务,并且登录MySQL:


    1.jpg


    然后,我们还是来看下存在的数据库:


    1.jpg


    我们看到了information_schema数据库,也就证明了我安装的MySQL版本大于5,我们可以来看下具体版本:


    1.jpg


    我们可以看到版本是5.6.17。接着,我们进入information_schema库:


    1.jpg


    接着,我们来show一下表:


    1.jpg


    可以看到,这个库里面有很多表,而我们获取其他数据库里的表、列名情况所利用的是一个叫tables的表,如下图:


    1.jpg


    我们看看这个tables表里存在那些column:


    1.jpg


    可以看到,tables表里情况复杂。。。我们所需要学习的只是其中几个,包括table_name、colum_name、table_schema,如图:


    1.jpg


    还有一个没圈到,可能是在下面,也可能是我眼睛不好。。。。我先来了解下table_schema这个列:


    1.jpg


    这里面包含了所有我们安装在这个MySQL上的数据库的db_name,会有很多重复,接着,我们来看下table_name里的情况:


    1.jpg


    这个表里则包含了该MySQL安装过的表的名字,好了,关于这个infromation_schema的库,我就写到这里,because我们的主题不是这个。


    0x03 注射第一步——确定查询语句的查询对象个数

    我们在第4篇的通用注射方式里的第一步就是确定原查询语句的查询对象的个数,什么意思呢?
    其实很简单,我们还是使用第4篇的栗子,我把MySQL切换到sqli数据库:


    1.jpg


    然后,用上节课的SQL模型,如下:


    1.jpg


    这个X的位置,便是我们能够注射的位置,这个查询对象是什么意思呢?
    其实,在这里查询对象就是data,个数就是1。这样或许大家还是不能理解,那我们举如下栗子:


    1.jpg

    这次查询对象就变为了*,但是长度却改变了,因为*代表的是ALL的意思,那我们就来看看在news表中到底有几个对象:



    1.jpg


    我们能看到,news表中有两个列,所以,这次的查询对象个数就是2。
    但是,我们进行SQL注射只能控制SQL语句的一个部分,而不能知道原本的查询语句啊,那怎么办?
    这时,我们就只能劳靠order by了,我们来看如下的栗子(还是一样的SQL模型):


    1.jpg


    我们在上面的栗子中可以看到,第一次查询是正常的查询,返回正常的查询结果,而第二次查询则是加了order by 1,达到的效果就是返回正常查询结果,因为原SQL模型的查询对象个数就是1,而第三次查询则使用了order by 2,而原查询语句的查询对象个数是1,而不是2,所以产生了错误。
    这就是利用order by来获取未知查询语句的查询对象个数。


    0x04 注射第二步——UNION联合查询


    好滴,接下来,我们就要使用联合查询了,这个union到底是拿来干啥的啊,很不解对吧,那我们就先来学习一下union。
    我们先来执行如下SQL语句,并查看结果:


    1.jpg

    可以看到select什么就是什么,接着,我们来看一下下面这个图(别闲枯燥,都是为了后面做铺垫):


    1.jpg


    这就是news表里的全部数据,我们想一下,我们有如下程序:


    1.jpg


    这个程序,我们假设它叫test.php吧,关于getData()函数,图上有注释,我们想,当id为1~9的时候,这个程序确实没任何问题,但是试想,当id等于10的时候,就没法查询出结果,说不定还会报错,这样很影响用户体验。
    所以,有时,可以使用union来解决这种问题,例如如下SQL模型就能解决这种问题:


    1.jpg


    X的位置就是刚才那个程序的id参数的拼接处,这样就解决了刚才说的问题,不信我们来看:


    1.jpg


    可以看到,在第一次查询时id为1,的确存在这个数据,于是正常返回查询结果,其实也不完全正常,因为还多了个Error,但是这个很好处理,直接在mysql_fetch_array()之后的返回值里取数组的[0]就可以了。
    而第二次查询,id为10,不存在这条数据,于是,语句错误了,所以查询结果就变成了Error。
    Ok,就是这样,这就是UNION的基础用法,但是还没转过弯来的同学可能还会问那刚才为什么要order by?
    其实,这也怪我,没讲清楚,我们来看如下栗子:


    1.jpg


    很明了吧,嘿嘿,好了。我们最后在说一个问题,当我们有原语句出现错误时,我们的union的内容就会替换掉查询结果,其实类似于如下等式:


    select * from news where id=10 union select 'Error',1000;
    =
    select 'Error',1000;
    好了,接着就是下一个内容了。


    0x05 注射第三步——MySQL基础信息收集


    Ok,基础的东西终于唠完了,我们就来玩玩吧,我们先看下面这样一个列表:


    • database()  当前数据库
    • version() 数据库版本
    • user() 当前用户



    就这样三个基础信息吧,我们先直接查询下:


    1.jpg


    我们可以看到如下几个基础信息,根据我们0x04里最后提的等式,可以构造出如下SQL语句来GET这些信息:


    1.jpg


    OK,长话短说了我们试试吧,首先是GET当前库:


    1.jpg


    接着是数据库版本:


    1.jpg


    最后是当前用户:


    1.jpg


    OK,就这么简单,其实注射并不难,只是缺少系统性的资料以及各种资料的“质量”参差不齐才导致有很多朋友觉得SQL注射很难学。


    0x06 注射第四步——通过利用点GET敏感表及列

    好滴,接着,我们来到了0x06,真心写得好累,阿西吧,神呐。。。好了,利用点自然是information_schema库。
    我们首先想获取的自然是当前库里的所有表,大家还记得吧,在0x02的地方,我曾说过information_schema库里的tables表里存着我们想要的信息,首先table_schema里存的是啥?是所有数据库名吧,那table_name里存的啥?是所有表名吧,既然如此,只需要将select database()查出来的当前库名对应一下,自然就能得到所有属于当前库的表名了哎。
    所以,我们来先正常尝试一下(额,对了跨库的话就“from 库名.表名”就行了):


    1.jpg


    可以看到,确实获取了属于sqli库的所有表名,此时一看,哪个敏感一幕了然啊,嘿嘿,让我们猥琐的继续:


    1.jpg


    就这么简单,通过前面那个等式,大家就能够通过这两个语句直接构造攻击的Payload了吧,嘿嘿(容我猥琐的笑会儿~~)


    0x07 注射第五步——通过已知表、列GET数据

    好了,最后,我们就能通过已知的表、列GET想要的数据了,例如:


    1.jpg


    但是例如php程序在处理查询结果时有点坑咋办?就例如mysql_fetch_array()后只取了[0]咋办?难道一个一个查?那不累死?
    所以还是用第4篇里讲到过的group_concat()函数来解决吧,如下例:


    1.jpg


    好了,这篇paper就到这里了,接下来还会有更多更高级的SQL注射技巧等着大家~~




    作者:万年死宅
    首发:i春秋社区
    注明:转载请务必注明i春秋社区(bbs.ichunqiu.com)



    评分

    参与人数 1魔法币 +200 价值分 +15 收起 理由
    坏蛋 + 200 + 15 价值分奖励

    查看全部评分

    本帖被以下淘专辑推荐:

    那个刚才看到朽木童鞋说:”表示我没有学习过MYSQL对注入不是很好理解,有些地方看不懂“,既然这样大家有问题就直接问吧,别憋着,我尽量回答~~
    使用道具 举报 回复
    坏蛋 管理员 欢迎大家来春秋群找我玩
    来自 70#
    发表于 2016-8-18 13:17:06
    作者
    帖子链接
    评估分数(0-3分)
    原创性
    标题
    排版
    内容要求
    内容深度
    内容趣味性
    点评
    总分
    奖金
    万年死宅
    [深入学习Web安全](5)详解MySQL注射
    评估分数(0-3分)
    2
    3
    2
    2
    3
    3
    内容很好,小白就需要这样通俗易懂的文章
    15
    150元

    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复
    让我这个没学过php的看懂了,,,万分感谢
    使用道具 举报 回复
    赞一个,深入浅出,写得很透彻
    使用道具 举报 回复
    发表于 2018-11-19 09:27:44
    基础知识,温故而知新,
    使用道具 举报 回复
    发表于 2017-2-6 19:10:24
       不错 ~~~~
    使用道具 举报 回复
    学习一下~
    使用道具 举报 回复
    双击666
    使用道具 举报 回复
    再次抢到沙发~~
    使用道具 举报 回复
    求回复~~
    使用道具 举报 回复
    不求甚解觅慧识,繁华落尽见真淳。
    使用道具 举报 回复

    嗯,这波助攻不错,哈哈哈
    使用道具 举报 回复
    坏蛋 管理员 欢迎大家来春秋群找我玩
    5#
    发表于 2016-8-16 22:03:01
    啥都没抢到
    欢迎加入i春秋QQ群大家庭,每人只能任选加入一个群哦!
    投稿请加QQ:780876774。

    i春秋—楚:713729706
    i春秋—魏:687133802
    网安交流群:820783253
    使用道具 举报 回复

    俺抢着前排出售瓜子花生,不然生意不好,就只能吃土了,嘿嘿
    使用道具 举报 回复
    发表于 2016-8-16 22:04:11
    辛苦了!!!
    使用道具 举报 回复
    发表于 2016-8-16 22:04:39
    领导辛苦了
    使用道具 举报 回复

    谢谢支持,大家的回复就是我继续创作的动力~
    使用道具 举报 回复
    发表于 2016-8-16 22:05:10
    使用道具 举报 回复
    赞啊,感谢感谢,希望能学到一些
    使用道具 举报 回复
    发表于 2016-8-16 22:06:30
    支持一个
    使用道具 举报 回复

    。。。。为人民“服务",嘿嘿,你懂得"服务"~~
    使用道具 举报 回复
    发表于 2016-8-16 22:06:39
    很不错,
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册