强网杯2019 随便注
2019-10-13 本文已影响0人
jun123123
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 wordshttp://**:**/?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。