2018省赛AWD web writeup

2018年省赛AWD web writeup

  • 一点寒暄 > 本次比赛还是有很多遗憾,AWD做的太少,再加上经验不足,导致结果不好看,下面开始填坑。

  • 网站框架、版本分析
    在ThinkPHP路径下找到ThinkPHP.php文件,在其中找到版本号3.2.3,本版本存在缓存漏洞。
    找到之后,搜索出相同出处的网页: 主页 搜索结果 阅读获得thinkphp缓存漏洞的提示。
  • 缓存漏洞分析
    ThinkPHP缓存漏洞需要在二次开发时,调用框架的S()函数,如果传入S()函数的变量可控,并且能找到缓存的储存地址(主要是文件名),则可以直接写入并连接webshell。

  • 代码调试跟进
    本题直接搜索并不能找出漏洞的触发点,因为S()函数并没有直接的被调用,也没有直接被调用的函数调用S(),但是既然是缓存漏洞,先找到缓存的路径,然后随意浏览网页,终于触发了漏洞点。
    能够引起缓存函数执行的地方在主页的搜索框里,当进行一次搜索后,发现缓存文件夹下有文件生成了: 缓存文件位置 然后开始跟进。
  1. 首先,清空缓存文件,在主页代码中打断点: 缓存文件夹和断点
  2. 进一步跟进,在一个执行处打下断点(因为执行之后就产生了缓存文件) 断点
  3. 继续跟进下一层网页应用执行处 网页应用的运行
  4. 继续调试,发现了使用变量调用函数的地方,并且此处调用了search函数,search函数之中调用了S()函数,终于找到了关键位置 invokeAction函数调用了漏洞函数 invokeAction函数中的search调用
  5. 进一步跟进,发现了文件名的处理: 名字变量的传入 文件名的变化以及文件内容 文件名详细处理
  6. 在文件名处理之中,存在一个C()函数,这个函数就是缓存文件名的关键所在,在函数中,$_config[$name]被当做了一个“随机变量”,用于与搜索的关键词组合生成md5。
    查看内存中的相应变量的值: $name的值 被传出的文件名
    在该变量中储存的随机变量如下,是’sdfdf’的md5码(其实并没有经过md5运算)
  7. 最后,全局搜索该md5,发现在config.php文件中就已经赋值好了,算是一个password,可见,本漏洞是已经经过修复的漏洞,只要把密码改掉,想直接得到文件名的概率是极小的: 最终来源
  • 总结:
  1. 查到之前的版本下,缓存漏洞的文件名是直接对传入的文件名进行md5摘要的,而本题的版本已经把它修复了,感觉并不算个漏洞,或者说是已经修复的漏洞。
  2. 整个触发流程是:
    搜索框搜索->调用invokeAction函数->调用搜索函数->搜索函数内部调用缓存函数->缓存函数读取缓存密码并拼接md5->产生文件
  3. 但是当时没有改密码的时候还是很容易被打穿的,从被打穿的队伍的网页文件来看,也都是在缓存处出现了问题,可能还有别的漏洞存在。(师傅们应该找到了其他切入点吧) 懒了,先不动了:)