0x00 前言
网太CMS PHP版 基于PHP+mysql的技术架构,php环境版本支持 php 5.3 到 php 7.3,建议用 php 7.1~7.3。
源码下载:
http://d.otcms.com/php/OTCMS_PHP_V7.16.zip
软件架构
非MVC架构
页面:smarty
数据库:Mysql
0x01 反射型XSS1
在inc\classJS.php
,发现该文件定义了一些用于js弹窗的方法。一些方法的可控字符串被AlertFilter()
方法包裹了。
AlertFilter()
方法将英文双引号替换成中文双引号,无法使用英文双引号就没法闭合alert(),那么使用了AlertFilter()
是没有XSS的。
这里有一些弹窗方法没有使用AlertFilter()
,例如HrefEnd()
,找找使用的位置。
找到使用HrefEnd()
的位置。
在users_deal.php
里backURL可控且没有做过滤。
构造Payload,为了防止document.location.href
跳转,将它的值设置为#
号即可。
测试触发XSS。
Payload:http://localhost/users_deal.php?backURL=%23%22%3balert(1);//#
0x02 反射型XSS2
在inc\classAreaApp.php
,发现了一处简单的XSS。
构造Payload测试触发反射型XSS。
Payload:http://localhost/wap/users/p.php?m=sendPhoneForm&dataID=7866&theme=1%22&_=1706170896361&type=%22%3E%3Cscript%3Ealert(1);%3C/script%3E
0x03 反射型XSS3
在wap\users\read.php
,有一处获取城市信息的功能。
跟进到inc\classProvCity.php#GetDeal()
,可以看到获取了两个参数idName、prov。
继续跟进到inc\classProvCity.php#GetCityOptionJs()
,idName被拼接之后返回给echo进行输出了。
构造Payload测试触发XSS。
Payload:http://localhost/wap/users/read.php?m=getCityData&idName=%3Cscript%3Ealert(1);%3C/script%3E
0x04 反射型XSS4
在apiRun.php#AutoRun()
看到可疑操作。
找到$mode
变量是从$_GET
获取且无过滤。
构造Payload,可以通过";
前面的内容,然后使用//
注释后续内容,中间则是XSS的内容。
构造Payload测试触发XSS。
Payload:http://localhost/apiRun.php?mode=%22;alert(1);//&mudi=autoRun
在apiRun.php#AutoRunBig()
有同样的问题。
0x05 SSRF1
用Xcheck找到一处SSRF,在inc\QrReader\QrReader.php#__construct()
里。如果file_get_contents
获取的内容不是图片,它的返回值在交给imagecreatefromstring
处理时会引发报错,所以这里只能SSRF。
根据Xcheck路径跟踪表,QrReader
对象在admin\readDeal.php#ReadQrCode()
被创建,传入了可控参数img
。
可以利用回显的延迟来对内网进行探测。
0x06 SSRF2
用Xcheck找到第二处SSRF,在inc\classReqUrl.php#UseCurl()
。
根据Xcheck路径跟踪表,UseCurl()
在inc\classReqUrl.php#UseAuto()
被使用。
接着按路径跟踪表,在admin\read.php#GetSignal()
里调用了UseAuto()
,可以看到获取了参数signalUrl
。
这里同样只能通过回显的延迟来对内网进行探测。
0x07 SSTI
在后台有模板管理功能,编辑首页index.html
试一下。
{7*7}
直接以字符串的方式显示。
重新看一下,看到{}
内的开头内容要为otcms:
,按照这个样式进行修改。
重新访问,可以看到表达式被执行了。
它使用的模板引擎是Smarty,可以使用{otcms:$smarty.version}
查看一下Smarty的版本。
通过上述内容已经可以确认这里存在SSTI漏洞了,关于Smarty的SSTI漏洞,本人之前在先知发布过一篇Smarty 最新 SSTI 总结,针对这个版本我们可以使用CVE-2021-26119
来RCE。
将构造好的Payload写入index.html。
测试触发RCE。
分析一下代码,通过抓包找到功能代码。
在admin\template_deal.php#AddOrRevFile()
很简单可以看到fileContent
没做任何防范SSTI的操作,针对文件名倒是做了许多处理。