虎符杯(HFCTF)writeup超详解-Web篇(下)

admin 2023年6月2日22:13:33评论26 views字数 1946阅读6分29秒阅读模式

首届“虎符网络安全赛道”已告一段落,本次比赛Web赛题为一道php、两道NodeJS,考虑到官方公布的writeup过程过于简洁,本着分享及进步为原则,特对web赛题做一次详细解析,以供各位CTF爱好者解读涨知识;


虎符杯(HFCTF)writeup超详解-Web篇(下)

第三题:babyupload



初探题目

虎符杯(HFCTF)writeup超详解-Web篇(下)

 

   打开题目,可以直接看到php源码:


虎符杯(HFCTF)writeup超详解-Web篇(下)

 

   接下来对代码逐行审计:

 

1. 将 session 的存放在 /var/babyctf/,并且启动 session,同时引入 /flag 内容:



虎符杯(HFCTF)writeup超详解-Web篇(下)

 

2. 判断session 中 username 是否为 admin,是的话判断 /var/babyctf/success.txt 是否存在,若存在则把 success.txt 删了,并显示 flag。(注:die函数的功能为输出一条消息,并退出当前脚本



虎符杯(HFCTF)writeup超详解-Web篇(下)


 

3. 获取POST 参数,direction 表示是upload还是download操作,attr 会被直接拼接在 /var/babyctf/ 路径后面,如果 attr 为 private 则把用户名继续拼接在后面构成dir_path。


虎符杯(HFCTF)writeup超详解-Web篇(下)


    

4.upload操作,上传文件的 field 为 up_file,把文件名拼接在dir_path后面,同时加上下划线和文件内容的sha256值构成file_path。判断是否有../等路径穿越敏感字符,逐级创建目录,将文件储存到file_path路径下:


虎符杯(HFCTF)writeup超详解-Web篇(下)


  

5.download操作,获取要下载的filename,拼接到dir_path构成file_path,判断是否有../等路径穿越敏感参数,然后将file_path对用文件显示出来。


虎符杯(HFCTF)writeup超详解-Web篇(下)


所以读取 flag思路为


伪造 session为admin -> 创建一个 success.txt 文件-> 读取 flag。


6.  伪造session,upload处如上/var/babyctf/文件名_sha256值。只需要上传一个名为 sess的文件,内容为伪造的session内容,计算出它的摘要值,然后将 Cookie中的 PHPSESSID 改为这个sha256值,即可成功伪造 session。


session伪造


sess_加上CookiePHPSESSID的值组成session文件名(phpsession的命名规则):


虎符杯(HFCTF)writeup超详解-Web篇(下)



利用download即满足direction值为downloadattr为空,filenamesess_2f84c77583d503fc23d3396e85b1f668来读取当前的session文件内容:


虎符杯(HFCTF)writeup超详解-Web篇(下)


成功获取当前session内容:


虎符杯(HFCTF)writeup超详解-Web篇(下)


根据读取到的seesion文件格式判断其 session 处理器为 php_binary

(注:php_serialize引擎下是:a:1:{s:4:"name";s:6:"spoock";}这种样式

php_binary引擎下是:names:6:"spoock";


使用如下脚本生成session文件:注:不能直接用文本编辑器生成,因为 session 文件前面有个隐藏字符08,普通编辑器无法录入这个字符导致操作失败,需要用十六进制编辑器)


虎符杯(HFCTF)writeup超详解-Web篇(下)


   生成session文件成功:


虎符杯(HFCTF)writeup超详解-Web篇(下)

   使用windows自带的certutil工具计算出sha256值:


虎符杯(HFCTF)writeup超详解-Web篇(下)


upload上传

  

  

此时就是将session文件上传,根据上面的upload规则,满足directionupload,将seesion文件重命名为sess,即up_filesessattr为空即可:


虎符杯(HFCTF)writeup超详解-Web篇(下)


借助postman上传文件,点击“send”;


使用downlad验证上传是否成功:


虎符杯(HFCTF)writeup超详解-Web篇(下)


虎符杯(HFCTF)writeup超详解-Web篇(下)




上传成功!!!


然后把 Cookie 里的 PHPSESSID 改为计算出的 sha256 432b8b09e30c4a75986b719d1312b63a69f1b833ab602c9ad5f0299d1d76a5a4 即可伪造成admin


最后需要满足一个条件:


虎符杯(HFCTF)writeup超详解-Web篇(下)



PHP 文档中file_exists函数用于判断文件或者目录是否存在,虽无法构建success.txt文件,但当attr参数为success.txt时,即可创建一个success.txt 目录,继续执行upload操作:



虎符杯(HFCTF)writeup超详解-Web篇(下)



重新刷新页面,即可看到flag



虎符杯(HFCTF)writeup超详解-Web篇(下)





总结反思

本次赛题中,有两道新兴语言nodejs,预示着我们要扩宽知识面技能树;第三题的考察点是掌握php的session处理机制和代码审计能力,通过session伪造和构造文件上传下载的方法获取到flag。



虎符杯(HFCTF)writeup超详解-Web篇(下)

虎符杯(HFCTF)writeup超详解-Web篇(下)


扫码关注


       隐刃安全实验室,专注于渗透测试、源码审计、漏洞分析、
       内网攻防、脚本工具开发等安全领域,致力于分享精品原
       创文章、漏洞复现、工具靶场、CTF等技术干货。


原文始发于微信公众号(SK安全实验室):虎符杯(HFCTF)writeup超详解-Web篇(下)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月2日22:13:33
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   虎符杯(HFCTF)writeup超详解-Web篇(下)https://cn-sec.com/archives/1038949.html

发表评论

匿名网友 填写信息