Seacms最新版多处update注入(绕过360webscan)
update注入一枚,通过dns直接获取敏感信息。
版本:V6.23
同时绕过80sec ids,360webscan
SeaCms有一个类似全局注册变量的机制,为后面的漏洞埋下了伏笔
//检查和注册外部提交的变量
foreach($_REQUEST as $_k=>$_v)
{
if( strlen($_k)>0 && m_eregi('^(cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k]) )
{
exit('Request var not allow!');
}
}
function _RunMagicQuotes(&$svar)
{
if(!get_magic_quotes_gpc())
{
if( is_array($svar) )
{
foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
}
else
{
$svar = addslashes($svar);
}
}
return $svar;
}
foreach(Array('_GET','_POST','_COOKIE') as $_request)
{
foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
}
漏洞文件:/include/ajax.php
11-44行
switch ($action) {
case "digg":
case "tread":
case "score":
echo scoreVideo($action);
break;
case "diggnews":
case "treadnews":
case "scorenews":
echo scoreNews($action);
break;
case "hit":
echo updateHit();
break;
case "hitnews":
echo updateHitNews();
break;
case "addfav":
echo addfav();
break;
case "videoscore":
case "newsscore":
echo getScore($action);
break;
case "vpingfen":
echo vpingfen($action);
break;
case "npingfen":
echo npingfen($action);
break;
case "member":
echo member();
break;
}
问题出在了scoreVideo()函数,跟进这个函数
function scoreVideo($operType){
global $id,$dsql,$score;
if($id < 1) return "err";
.......此处省略几行代码..........
}elseif($operType=="score"){
if(GetCookie("ssea3_score".$id)=="ok") return "havescore";
$dsql->ExecuteNoneQuery("Update `sea_data` set v_scorenum=v_scorenum+1,v_score=v_score+".$score." where v_id=$id");
PutCookie("ssea3_score".$id,"ok",3600 * 24,'/');
return '';
}else{
return "err";
}
}
$dsql->ExecuteNoneQuery("Update `sea_data` set v_scorenum=v_scorenum+1,v_score=v_score+".$score." where v_id=$id");
$id和$score都可以控,造成了SQL注入。
当
$score=2,v_digg=(select user())
的时候,意外的把字段v_digg的内容利用子查询更新成工具者想获取的信息
接下来编写poc
首先理清程序的逻辑
$action=score 才能进入scoreVideo()这个函数
同时$id要大于1,否则 return "err";
Cookie中ssea3_score.$id的值不能为ok,否则 return "havescore";
因为无法直接获取子查询的数据,这里我使用DNS来获取数据(这个方法的局限性是目标环境要使用root用户连接的数据库才能获取到数据)
参考《在SQL注入中使用DNS获取数据》
理论上poc为:
但是由于程序使用了80sec的ids。绕过后的POC:
在本地调试的时候,360webscan不会进行拦截,但在实际线上环境中,上面的poc是会被360webscan拦截的。
此还得绕过360webscan(最终poc在测试代码中)
找了一个线上环境:http://**.**.**.**/
dns获取到的
用户:mosss 密码:78832884f6c8c932a264
Seacms的加密方式和dedecms都是20位的md5,要还原密码得前减3位后减1位,得到16位MD5
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论