[强网杯]easy_sql
Posted F1ght!!
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[强网杯]easy_sql相关的知识,希望对你有一定的参考价值。
提交1和2会回显一个数组:
相当于1对应的值为“hahahah”
是key-value形式的输出。
尝试输入1’.返回报错,有注入漏洞
尝试1’or 1=1#,并用#截断,输出了三个数组:
尝试堆叠注入,即注入多组sql语句,其中有;隔开,
输入show databases返回了所有的数据表,
尝试查询表名:show tables;
显示了表的名字,在使用sql语句,show columns from xx,来查询其中列的名称:
上图是word的列名,
下图,再查出1919…中的列名:
用sql语句注入的方式查询到了两个表’1919810931114514’和’words’,之后又查出表words有id和data两个属性,而1919…中只有’flag’一个属性,暗示flag在表’1919…'中的属性之下。
尝试利用select * from ‘1919819931114514’,直接搜索出flag,但明显被后端的preg_match过滤掉了:(如下图)
其表中的存储结构类似于:
刚开始输入’1’,'2’时的查询,是从该两个数据表中的一个进行的查询,
实际上,在’show tables‘那个环节中已经看出整个数据库只有两个数据表,因此结构如下:
查询输入的1和2还有114514明显是整型,因此只能在id里,因为id的类型为int,可以猜出hahah和miaomiaomiao,ys等是存储在data中,因为data的类型是char.
推测存储在flag中的varchar(100)类型十分像flag.
但是其对select,drop,insert,where等函数进行了正则过滤,限制了对数据库的增删改,只能通过id,即输入数字进行对表word的查询来得到数据。
那么,就有一个问题,其没有对rename以及alter等函数进行过滤,
就有如下方案:
(1)将表words的名称改为其他的,
(2)将1919810931114514改为words.
(3)将flag改为id,
(4)在输入栏中输入1’ or 1=1,将其中的数据全部输出,即为flag.
总结:
本来其查询方法是通过输入的值,在表words查找符合条件的id,输出其id-value,将’1919…'改名为words,flag改为id,则可合法输出flag.
构造sql语句:
1' ; rename tables `words` to `word1` ;
rename tables `1919810931114514` to `words` ;
alter table `words` change `flag` `id` varchar(100);#
输入上述语句后,数据库的表被改变,
((alter table 表名)意为对该表进行改变)
在输入万能密码:1’or 1 = 1#
则输出flag
以上是关于[强网杯]easy_sql的主要内容,如果未能解决你的问题,请参考以下文章