半决赛没有做出来,感觉有些遗憾。因此还是决定下来复盘一下。
情景再现
比赛时的想法
题目源码结构
其实在拿到源码时就不断揣测出题人的意图
题目中的 hint 也给到:www-data 权限用户可写目录只有 runtime 跟 static。所以当时就想好了审计的重点:
- 各类文件操作函数 + 写入路径可控
- RCE +
file_put_contents
(如果真能RCE,貌似也不用写shell,直接读就行) - SQLi
然后 html 下面给到了 1.txt 里面的信息是注册邀请码
当时还以为这么明显的提示一定是暗示什么(结果好像这个txt并没有什么用?),还以为是从index.php/register
利用注册码进去,然后打 /merchant
。结果在 /merchant
找了半天也没找到漏洞点。
然后看到跟 html
同级目录下的 tk.sql
。
当时找到了md5之后以为能进后台。但是现场还是断网环境(WTF?那我怎么解?)用常见弱密码单向生成后比对也没有发现有相同的。同时还不能爆破后台,也没什么万能密码这类的东西。
然后当时题目环境还是 tp5.0.14。RCE 貌似ban了好多函数。当时妄想通过非预期解一下题目。
最后还是坚信漏洞点在: /merchant
下面。一下午的时间就在 /merchant
的审计和 tp5 RCE 的绕过度过了…
赛后实验室的小伙伴 @jokuuy 告诉我后台部分功能点未授权 orz。而且之前他审过这个 CMS,据说10s可以秒掉23333
反思和小结
当时没考虑到未授权…未授权的话可以直接利用很多后台的漏洞(当时就看到了manage/backup 那个点),但是没有进到后台。所以没有能够利用到manage
和 admin
两个目录下的代码。
题目分析
获取后台权限
http://wdb-vul/index.php/admin/index/info
未授权添加用户
之后访问某些存在漏洞的路由会发生这样的情况
提示权限不够。
在 SQL 列中,authorize
起到了权限限制的作用
回溯 authorize
的控制
application/admin/controller/Index.php#info
跟进 _form
, callback
调用 _form_filter
跟进 _form_filter
说明直接 POST 参数即可。
任意文件读取
application/manage/controller/Backup.php
#downloadBak
finename可控,目录穿越
Exp:
http://wdb-vul/index.php/manage/backup/downloadBak?file=../../../../../../../../../Users/p2hm1n/Desktop/flag |
文件上传
发现先知已经有师傅写了一个文件上传的漏洞点了 https://xz.aliyun.com/t/7838
跟着复现分析一波。
application/admin/controller/Plugs.php
主要是文件上传的一些校验。
上传的时候会先调用 upstate
,主要作用如下:
- 将通过 POST 传入的 md5 值以16位字母为间隔进行分割,并拼接传入filename 的后缀
- 检测文件是否上传
- 生成 config 数组,并添加每一个键的值
之后调用 upload
,这里看文件上传处理的位置
跟进 move
跟进 buildSaveName
final POC
上传至 static 目录