首届“虎符网络安全赛道”已告一段落,本次比赛Web赛题为一道php、两道NodeJS,考虑到官方公布的writeup过程过于简洁,本着分享及进步为原则,特对web赛题做一次详细解析,以供各位CTF爱好者解读涨知识;
第三题:babyupload
初探题目
打开题目,可以直接看到php源码:
接下来对代码逐行审计:
1. 将 session 的存放在 /var/babyctf/,并且启动 session,同时引入 /flag 内容:
2. 判断session 中 username 是否为 admin,是的话判断 /var/babyctf/success.txt 是否存在,若存在则把 success.txt 删了,并显示 flag。(注:die函数的功能为输出一条消息,并退出当前脚本)
3. 获取POST 参数,direction 表示是upload还是download操作,attr 会被直接拼接在 /var/babyctf/ 路径后面,如果 attr 为 private 则把用户名继续拼接在后面构成dir_path。
4.upload操作,上传文件的 field 为 up_file,把文件名拼接在dir_path后面,同时加上下划线和文件内容的sha256值构成file_path。判断是否有../等路径穿越敏感字符,逐级创建目录,将文件储存到file_path路径下:
5.download操作,获取要下载的filename,拼接到dir_path构成file_path,判断是否有../等路径穿越敏感参数,然后将file_path对用文件显示出来。
所以读取 flag思路为:
伪造 session为admin -> 创建一个 success.txt 文件-> 读取 flag。
6. 伪造session,upload处如上/var/babyctf/文件名_sha256值。只需要上传一个名为 sess的文件,内容为伪造的session内容,计算出它的摘要值,然后将 Cookie中的 PHPSESSID 改为这个sha256值,即可成功伪造 session。
session伪造
sess_加上Cookie中PHPSESSID的值组成session文件名(php中session的命名规则):
利用download即满足direction值为download,attr为空,filename为sess_2f84c77583d503fc23d3396e85b1f668来读取当前的session文件内容:
成功获取当前session内容:
根据读取到的seesion文件格式判断其 session 处理器为 php_binary; (注:php_serialize引擎下是:
a:1:{s:4:"name";s:6:"spoock";}这种样式
在php_binary引擎下是:
names:6:"spoock";
)
使用如下脚本生成session文件:(注:不能直接用文本编辑器生成,因为 session 文件前面有个隐藏字符08,普通编辑器无法录入这个字符导致操作失败,需要用十六进制编辑器)
生成session文件成功:
使用windows自带的certutil工具计算出sha256值:
upload上传
此时就是将session文件上传,根据上面的upload规则,满足direction为upload,将seesion文件重命名为sess,即up_file为sess,attr为空即可:
借助postman上传文件,点击“send”;
使用downlad验证上传是否成功:
上传成功!!!
然后把 Cookie 里的 PHPSESSID 改为计算出的 sha256 值432b8b09e30c4a75986b719d1312b63a69f1b833ab602c9ad5f0299d1d76a5a4 即可伪造成admin;
最后需要满足一个条件:
在 PHP 文档中file_exists函数用于判断文件或者目录是否存在,虽无法构建success.txt文件,但当attr参数为success.txt时,即可创建一个success.txt 目录,继续执行upload操作:
重新刷新页面,即可看到flag:
总结反思
本次赛题中,有两道新兴语言nodejs,预示着我们要扩宽知识面技能树;第三题的考察点是掌握php的session处理机制和代码审计能力,通过session伪造和构造文件上传下载的方法获取到flag。
扫码关注
内网攻防、脚本工具开发等安全领域,致力于分享精品原
创文章、漏洞复现、工具靶场、CTF等技术干货。
原文始发于微信公众号(SK安全实验室):虎符杯(HFCTF)writeup超详解-Web篇(下)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论