拿到题目发现是一个论坛网站
我们随便注册一个账号进去看看,点开一篇文章,发现url是以post为参数的get请求方式
接下来就要学习一个新知识点了,叫做文件穿越。将post的参数改为: ../
往下滑发现好的users和cookies
看了大佬的wp介绍,说users是一个储存账号和对应token的目录,并且可以用cookies进行登录
文件穿越查看../users,得到了admin的token:uYpiNNf/X0/0xNfqmsuoKFEtRlQDwNbS2T6LdHDRWH5p3x4bL4sxN0RMg17KJhAmTMyr8Sem++fldP0scW7g3w==
登录一个账号,刷新一下抓包,将username改成admin,token改成admin对应的
然后就可以发现登录到了admin
点击profile刷新一下抓包,然后发给重发器
在重发器里可以发现这里发送的包username和token还是自己注册的123的
这一次我们要把cookies后面username前面的都删除,然后再改成admin和对应的token,便可以得到第一段Flag: xctf{cb49256d1ab48803
然后看一下大佬找到的源码(反正我没有找到,谁找到了告诉我一下在哪里)
function reply {
local post_id=$1;
local username=$2;
local text=$3;
local hashed=$(hash_username "${username}");
curr_id=$(for d in posts/${post_id}/*; do basename $d; done | sort -n | tail -n 1);
next_reply_id=$(awk '{print $1+1}' <<< "${curr_id}");
next_file=(posts/${post_id}/${next_reply_id});
echo "${username}" > "${next_file}";
echo "RE: $(nth_line 2 < "posts/${post_id}/1")" >> "${next_file}";
echo "${text}" >> "${next_file}";
#add post this is in reply to to posts cache
echo "${post_id}/${next_reply_id}" >> "users_lookup/${hashed}/posts";
}
这是评论功能的后台代码,这部分也是存在路径穿越的。
这行代码把用户名写在了评论文件的内容中
通过上面的分析:如果用户名是一段可执行代码,而且写入的文件是 wtf 格式的,那么这个文件就能够执行我们想要的代码。 (而且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为’$'的行)
如果我注册的用户名就是一段可执行的代码,而且写入的文件也是wtf格式的,那么这个文件就能执行我们想要的代码
本册使用的注册名必须要是:${find,/,-iname,get_flag2}
,使用这个名字的目的是为了找打get_flag2的文件路径
然后登录${find,/,-iname,get_flag2},点击new post,随便评论一个,再点击reply进入修改
随便提交一个抓包,将post的参数改成../sh.wtf%09
知晓评论发送的数据包的结构,在普通评论的基础上,进行路径穿越,上传后门sh.wtf,wtf后面要加%09,表示制表符,否在会被当做目录去解析
再访问/sh.wtf,可以看到get_flag2的路径
然后再注册一个账号$/usr/bin/get_flag2,同样登录评论一下修改抓包,上传一个搜索ss.wtf文件
../ss.wtf%09
访问/ss.wtf得到后半段Flag: 149e5ec49d3c29ca}
最后的flag为:Flag: xctf{cb49256d1ab48803149e5ec49d3c29ca}