CMS介绍
海洋cms是一款经典的开源影视建站系统,采用php语言编写。网上有很多佬已经审出0day了,海洋cms也在不停的更新,修bug,这次审计使用的是12.9的版本,非常适合php代码审计的学习。
环境搭建
phpstorm+xdebug
phpstudy
seacms v12.9安装包:https://github.com/seacms-net/CMS/
代码总览
这里文件并不多,看到文件名字差不多可以分析出这个文件内里写的是什么功能,以及我们可以找到主页index.php和普通用户的登录入口login.php。

include/webscan/webscan.php目录下存在过滤功能,可以看出过滤规则还是比较美满,可以有效预防xss和sql注入。
- $getfilter = "\\<.+javascript:window\\[.{1}\\\\x|<.*=(&#\\d+?;?)+?>|<.*(data|src)=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|<[a-z]+?\\b[^>]*?\\bon([a-z]{4,})\s*?=|^\\+\\/v(8|9)|\\b(and|or)\\b\\s*?([\\(\\)'"\\d]+?=[\\(\\)'"\\d]+?|[\\(\\)'"a-zA-Z]+?=[\\(\\)'"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?["'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|").*?(`|'|"))FROM(\\(.+\\)|\\s+?.+?|(`|'|").*?(`|'|"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
- //post拦截规则
- $postfilter = "<.*=(&#\\d+?;?)+?>|<.*data=data:text\\/html.*>|\\b(alert\\(|confirm\\(|expression\\(|prompt\\(|benchmark\s*?\(.*\)|sleep\s*?\(.*\)|\\b(group_)?concat[\\s\\/\\*]*?\\([^\\)]+?\\)|\bcase[\s\/\*]*?when[\s\/\*]*?\([^\)]+?\)|load_file\s*?\\()|<[^>]*?\\b(onerror|onmousemove|onload|onclick|onmouseover)\\b|\\b(and|or)\\b\\s*?([\\(\\)'"\\d]+?=[\\(\\)'"\\d]+?|[\\(\\)'"a-zA-Z]+?=[\\(\\)'"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?["'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)(\\(.+\\)|\\s+?.+?\\s+?|(`|'|").*?(`|'|"))FROM(\\(.+\\)|\\s+?.+?|(`|'|").*?(`|'|"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
- //cookie拦截规则
- $cookiefilter = "benchmark\s*?\(.*\)|sleep\s*?\(.*\)|load_file\s*?\\(|\\b(and|or)\\b\\s*?([\\(\\)'"\\d]+?=[\\(\\)'"\\d]+?|[\\(\\)'"a-zA-Z]+?=[\\(\\)'"a-zA-Z]+?|>|<|\s+?[\\w]+?\\s+?\\bin\\b\\s*?\(|\\blike\\b\\s+?["'])|\\/\\*.*\\*\\/|<\\s*script\\b|\\bEXEC\\b|UNION.+?SELECT\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)|UPDATE\s*(\(.+\)\s*|@{1,2}.+?\s*|\s+?.+?|(`|'|").*?(`|'|")\s*)SET|INSERT\\s+INTO.+?VALUES|(SELECT|DELETE)@{0,2}(\\(.+\\)|\\s+?.+?\\s+?|(`|'|").*?(`|'|"))FROM(\\(.+\\)|\\s+?.+?|(`|'|").*?(`|'|"))|(CREATE|ALTER|DROP|TRUNCATE)\\s+(TABLE|DATABASE)";
复制代码 include/common.php目录中也有个函数来模拟已经被php废弃的maigc_quotes_gpc。代码还是不难读懂的,重要意思就是说检查是否启动了maigc_quotes_gpc,如果没有这个函数,那么就递归遍$svar中的每一个字符,每一个字符进行addslashes过滤。
addslashes()函数功能:

- function _RunMagicQuotes(&$svar)
- {
- if(!get_magic_quotes_gpc())
- {
- if( is_array($svar) )
- {
- foreach($svar as $_k => $_v) $svar[$_k] = _RunMagicQuotes($_v);
- }
- else
- {
- $svar = addslashes($svar);
- }
- }
- return $svar;
- }
- foreach(Array('_GET','_POST','_COOKIE','_SERVER') as $_request)
- {
- foreach($$_request as $_k => $_v) ${$_k} = _RunMagicQuotes($_v);
- }
复制代码 毛病复现
/js/player/dmplayer/player/index.php 反射性xss(详见https://github.com/HuaQiPro/seacms/issues/28)
固然说反射性xss危害很小,但是还是可以配合钓鱼来进行骗cookie的(之前实习时有个项目联合公安做灰黑产打击就用反射型xss钓过鱼,别说还真能上当)这个目录下的问题不少,但是最重要的问题是,他的所有来自用户的变量大多数都没有经过过滤,前面写的规则他并没有引用。
poc:?color=%3C/style%3E%3Cscript%3Ealert(document.cookie)%3C/script%3E
poc:?vid=%3C/script%3E%3Cscript%3Ealert(1)%3C/script%3E
admin_ping.php 代码实行
先登录背景,在admin_ping.php目录下可以找到功能点
归去看源码,造成代码实行的缘故原由就是没过滤
毛病太多了,整理完了下半部门一次性写完
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。 |