强网杯2019 随便注

buuctf第二题。
根据题目提示可知是sql注入题
先进入页面,发现一个输入框且有缺省值1,先在1后加上单引号,出现报错:


1.png

可以大概确认为单字符型注入,在url中添加参数inject=1'%23发现成功回显,可注入
(不是在输入框中输入)
构造联合查询时发现后端对输入语句进行严格过滤:


2.png

可以看到过滤了select等sql关键字及'.'符号,切不区分大小写。
到这里时,我首先用布尔注入的方式得到数据库名,但后面就不知道怎么做了。于是查了一下wp,发现了堆叠注入的思路。

在SQL中,分号(;)是用来表示一条sql语句的结束。试想一下我们在 ; 结束一个sql语句后继续构造下一条语句,会不会一起执行?因此这个想法也就造就了堆叠注入。而union injection(联合注入)也是将两条语句合并在一起,两者之间有什么区别么?区别就在于union 或者union all执行的语句类型是有限的,可以用来执行查询语句,而堆叠注入可以执行的是任意的语句。例如以下这个例子。用户输入:1; DELETE FROM products服务器端生成的sql语句为:(因未对输入的参数进行过滤)Select * from products where productid=1;DELETE FROM products当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。
构造url:

http://**:**/?inject=0';show databases--+
4.png

查询到一共有6个库,根据之前布尔注入的结果可知,supersqli是我们使用的库,构造url查询该库中的表:

http://**:**/?inject=0';show tables--+

5.png

再分别构造以下两个url查询这两个表的结构:
http://**:**/?inject=0';desc words
http://**:**/?inject=0';desc `1919810931114514`
注:在mysql中,对表名为纯数字的表进行操作时,要在表名前后加上`符号
查询结果:
6.png

7.png

words表中有两列分别为'id','data',1919810931114514表中有一列名为'flag'。根据列名猜测1919810931114514表中储存了flag,同时根据刚开始时输入参数inject=1时的查询结果有两个,猜测sql语句查询所用到的表为words,但是由于过滤了select等关键字,无法直接对其进行查询。
接下来就不知道怎么办了,再看wp,发现了一顿骚操作。
既然原sql语句是对words表中的id和data列进行查询,那么我们将words表改成其他名字,然后把1919810931114514表改名为words,并将其中flag列改名为words,再加入id列,即可利用原语句对flag进行查询。
构造url:

http://**:**/?inject=0';alter table words rename to word;alter table`1919810931114514` rename to words;alter table words change flag data varchar(100);alter table words add column id int(10) default 1 --+

注:这里要注意几个问题:

  • 对表名为纯数字的表进行操作时,要在前后加上`符号。由于刚开始不知道,在这卡了一段时间。
  • 对列名进行更改时,要在后面指定修改后的数据类型
  • 添加id列时,设置默认值,方便后面查询(1' or 1=1也可)
  • 当其中一个语句执行失败时,其后语句都不会再执行,而我们对表名的修改已经完成。若我们重新填写参数,此时的words表(原1919810931114514表)不存在id列和data列,原sql语句无法执行成功,我们后面填写的语句均不能执行,此时只能重新创建环境。
8.png

9.png

可以看到成功更改表名和列名,再次查询,可以看到回显了flag。

你可能感兴趣的:(强网杯2019 随便注)