exit(); } // ① $cfg_cookie_encode 值 必须已 知,才 能提交 符合 条件 的 $dede_fieldshash } $modelform = $dsql->GetOne("SELECT * FROM dede_member_model WHERE id='$modid' "); if(!is_array($modelform)) { howmsg('模型表单不存在', '-1'); exit(); } //②$modid 值必须正确 $inadd_f = ''; if(!empty($dede_fields)) { $fieldarr = explode(';', $dede_fields); //③用“;”将$dede_fields 变 量分割成为数组 if(is_array($fieldarr)) //即$dede_fields 变量至少必须包含一个“;” { foreach($fieldarr as $field) { if($field == '') continue; $fieldinfo = explode(',', $field); //④用“,”将$field 分割成为数组 if($fieldinfo[1] == 'textdata') { ${$fieldinfo[0]} = FilterSearch(stripslashes(${$fieldinfo[0]})); ${$fieldinfo[0]} = addslashes(${$fieldinfo[0]}); } else if ($fieldinfo[1] == 'img') { ${$fieldinfo[0]} = addslashes(${$fieldinfo[0]}); } else { if(empty(${$fieldinfo[0]})) ${$fieldinfo[0]} = ''; ${$fieldinfo[0]} = GetFieldValue(${$fieldinfo[0]}, $fieldinfo[1],0,'add','','diy', $fieldinfo[0]); } if($fieldinfo[0]=="birthday") ${$fieldinfo[0]}=GetDateMk(${$fieldinfo[0]}); $inadd_f .= ','.$fieldinfo[0]." ='".${$fieldinfo[0]}."'"; //⑤将用“,”分割成的数组名和值引入$inadd_f 中 } } } $inadd_f=preg_replace('/,/','',$inadd_f,1); $query = "UPDATE `{$membermodel->table}`set {$inadd_f} WHERE mid='{$cfg_ml->M_ID}'"; //⑥将$inadd_f 引入 Sql 语句中 // 清除缓存 $cfg_ml->DelCache($cfg_ml->M_ID); ...(略) //调用$dsql->ExecuteNoneQuery($query)执行 Sql 语句 } 通过分析可以得出:1)语句①②,$cfg_cookie_encode 值必须已知,才能提交符合条 件的$dede_fieldshash,提交的 $modid 值必须正确,查看该页面源码即可获得$modid 值;2) 语句③④⑤,$dede_fields 变量形式必须为“变量 1 名称,变量 1 类型;变量 2 名称,变 量 2 类型;….”,最后$inadd_f 变量值为“,变量 1 名称=’ 变量 1 值’, 变量 2 名称=’ 变 量 2 值’,……”;3)$inadd_f 直接引入 Sql 语句,因此可以使用自查询将需要注出的内容 写入个人资料中! 获取$cfg_cookie_encode 值。此值是能否成功利用漏洞二的关键,除了利用漏洞一外, 还可以通过爆破 MD5 码获取。使用$cfg_cookie_encode 变量的用户页面很多,我们选择“上 传 软件”页 面,查看 页面 源码,搜 索“ dede_fieldshash”字 符串,如图 3,其 中 $dede_fieldshash 值 为 MD5($dede_addonfields.$cfg_cookie_encode) , 由 于 $dede_addonfields 值为空,所以获得的$dede_fieldshash 值就是$cfg_cookie_encode 变 量的 MD5 码, ![]() DeDeCMS 安装时,$cfg_cookie_encode 变量默认生成规则为: $rnd_cookieEncode = chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),ord('z'))).chr(mt_rand (ord('A'),ord('Z'))).chr(mt_rand(ord('A'),ord('Z'))).chr(mt_rand(ord('a'),o rd('z'))).mt_rand(1000,9999).chr(mt_rand(ord('A'),ord('Z'))); 形式如:AaAAa9999A,即前 5 位为英文字母,分别为大写、小写、大写、大写、小写,然后 是 4 位数字,最后是 1 位大写英文字母,一共 10 位。爆破工具选择 MD5Crack 4,因为这个 版本可以按指定的规则进行破解,如图 4。 ![]() |