回炉 - upload位置的漏洞 - WeiPHP任意上传getshell
2021-04-17 16:29:15

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 **

image-20210420205757885

主要看两个控制器。

第一个**/admin/controller/File.php **继承了admin控制器,这里做了权限控制。

image-20210422195618658

可以看到在**/admin/controller/Admin.php **后台控制器初始化做了用户登录验证,那么admin下File控制器的方法就不能直接访问到了。暂时不去看这个点。

image-20210422195729605

继续跟第二个控制器**/home/controller/File.php **,继承了Home前台公共控制器。

image-20210422200127775

在初始化方法中,没有看到用户校验等,所以这里**/home/controller/File.php **File控制器里的public的方法可以直接访问到。

image-20210422200234157

具体就跟这里面的方法看看,首先看到了一个upload方法,这里看到第22行代码就可以不继续往下跟了。原因是通过is_login方法验证了是否登录,方法可以访问到,但是得登录后才能调。继续跟踪is_login方法,看到确实是验证登录。在**/application/common.php 中,第180行**。

image-20210422200746829

image-20210422200926160

我们目的是找一个未授权的上传。所以继续跟下一个方法。

同样的第71行upload_picture方法也验证了is_login,继续下跟。

image-20210425232334578

最后跟到第390行,可以看到这里没有验证是否登录,过程中调用上传组件,看到调了一个upload方法,跟一下看看有没有过滤。

image-20210425233207646

到**/application/home/model/File.php 中的第64行**调用了一个upload_files方法,继续往里面跟。

image-20210425234615886

跟到**/application/common.php 中的第4542行**,看到了验证扩展名是否为php,如果不为php则上传,这里就有一个逻辑错误,如果文件后缀为phtml、php5这种就能直接上传,前提是可以解析,而在PHP5.6.9版本中,如果扩展名等于php加空格,就可以绕过,在PHP7.3.4中则不可上传,具体原因暂时没查到,感觉是这个获取扩展名的时候去除尾部空格,而%20则被解析为字符串,在浏览器中自动转码%20,这时候就访问不到文件。

image-20210425234841110

最后就可以看到return了一个json串,包含了文件信息,诸如路径和文件名等。可以直接构造表单上传试试。

漏洞利用:

本地构造文件上传表单,action替换为功能点路由:

1
2
3
4
5
6
7
8
9
10
11
<html>
<body>
<form action="http://www.keefe.is/public/index.php/home/File/upload_root" method="post"
enctype="multipart/form-data">
<label for="file">file:</label>
<input type="file" name="download" id="file" />
<br />
<input type="submit" name="submit" value="Submit" />
</form>
</body>
</html>

通过burp修改filename后加空格。可以看到回显的路径。

image-20210426000304567

测试下访问:

image-20210426000549868

成功。