0x00 前言
回炉重造。
0x01 WeiPHP 相关
这款WeiPHP5.O的home模块的控制器权限定义的有点问题,存在未授权访问的上传方法,原有的位置可以在稍加绕过后,可以上传php后缀的脚本,不过这里倒是遇到了一个奇怪情况,在PHP5.6.9可以成功,在PHP7.3.4则不能成功,这里先做下记录。
环境:
php 5.6.9
mysql 5.7.26
apache 2.4.39
0x02 代码分析
入口点:
源码为TP5.1.32二开的,入口和路由访问跟TP没有区别,访问方式:
1 | /public/index.php/模块/控制器/方法 |
漏洞分析:
这里我尝试直接SHFIT+CTRL+F
搜索application目录下的upload方法,看出现在了哪些位置。
**/admin/model/Picture.php **
**/admin/controller/File.php **
**/home/controller/File.php **
主要看两个控制器。
第一个**/admin/controller/File.php **继承了admin控制器,这里做了权限控制。
可以看到在**/admin/controller/Admin.php **后台控制器初始化做了用户登录验证,那么admin下File控制器的方法就不能直接访问到了。暂时不去看这个点。
继续跟第二个控制器**/home/controller/File.php **,继承了Home前台公共控制器。
在初始化方法中,没有看到用户校验等,所以这里**/home/controller/File.php **File控制器里的public的方法可以直接访问到。
具体就跟这里面的方法看看,首先看到了一个upload方法,这里看到第22行代码就可以不继续往下跟了。原因是通过is_login方法验证了是否登录,方法可以访问到,但是得登录后才能调。继续跟踪is_login方法,看到确实是验证登录。在**/application/common.php 中,第180行**。
我们目的是找一个未授权的上传。所以继续跟下一个方法。
同样的第71行upload_picture方法也验证了is_login,继续下跟。
最后跟到第390行,可以看到这里没有验证是否登录,过程中调用上传组件,看到调了一个upload方法,跟一下看看有没有过滤。
到**/application/home/model/File.php 中的第64行**调用了一个upload_files方法,继续往里面跟。
跟到**/application/common.php 中的第4542行**,看到了验证扩展名是否为php,如果不为php则上传,这里就有一个逻辑错误,如果文件后缀为phtml、php5这种就能直接上传,前提是可以解析,而在PHP5.6.9版本中,如果扩展名等于php加空格,就可以绕过,在PHP7.3.4中则不可上传,具体原因暂时没查到,感觉是这个获取扩展名的时候去除尾部空格,而%20则被解析为字符串,在浏览器中自动转码%20,这时候就访问不到文件。
最后就可以看到return了一个json串,包含了文件信息,诸如路径和文件名等。可以直接构造表单上传试试。
漏洞利用:
本地构造文件上传表单,action替换为功能点路由:
1 | <html> |
通过burp修改filename后加空格。可以看到回显的路径。
测试下访问:
成功。