成功写入config.php文件,访问Addons/Example/config.php 。
文章插图
所以,在tp3开发的源码中,全局查找file_put_contents很容易中奖 。
Auth引发的RCE
在tp3中,在Auth的getAuthList方法存在eval函数,跟进代码
ThinkPHPLibraryThinkAuth.class.php 。
文章插图
这里需要满足$command变量可控就可以rce了,$command为[表前缀]_auth_rule的condition字段,还是以yershop源码来分析,控制权限的表为yershop_auth_rule 。
文章插图
所以,漏洞触发需要向condition字段写入恶意代码,要利用注入且支持pdo就能写入进去,tp3是以pdo来连接数据库的,这里满足了pdo,就需要寻找注入点来getshell了 。
在文件ApplicationHomeControllerOrderController.class.php中的detail方法,通过I方法获取id参数 。
文章插图
利用pdo修改condition字段
文章插图
继续分析,怎么调用到getAuthList这个方法的,在ApplicationAdminControllerAdminController.class.php控制器中,调用了checkRule方法,在checkRule方法实列了Auth类,并调用了check方法 。
文章插图
跟进check方法:
文章插图
在104行调用了我们的getAuthList方法,执行到了eval函数处 。要触发rce,从代码中可以看到需要普通用户的权限才会执行到checkRule方法,所以先添加一个新用户并新增一个用户组,给文章管理的权限 。
文章插图
登录这个用户,访问注入修改的路由,成功rce 。
文章插图
SQL注入
在TP3.1.3和TP3.2.3注入都差不多,无非就表达式注入,bind注入,find/select/delete注入,order注入,在之前的文章中,分析过关于tp3.2.3的注入,这里主要是TP5的注入 。
ThinkPHP<=5.0.16 insert/update注入
在ThinkPHP5中,获取请求方式的方法是input,在控制器中,写个存在漏洞的demo:
public function getuser(){ $username = input('get.username/a'); $user = db('user')->where(['uid'=>1])->update(['username'=>$username]); dump($user); }
漏洞payload:username[0]=dec&username[1]=updatexml(1,concat(0x7e,user(),0x7e),1)&username[2]=1
文章插图
在user变量处,断点进行分析,直接进入update方法 。
文章插图
继续跟进$this->builder->update
文章插图
在parseData方法中,进行了sql语句的拼接 。
文章插图
当参数传入数组的时候,下标0为exp时候,直接返回下标为1的参数值,而为inc或者dec时候,通过parseKey方法处理了下标为1的参数值,跟进查看parseKey方法:
protected function parseKey($key, $options = []) { $key = trim($key); if (strpos($key, '$.') && false === strpos($key, '(')) { // JSON字段支持 list($field, $name) = explode('$.', $key); $key = 'json_extract(' . $field . ', '$.' . $name . '')'; } elseif (strpos($key, '.') && !preg_match('/[,'"()`s]/', $key)) { list($table, $key) = explode('.', $key, 2); if ('__TABLE__' == $table) { $table = $this->query->getTable(); } if (isset($options['alias'][$table])) { $table = $options['alias'][$table]; } } if (!preg_match('/[,'"*()`.s]/', $key)) { $key = '`' . $key . '`'; } if (isset($table)) { if (strpos($table, '.')) { $table = str_replace('.', '`.`', $table); } $key = '`' . $table . '`.' . $key; } return $key; }
推荐阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 古代人多久洗澡 古代人一年洗几次澡
- Java5,6,7,8的主要新特性归纳
- 土豆豆芽汤的做法
- 百菇汤的做法
- 田园汤的做法
- 清汤素高汤的做法
- 猴魁茶有哪些功效,太平猴魁茶的鉴别方法
- 熟地归芪羊肉汤的做法
- 金骏眉泡沫破裂,金骏眉的功效
- 复元汤的做法