在攻防世界上看到的一道题,完全搞不懂,看了wp把flag搞出来了,最后还是写一下解题过程吧
这一题的题目环境是一个论坛形式
正常注册账号,发现admin用户已存在,只能注册其他账号,登陆后可以回复并发表新的内容
开始做题:
1、首先在展示文章的页面post.wtf下存在路径穿越漏洞
访问 http://111.198.29.45:57425/post.wtf?post=../
,得到页面源码,搜索flag
发现只要是admin用户登陆到这个页面,就会触发get_flag1,而且在这里还暴露了,存在users这个路径
2、访问 http://111.198.29.45:57425/post.wtf?post=../users
发现系统账号的账号信息全部存储在这里了,对比我自己注册的xianyu账号发现第二排就是Cookies中的TOKEN
3、伪造Cookies登陆admin账号
在profile里面得到flag1
flag1: Flag: xctf{cb49256d1ab48803
4、继续代码审计,寻找代码执行,来get_flag2,寻找解析wtf文件的代码,定位到这里
将代码格式化
1 | max_page_include_depth=64 |
通过这段代码我们发现服务器能够解析并执行 wtf 文件,如果还能够上传 wtf 文件并执行的话,就可以达到控制服务器的目的。
于是继续审计代码,发现如下代码给了这个机会:
1 | function reply { |
这是评论功能的后台代码,同样存在路径穿越
分析发现,代码中的echo "${username}" > "${next_file}";
会将用户名写入到评论文件之中,如果username是一段可执行代码,并且写入的文件是wtf格式时,那么这个文件就能执行我们插入的代码。(并且wtf.sh只运行文件扩展名为.wtf的脚本和前缀为“$”的行)
5、评论时进行抓包,并修改POST内容,进行路径穿越,上传后门sh.wtf(%09是水平制表符,必须加上,不然都太会把我们的后门文件当作目录去解析)
访问页面http://111.198.29.45:57425/users_lookup/sh.wtf
,已经写入
6、接下来,注册用户,使用户名中含有恶意代码,再进行回复,将用户名写入users_lookup/sh.wtf
首先创建一个用户名为 ${find,/,-iname,get_flag2}
的用户,代码含义为查询到get_flag2的位置
访问页面http://111.198.29.45:57425/users_lookup/sh.wtf
,已经写入,并且恶意代码已经执行,得到了get_flag2的地址
7、继续构造恶意用户名的用户,来执行刚才得到的get_flag2文件,
用户名为$/usr/bin/get_flag2
,并用这个用户,回复,写入sh.wtf
访问页面http://111.198.29.45:57425/users_lookup/sh.wtf
,已经写入,并且恶意代码已经执行,得到了flag2
flag2: 149e5ec49d3c29ca}
将flag1和flag2拼接,得到完整flag xctf{cb49256d1ab48803149e5ec49d3c29ca}
这道题主要考核的就是这个路径穿越,以及后面的代码执行,需要很仔细的审阅代码
留下了不学无术的眼泪.jpg