用户注册处。
当用户名带入单引号时,虽然添加用户进入数据库时做了转义,但是赋值于session时又被带入了
session('user_name',I('param.user_name'));
然后我们来看看这个函数mc_user_id()
/Application/Common/Common/function.php
这就到了这个漏洞比较有意思的地方了、由于不能报错 所以我们得让数据出现在$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日志吧~
exp:
(14是 注册id。先注册一个获取id。注入时在这个id加上1即可)
首先添加账户进入数据库时是没问题的。做了转义
然后 带入 mc_user_id()函数时
此时 我们的$page_id 将返回
然后 $user_pass_true = mc_get_meta($page_id,'user_pass',true,'user');
此时 返回的user_pass 就等于 我们session所对应的user_pass了。于是 将数据
返回 造成了注入