用户
搜索
  • TA的每日心情
    慵懒
    昨天 12:30
  • 签到天数: 175 天

    连续签到: 1 天

    [LV.7]常住居民III

    i春秋作家

    推荐小组副组长

    Rank: 7Rank: 7Rank: 7

    62

    主题

    174

    帖子

    727

    魔法币
    收听
    2
    粉丝
    4
    注册时间
    2017-12-4

    i春秋认证秦幽默灌水王突出贡献春秋文阁积极活跃奖核心白帽i春秋签约作者i春秋推荐小组楚

    夜莺 i春秋作家 推荐小组副组长 i春秋认证 秦 幽默灌水王 突出贡献 春秋文阁 积极活跃奖 核心白帽 i春秋签约作者 楼主
    发表于 2018-7-2 21:56:58 25596
    本帖最后由 夜莺 于 2018-7-2 21:58 编辑


      本文主要针对的是laravel框架的二次开发的CMS,公司现在内部正在开发的一套系统就是基于Laravel进行的二次开发。
    先科普一点小知识:

    路由
      经常使用或者曾经使用过ThinkPHP之类框架的人,肯定都知道路由(Route)这么一个概念,Laravel的路由配置在App\Providers\RouteServiceProvider.php中,其中function map就记录了框架的路由信息保存的位置

    22.png

      所以我们直接跳到路由文件去查看Laravel框架的路由是怎么写的吧App\Http\routes.php   

    22.png

       group表示在这一个group()里面,都使用相同的配置(应该可以这么说吧)prefix表示无论下面是何种请求,都要在前面加上adminnamespace表示的是在哪一个命名空间内get表示的是只允许get请求uses后面接的东西,表示这一个请求是通过哪一个控制器的哪一个函数去进行处理的middlewarelaravel特有的中间件,就像java web的过滤器一样下面举个例子,比如网址是www.ooxx.com
    Route::group(['namespace' => 'Admin'], function () {    Route::post('new/api/login', ['uses' => 'AdminController@postLogin']);});
    那么这一个路由的意思就是,处理posthttp://www.ooxx.com/new/api/login的请求是由App\Http\Controllers\Admin(命名空间)\AdminController.php(控制器)中的postLogin函数处理。中间件中间件是Laravel特有的东西,那么这个又是在哪里定义的呢?答案就在App\Http\Kernel.php中.
    22.png

      在上文中,我们看到了有一个中间件叫token,那么放到这个图里面,我们明显发现。Token中间件就是\App\Http\Middleware\TokenSession这个类啊,那么这个类又是干嘛的呢?我们点进去看就会发现原来是验证cookie里面是否有XSRF-TOKENLaravel_session

    22.png

      大致的基础已经讲好了,接下来开始本文的正文。
      通过查看路由文件,发现get请求/driver_portrait/personal_portrait_search时,在Beeper_bi_web\app\Http\Controllers\DriverPortrait\DriverPortraitController.php中存在点问题。

    22.png

    [AppleScript] 纯文本查看 复制代码
    /**
         * 点击个人画像查询数据
         *
         * @param Request $request
         * @return array
         */
        public function personalPortraitSearch(Request $request)
        {
            $this->validate($request, [
                'sub_menu_code' => 'required',
            ]);
            //前端判断ajax成功
            if(empty($request->input('driver_name')) &&  empty($request->input('driver_id')))
            {
                return $this->output_to_front([
                    'data' => ''
                ]);
            }
            $where = $this->getWhere($request);    //$where 是一维数组,记录了driver_name和driver_id
            $params['where'] = $where;
            $sub_menu_code = $request->input('sub_menu_code');   // personal_introduce
            $params['sub_menu_code'] = $sub_menu_code;
            $data = $this->pull('v1/report/driver_portrait/driver_portrait_search', $params, 'post', true);
            $data = json_decode($data, true);
            if ($data['code'] == 0) {
                $data = $this->data2Tags($data['info'][0], $sub_menu_code, $request);
            }
            return $this->output_to_front([
                'data' => $data
            ]);
        }

    sublime中连续ctrl+t,找到getWhere的定义处,可以明显看出来只是把提交的driver_name变量的值分割,再检查driver_id是否有值,最后返回给$where数组

    [AppleScript] 纯文本查看 复制代码
    public function getWhere(Request $request)
        {
    
            $where = [];
            $driver_name = $request->input('driver_name');
            if (!empty($driver_name)) {
                if (stripos($driver_name, "|") !== false) {
                    $arr = explode('|', $driver_name);
                    $where[] = ['driver_name', $arr[0]];
                    $where[] = ['driver_id', $arr[1]];
                } else {
                    $where[] = ['driver_name', $driver_name];
                }
            }
    
            $driver_id = $request->input('driver_id');
            if (!empty($driver_id)) {
                $where[] = ['driver_id', $driver_id];
            }
    
            return $where;
        }


      接着又回头在personalPortraitSearch中继续运行,定义了一个$params数组,内容包含了来自客户端的sub_menu_codegetWhere函数返回的$where,接着
    $params数组请求远端的API

    22.png

    [AppleScript] 纯文本查看 复制代码
    public function personalPortraitSearch()
        {
            $params = $this->request->all();
            $where=$params['where'];
            $item=$params['sub_menu_code'];
            $data = $this->service->search($where,$item);//        $this->setCode(1002);
            if(empty($data))
            {
                return $this->Output();
            }
            return $this->formatOutput($data);
        }

      由此可见,直接进入search函数了,那么search函数又是在哪里定义的呢?可以看到前面是service->,那我们回到文件上方,并没有构造一个service类,所以只能到他的父类去寻找这个service类,也就是下图的BaseReportController,文件上方也显示了BaseReportController的位置在App\V1\Report\Controllers\BaseReportController
    22.png

    去到BaseReportController中查看,查找到search函数
    22.png

    附上SQLMap的运行截图吧
    22.png



    低调求发展,潜心学安全 个人博客www.shallowdream.cn
    发表于 2018-7-2 23:54:56
    赞一个,感谢分享经验,下次学习审计ThinkPHP
    专注网络安全与程序开发,博客:https://blog.dyboy.cn
    使用道具 举报 回复
    支持一下~
    使用道具 举报 回复
    发新帖
    您需要登录后才可以回帖 登录 | 立即注册