攻防世界web wtf.sh-150
打开环境
第一眼看不出来有什么
随便点一下
这里有个 注册,那我们就注册一下看看
登录了 没发现什么异常
继续点
这里有个 值 测试一下sql啊 路径穿越啊
这里确实是路径穿越
post.wtf?post=../
有代码,crtl+f 找一下flag
整理一下代码
<html>
<head>
<link rel="stylesheet" type="text/css" href="/css/std.css" />
</head>
<body>
$ if contains 'user' ${!URL_PARAMS[@]} && file_exists "users/${URL_PARAMS['user']}" $ then $ local username=$(head -n 1 users/${URL_PARAMS['user']}); $ echo "
<h3>${username}'s posts:</h3>"; $ echo "
<ol>
"; $ get_users_posts "${username}" | while read -r post; do $ post_slug=$(awk -F/ '{print $2 "#" $3}' <<< "${post}"); $ echo "
<li><a href="\"/post.wtf?post=${post_slug}\"">$(nth_line 2 "${post}" | htmlentities)</a></li>"; $ done $ echo "
</ol>"; $ if is_logged_in && [[ "${COOKIES['USERNAME']}" = 'admin' ]] && [[ ${username} = 'admin' ]] $ then $ get_flag1 $ fi $ fi
</body>
</html>
里面有一句
$ if is_logged_in && [[ "${COOKIES['USERNAME']}" = 'admin' ]] && [[ ${username} = 'admin' ]] $ then $ get_flag1 $ fi $ fi
登录用户admin 就可以得到flag1
要登陆 admin用户 就要找到admin的密码 看看会不会在这个页面
没有找到 admin的更多信息,但是发现了 有个users的目录
那就是要继续路径穿越了
post.wtf?post=../users
看到了我们注册的张三
那admin在这里么
找到admin
那这些字符代表什么呢
用我们注册的 张三用户来查看
首先判断 c4f9375f9834b4e7f0a528cc65c055702bf5f24a 这一串代表什么 解密无果
点张三 用户抓包看看
这是token
那我们可以 进行admin的 用户登录欺骗了
使用token 伪装admin登录
得到flag emmmmm 好像只有一半。。xctf{cb49256d1ab48803
后面不会了,查wp
服务器能解析wtf文件,上传wtf文件得到shell
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}";
评论功能的后台代码,也是存在路径穿越的。
代码把用户名写在了评论文件的内容中:echo "${username}" > "${next_file}";
通过上面的分析:如果用户名是一段可执行代码,而且写入的文件是 wtf 格式的,那么这个文件就能够执行我们想要的代码。 (而且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为'$'的行)
先普通地评论一下,知晓评论发送的数据包的结构,在普通评论的基础上,进行路径穿越,上传后门sh.wtf
:
%09
是水平制表符,必须添加,不然后台会把我们的后门当做目录去解析。
访问后门,发现成功写入:
为了写入恶意代码,我们得让用户名里携带代码,故注册这样一个用户:${find,/,-iname,get_flag2} 写入后门:
得到路径
继续注册 恶意用户 $/usr/bin/get_flag2 写入后门
得到后一半 149e5ec49d3c29ca}
得到falg
xctf{cb49256d1ab48803149e5ec49d3c29ca}
真滴难