某处逻辑问题导致GetShell
文件位置:/phpcms/libs/classes/attachment.class.php
解决办法(Line 144):
//在144行后添加一行
if($ext !== 'gif|jpg|jpeg|bmp|png'){
if(!in_array(strtoupper($ext),array('JPG','GIF','BMP','PNG','JPEG'))) exit('附加扩展名必须为gif、jpg、jpeg、bmp、png');
}
phpsso.php注入漏洞修复
文件位置:/phpcms/libs/classes/attachment.class.php
解决办法(Line 129):
$arr['uid'] = intval($arr['uid']);
$phpssouid = $arr['uid'];
替换为,二合一代码:
$phpssouid = intval($arr['uid']);
authkey生成算法问题导致authkey泄露
文件位置:caches/configs/system.php
解决办法:
1.在/caches/configs/system.php,增加第一个参数:
'alivulfix' => 'yes',
修改后,代码截图如下: 2.找到并修改auth_key,20位字符串;具体写什么,自定义即可。
'auth_key' => '2qKYgs0PgHWWtaFVb3KP', //密钥
3.找到并修改auth_key,32位字符串;具体写什么,自定义即可。
'phpsso_auth_key' => 'hjor66pewop_3qooeamtbiprooteqein', //加密密钥
注意:到了这一步,网站用户暂时都登录不了,接下来还有最重要的一步。
4、后台登录phpsso管理中心,在导航菜单phpsso ——> 应用管理 ——> 编辑中,编辑“通信密钥”为第3步设置的’phpsso_auth_key’ 的值,然后点击提交。
提交之后,页面显示通信成功
,如下图。
5.最后,额外去测试一下登录。
前台注入导致任意文件读取漏洞
文件位置:/phpcms/modules/content/down.php
解决方法:
1.找到对应文件down.php 的对应位置(第18、89行 附近),添加或替换相应的代码。
补丁代码片段如下:
$a_k = safe_replace($a_k);
parse_str($a_k);
修改后的补丁代码片段截图如下:
第一处修改,第18行附近:
第二处修改,第89行附近:
注意:第一处和第二处的补丁代码内容一样。
第三处修改,第120行附近:
补丁代码片段如下:
$fileurl = str_replace(array('<','>'), '',$fileurl);
file_down($fileurl, $filename);
修改后的补丁代码片段截图如下:
PHPCMS V9宽字节注入问题
文件位置:/phpcms/modules/pay/respond.php
解决方法(Line 14):
找到 respond_get()
替换成下面的代码,代码如下:
public function respond_get() {
if ($_GET['code']){
$code = mysql_real_escape_string($_GET['code']);//注意修改
$payment = $this->get_by_code($code);//注意修改
if(!$payment) showmessage(L('payment_failed'));
$cfg = unserialize_config($payment['config']);
$pay_name = ucwords($payment['pay_code']);
pc_base::load_app_class('pay_factory','',0);
$payment_handler = new pay_factory($pay_name, $cfg);
$return_data = $payment_handler->receive();
if($return_data) {
if($return_data['order_status'] == 0) {
$this->update_member_amount_by_sn($return_data['order_id']);
}
$this->update_recode_status_by_sn($return_data['order_id'],$return_data['order_status']);
showmessage(L('pay_success'),APP_PATH.'index.php?m=pay&c=deposit');
} else {
showmessage(L('pay_failed'),APP_PATH.'index.php?m=pay&c=deposit');
}
} else {
showmessage(L('pay_success'));
}
}
添加后的代码,截图示例如下:
poster.php注入漏洞
文件位置:/phpcms/modules/poster/poster.php
解决方法(Line 221):
// 修改之前
...
if ($_GET['group']) {
$group = " `".$_GET['group']."`";
$fields = "*, COUNT(".$_GET['group'].") AS num";
$order = " `num` DESC";
}
...
在代码if ($_GET['group']) {
的后面,添加代码:
$ _GET['group'] = preg_replace('#`#', '', $_GET['group']);
// 修改之后
...
if ($_GET['group']) {
$_GET['group'] = preg_replace('#`#', '', $_GET['group']);
$group = " `".$_GET['group']."`";
$fields = "*, COUNT(".$_GET['group'].") AS num";
$order = " `num` DESC";
}
...
index.php注入漏洞
文件位置:/phpcms/modules/member/index.php
解决方法(Line 615):
原来代码:
$password = isset($_POST['password']) && trim($_POST['password']) ?
trim($_POST['password']) :
showmessage(L('password_empty'),HTTP_REFERER);
修改为:
$password = isset($_POST['password']) && trim($_POST['password']) ?
addslashes(urldecode(trim($_POST['password']))) :
showmessage(L('password_empty'), HTTP_REFERER);
其他漏洞提示
请参考云栖社区文章