PageAdmin CMS最新版二次注入
2016年06月13日
原文
发现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中的注入代码中一个单引号都没有,而且页面的越权也没有被修复。本地复现成功
#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中的注入代码中一个单引号都没有,而且页面的越权也没有被修复。本地复现成功
解决方案:
#1 重写Sql_Format()函数
#2 加上权限控制,用ISSTR()判定Table参数是否合法