SeaCMS v10.1代码审计实战

您所在的位置:网站首页 海洋cms源码 SeaCMS v10.1代码审计实战

SeaCMS v10.1代码审计实战

2024-07-03 01:41| 来源: 网络整理| 查看: 265

前言

seacms是一个代码审计入门级的cms,比较适合我这种小白玩家来学习,如果有什么错误欢迎指出。

环境

phpstudy pro php5.4.45nts

seay代码审计工具

phpstrom sqlmap seacms v10.1

因为这个cms的官网已经打不开了,所以发一下自己保存的代码

链接https://pan.baidu.com/s/1f9mXyOX6sgsersyNz-kDQg提取码j3k0

安装cms

可以参照目录下的海洋CMS使用手册来进行配置

在安装之后系统会生成一个随机后台

思路总结

通过查看目录结构与相关文件名称了解功能,查看配置文件,

浏览网站,了解cms的功能,对可能存在漏洞的地方进行记录,也可以结合xray进行扫描,

不过个人不太推荐结合xray,特别是在测试后台的时候,可能会把环境搞蹦,并且成功率不是很高

对文件上传,sql语句拼接,文件写入(写配置)相关功能点重点关注,

如果自动化工具不能找到漏洞点,可以通过seay配合,查看可能的漏洞点,进行反向查找

如果对代码不够理解的话可以通过phpstrom进行动态调试,查看参数传递与语句拼接,

通过phpstrom调试查看自己的payload在哪里被过滤与处理,进行相应修改

代码审计目录结构

│─admin //后台管理目录(这里为随机生成的w1aqhp)

│ │─coplugins //已停用目录

│ │─ebak //帝国备份王数据备份

│ │─editor //编辑器

│ │─img //后台静态文件

│ │─js //后台js文件

│ │─templets //后台模板文件

│─article //文章内容页

│─articlelist //文章列表页

│─comment //评论

│ │─api //评论接口文件

│ │─images //评论静态文件

│ │─js //评论js文件

│─data //配置数据及缓存文件

│ │─admin //后台配置保存

│ │─cache //缓存

│ │─mark //水印

│ │─sessions //sessions文件

│─detail //视频内容页

│─include //核心文件

│ │─crons //定时任务配置

│ │─data //静态文件

│ │─inc //扩展文件

│ │─webscan //360安全监测模块

│─install //安装模块

│ │─images //安装模块静态文件

│ │─templates //安装模块模板

│─js //js文件

│ │─ads //默认广告目录

│ │─player //播放器目录

│─list //视频列表页

│─news //文章首页

│─pic //静态文件

│ │─faces //表情图像

│ │─member //会员模块界面

│ │─slide //旧版Flash幻灯片

│ │─zt //专题静态文件

│─templets //模板目录

│─topic //专题内容页

│─topiclist //专题列表页

│─uploads //上传文件目录

│─video //视频播放页

│─weixin //微信接口目录

└─index.php //首页文件

后台sql注入(一)

在对后台测试的时候,在添加数据的时候系统都会先检查数据是否存在,如果不存在之后再进行添加,于是分析检查数据存在的数据包

在w1aqhp\admin_ajax.php的76行进入判断

代码语言:javascript复制elseif($action=="checkrepeat"){ $v_name=iconv('utf-8','utf-8',$_GET["v_name"]); $row=$dsql->GetOne("select count(*) as dd from sea_data where v_name='$v_name'"); $num=$row['dd']; if($num==0){echo "ok";}else{echo "err";}}

对传入的参数进行编码处理,在下一行对参数进行拼接没有进行过滤,跟进GetOne函数

代码语言:javascript复制 function GetOne($sql='' ) { global $dsql; if($dsql->isClose) { $this->Open(false); $dsql->isClose = false; } //SQL语句安全检查 $sql=CheckSql($sql); if(!empty($sql)) { if(!m_eregi("limit",$sql)) $this->SetQuery(m_eregi_replace("[,;]$",'',trim($sql))." limit 0,1;"); else $this->SetQuery($sql); } $this->Execute("one"); $arr = $this->GetArray("one"); if(!is_array($arr)) { return ''; } else { @mysqli_free_result($this->result["one"]); return($arr); } }

进行了sql语句安全检查,跟进CheckSql函数

代码语言:javascript复制/* * 提示:该行代码过长,系统自动注释不进行高亮。一键复制会移除系统注释 * //SQL语句过滤程序,由80sec提供,这里作了适当的修改function CheckSql($db_string,$querytype='select'){ global $cfg_cookie_encode; $clean = ''; $error=''; $old_pos = 0; $pos = -1; $log_file = sea_INC.'/../data/'.md5($cfg_cookie_encode).'_safe.txt'; $userIP = GetIP(); $getUrl = GetCurUrl(); $db_string = str_ireplace('--', "", $db_string); $db_string = str_ireplace('/*', "", $db_string); $db_string = str_ireplace('*/', "", $db_string); $db_string = str_ireplace('*!', "", $db_string); $db_string = str_ireplace('//', "", $db_string); $db_string = str_ireplace('\\', "", $db_string); $db_string = str_ireplace('hex', "he", $db_string); $db_string = str_ireplace('updatexml', "updatexm", $db_string); $db_string = str_ireplace('extractvalue', "extractvalu", $db_string); $db_string = str_ireplace('benchmark', "benchmar", $db_string); $db_string = str_ireplace('sleep', "slee", $db_string); $db_string = str_ireplace('load_file', "load-file", $db_string); $db_string = str_ireplace('outfile', "out-file", $db_string); $db_string = str_ireplace('ascii', "asci", $db_string); $db_string = str_ireplace('char(', "cha", $db_string); $db_string = str_ireplace('substr', "subst", $db_string); $db_string = str_ireplace('substring', "substrin", $db_string); $db_string = str_ireplace('script', "scrip", $db_string); $db_string = str_ireplace('frame', "fram", $db_string); $db_string = str_ireplace('information_schema', "information-schema", $db_string); $db_string = str_ireplace('exp', "ex", $db_string); $db_string = str_ireplace('GeometryCollection', "GeometryCollectio", $db_string); $db_string = str_ireplace('polygon', "polygo", $db_string); $db_string = str_ireplace('multipoint', "multipoin", $db_string); $db_string = str_ireplace('multilinestring', "multilinestrin", $db_string); $db_string = str_ireplace('linestring', "linestrin", $db_string); $db_string = str_ireplace('multipolygon', "multipolygo", $db_string); //如果是普通查询语句,直接过滤一些特殊语法 if($querytype=='select') { $notallow1 = "[^0-9a-z@\._-]{1,}(union|sleep|benchmark|load_file|outfile)[^0-9a-z@\.-]{1,}"; //$notallow2 = "--|/\*"; if(m_eregi($notallow1,$db_string)){exit('SQL check');} if(m_eregi('',$db_string)){exit('SQL check');} if(m_eregi('if:',$db_string)){exit('SQL check');} if(m_eregi('--',$db_string)){exit('SQL check');} if(m_eregi('char(',$db_string)){exit('SQL check');} if(m_eregi('*/',$db_string)){exit('SQL check');} } //完整的SQL检查 while (true) { $pos = stripos($db_string, '\'', $pos + 1); if ($pos === false) { break; } $clean .= substr($db_string, $old_pos, $pos - $old_pos); while (true) { $pos1 = stripos($db_string, '\'', $pos + 1); $pos2 = stripos($db_string, '\\', $pos + 1); if ($pos1 === false) { break; } elseif ($pos2 == false || $pos2 > $pos1) { $pos = $pos1; break; } $pos = $pos2 + 1; } $clean .= '$s$'; $old_pos = $pos + 1; } $clean .= substr($db_string, $old_pos); $clean = trim(strtolower(preg_replace(array('~\s+~s' ), array(' '), $clean))); if (stripos($clean, '@') !== FALSE OR stripos($clean,'char(')!== FALSE OR stripos($clean,'script>')!== FALSE OR stripos($clean,'


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3