关于ThinkPHP的一些渗透方式( 二 )

成功写入config.php文件,访问Addons/Example/config.php 。

关于ThinkPHP的一些渗透方式

文章插图
 
所以,在tp3开发的源码中,全局查找file_put_contents很容易中奖 。
Auth引发的RCE
在tp3中,在Auth的getAuthList方法存在eval函数,跟进代码
ThinkPHPLibraryThinkAuth.class.php 。
关于ThinkPHP的一些渗透方式

文章插图
 
这里需要满足$command变量可控就可以rce了,$command为[表前缀]_auth_rule的condition字段,还是以yershop源码来分析,控制权限的表为yershop_auth_rule 。
关于ThinkPHP的一些渗透方式

文章插图
 
所以,漏洞触发需要向condition字段写入恶意代码,要利用注入且支持pdo就能写入进去,tp3是以pdo来连接数据库的,这里满足了pdo,就需要寻找注入点来getshell了 。
在文件ApplicationHomeControllerOrderController.class.php中的detail方法,通过I方法获取id参数 。
关于ThinkPHP的一些渗透方式

文章插图
 
利用pdo修改condition字段
关于ThinkPHP的一些渗透方式

文章插图
 
继续分析,怎么调用到getAuthList这个方法的,在ApplicationAdminControllerAdminController.class.php控制器中,调用了checkRule方法,在checkRule方法实列了Auth类,并调用了check方法 。
关于ThinkPHP的一些渗透方式

文章插图
 
跟进check方法:
关于ThinkPHP的一些渗透方式

文章插图
 
在104行调用了我们的getAuthList方法,执行到了eval函数处 。要触发rce,从代码中可以看到需要普通用户的权限才会执行到checkRule方法,所以先添加一个新用户并新增一个用户组,给文章管理的权限 。
关于ThinkPHP的一些渗透方式

文章插图
 
登录这个用户,访问注入修改的路由,成功rce 。
关于ThinkPHP的一些渗透方式

文章插图
 
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
关于ThinkPHP的一些渗透方式

文章插图
 
在user变量处,断点进行分析,直接进入update方法 。
关于ThinkPHP的一些渗透方式

文章插图
 
继续跟进$this->builder->update
关于ThinkPHP的一些渗透方式

文章插图
 
在parseData方法中,进行了sql语句的拼接 。
关于ThinkPHP的一些渗透方式

文章插图
 
当参数传入数组的时候,下标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;    }


推荐阅读