PageAdmin CMS最新版二次注入

发现PageAdmin官网更新了版本,就去复查了一下,然后发现厂商的修复手段等于没修复!
http://www.pageadmin.net/soft/ 选择本地下载最新版,PageAdmin V3.0.20151204(最后更新时间:2016-03-11)
Demo站换了后台地址,这次仅在本地复现。

#0 之前的漏洞是这个 http://**.**.**.**/bugs/wooyun-2016-0177673

#1 依旧是/e/master/build_static.aspx 这个页面



原来的代码是这样的:

if(IsNum(Ids)){
 sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Table+" where html=2 and id="+Ids;
}
else
{
sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Table+" where html=2 and id in("+Ids+")";
}



而在最新的版本中被修复为了:

if(IsNum(Ids))
        {
         sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Sql_Format(Table)+" where html=2 and id="+Ids;
        }
       else
        {
         sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Sql_Format(Table)+" where html=2 and id in("+Ids+")";
        }





#2 审计Sql_Format()函数
 

private string Sql_Format(string str)
 {
  if(str=="" || str==null)
   {
    return "";
   }
   str=str.Replace("'","''");
   str=str.Replace(""","""); 
   return str;
 }



发现仅仅将'替换为了'' 而"还是替换成立"

然而我上个漏洞中的POC中的注入代码中一个单引号都没有,而且页面的越权也没有被修复。本地复现成功
 

poc.png

 

#0 之前的漏洞是这个 http://**.**.**.**/bugs/wooyun-2016-0177673

#1 依旧是/e/master/build_static.aspx 这个页面



原来的代码是这样的:

if(IsNum(Ids)){
 sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Table+" where html=2 and id="+Ids;
}
else
{
sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Table+" where html=2 and id in("+Ids+")";
}



而在最新的版本中被修复为了:

if(IsNum(Ids))
        {
         sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Sql_Format(Table)+" where html=2 and id="+Ids;
        }
       else
        {
         sql="select id,site_dir,static_dir,static_file,lanmu_id,sublanmu_id from "+Sql_Format(Table)+" where html=2 and id in("+Ids+")";
        }





#2 审计Sql_Format()函数
 

private string Sql_Format(string str)
 {
  if(str=="" || str==null)
   {
    return "";
   }
   str=str.Replace("'","''");
   str=str.Replace(""","""); 
   return str;
 }



发现仅仅将'替换为了'' 而"还是替换成立"

然而我上个漏洞中的POC中的注入代码中一个单引号都没有,而且页面的越权也没有被修复。本地复现成功
 

poc.png

 

解决方案:

#1 重写Sql_Format()函数

#2 加上权限控制,用ISSTR()判定Table参数是否合法