前言
今天看到該cms進行了更新,分享一下前段時間發現的一處安全問題
漏洞利用
寫此文時筆者使用的是2.0.9測試版本,發布時間為2020-05-05,最新更新時間為2020-06-18
在github上下載源碼
https://github.com/hnaoyun/PbootCMS
安裝后去https://www.pbootcms.com/freesn/獲取授權碼,登錄后台添加授權碼即可
正常登錄后台,在站點信息中插入如下代碼並且保存
保存后我們來到前台首頁,使用burpsuite進行抓包,將數據包中的cookie頭設為assert,Proxy-Connection頭設置為想要執行的php代碼,測試圖片中使用的代碼為system('whoami') 如圖
可以看到成功的執行了php代碼
代碼分析
漏洞可以利用的原因在於apps\home\controller\ParserController.php中parserIfLabel函數對if標簽解析時安全檢驗做的不夠全面,函數主要存在兩處安全校驗,如圖
對於第一處if判斷,我們可以在函數名和括號之間插入控制字符,如\x01,這樣即可繞過該處正則校驗,並且可以正常執行php代碼,該trick來源於KCon2019的一個議題
完整的ppt可以參見文末鏈接
對於第二處對於敏感函數的過濾,完整的校驗如下
if (preg_match('/(\$_GET\[)|(\$_POST\[)|(\$_REQUEST\[)|(\$_COOKIE\[)|(\$_SESSION\[)|(file_put_contents)|(file_get_contents)|(fwrite)|(phpinfo)|(base64)|(`)|(shell_exec)|(eval)|(assert)|(system)|(exec)|(passthru)|(print_r)|(urldecode)|(chr)|(include)|(request)|(__FILE__)|(__DIR__)|(copy)/i', $matches[1][$i])) {
$danger = true;
}
在這里其實做的過濾並不全面,我們可以擴展思路,結合一些其他函數,例如call_user_func函數來進行利用,同時可以參考PHP無參數RCE的考點,將可控輸入點轉移到請求包的header頭中,直接繞過cms中存在的一些過濾項,上面的利用方式中,使用了getallheaders()同時配合一些數組操作函數來達到執行任意代碼的目的







