SUCTF-2019EasySQL

[SUCTF 2019]EasySQL

1.题目链接:[( 2019]EasySQL)
2.过程:

image-20201208133531283

一个提交框……

image-20201208133625007

查看原码可以看到传了一个“query”……

输入数字有一种回显,字母无回显,过滤了flag,from,union等等,;可以用,可能是堆叠注入。

*1;show databases;*有回显

image-20201208134436688

*1;show tables;select 1,2,3;*有回显

image-20201208134318984

*1;show tables;select 1,2,(select schema_name form information_schema.shemate);*提示过滤

好像是information被过滤了……猜不到入口语句是啥啊,看一波wp……

1
源码:select $_GET['query'] || flag from Flag

就算知道了,我也……

解一:
1
*,1

👌,继续查

  • 查询指定列:select 列名1,列名2,列名3 from 表名

  • select * from 表名,查找全部列

  • select max(列名) from 表名,计算后的列

  • select 1 from 表名:增加一个临时列,它的列名是1,然后那一列的值都为1,如: image-20201208140708795 1 2 3 ——详细,还不是很懂,以后上手操作可以多试试。

  • || 具体语法规则为:
    当两个操作数都为非 NULL 值时,如果有任意一个操作数为非零值,则返回值为 1,否则结果为 0;
    当有一个操作数为NULL 时,如果另一个操作数为非零值,则返回值为 1,否则结果为NULL;
    假如两个操作数均为 NULL 时,则返回值为 NULL。

所以说,输入任何数字,经过||都为1,查询结果不变……

键入 “*,1” *查询所有列,“1||flag”=>1,于是变为

1
select *,1 from Flag

读出所有内容拿到flag

解二:

sql_mode 定义了 MySQL 应支持的 SQL 语法,以及应该在数据上执行何种确认检查,其中的 PIPES_AS_CONCAT 将 || 视为字符串的连接操作符而非 “或” 运算符,未配置 sql_mode 之前,|| 是作为 或 运算符。在oracle 缺省支持 通过 ‘ || ’ 来实现字符串拼接。但在mysql 缺省不支持。需要调整mysql 的sql_mode,需要设置。

payload:1;set sql_mode=PIPES_AS_CONCAT;select 1

嗯,很强……

作者

inanb

发布于

2020-12-08

更新于

2021-08-23

许可协议


:D 一言句子获取中...