我们相信:世界是美好的,你是我也是。平行空间的世界里面,不同版本的生活也在继续...

苏南大叔再来发一个thinkphp@3.2.3的经典漏洞,最新的thinkphp@5.0.3中是没有本文所描述的这个漏洞的。所以,各位不明真相的吃瓜群众,可以暂时散散了。

苏南大叔:thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行 - thinkphp-bug-display
thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行(图4-1)

本文描述的漏洞可以用于破解上一个.log日志查看的漏洞。就是说,对于可下载的log日志,即使在nginx层面上已经deny all了。但是利用本文中的漏洞,还是可以越权查看log日志。这个问题,就貌似很大了。上一篇文章链接见文章末尾。

20220304 update:有点平行世界了,最近下载thinkphp3.2.3_full咋找不到这个漏洞了呢?

禁止直接下载日志

对于thinkphp@3.2.3来说,日志文件的默认位置是:./data/runtime/Logs/目录下。对于常见的nginx容器来说,可以这样修改战斗配置文件来杜绝查看日志文件。

location / {
    # ...
    location ~ .*\.(log)?$ {
        deny all;
    }
}

苏南大叔:thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行 - logs_deny_all
thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行(图4-2)

取得日志内容

nginx层面上来说,是不会直接读取到.log文件了。但是,thinkphp@3.2.3还有其他办法可以读取到这个文件。方式如下:

newsn.net:这里是【评论】可见内容

苏南大叔:thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行 - thinkphp-bug-display-poc
thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行(图4-3)

就是说,调用display方法,传入参数:templateFile。这里不仅仅是用于查看log文件了,理论上根目录下面任何文件都能够被查看出来。但是这个过程是个文件包含include的概念,所以,php语句会被执行。

读取执行任意文件

因为这个display操作中的templateFile是个包含的概念,而不是读取。所以这也是个危险的设定,万一非法上传了某个包含php语句的文件,就可以利用这个方法来执行非法语句了。比如:

http://localhost/?a=display&templateFile=hack.txt

hack.txt里面的内容是一些php语句,那么这个语句就会被立刻执行。

<?php
echo "hacker!";

苏南大叔:thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行 - thinkphp-bug-display-poc2
thinkphp3.2.3经典漏洞:任何文件可以被越权包含执行(图4-4)

相关链接

总结

以前苏南大叔有个同事,是个坚定的thinkphp黑粉,他的理由是:thinkphp漏洞太多。苏南大叔表示傻傻不明白,一直到很多年后的今天,才觉得那位同事,说的确实是有些道理。但是,这并不是抛弃thinkphp的理由。

更多thinkphp的相关文章,请点击苏南大叔的博客:

如果本文对您有帮助,或者节约了您的时间,欢迎打赏瓶饮料,建立下友谊关系。
本博客不欢迎:各种镜像采集行为。请尊重原创文章内容,转载请保留作者链接。

 【福利】 腾讯云最新爆款活动!1核2G云服务器首年50元!

 【源码】本文代码片段及相关软件,请点此获取更多信息

 【绝密】秘籍文章入口,仅传授于有缘之人   thinkphp