當前位置:
首頁 > 新聞 > 挖洞經驗 | 記一次曲折的Getshell過程

挖洞經驗 | 記一次曲折的Getshell過程

*本文原創作者:三隻小瀦,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載


最近在挖某框架的漏洞,其中挖到一枚Getshell,挖的過程有點曲折感覺可以寫篇文章總結一下,方便與各位大牛交流交流。

因為此框架有大量用戶,並且此漏洞並未修復,故此隱去所有有關此框架的信息,連文章中出現的代碼都是我自己另寫的,重在思路,希望大家理解。


首先通過審計定位到可能導致漏洞的代碼(路徑:/edit/creat.php):



其中 $GP 是合併 $GET 和 $_POST 的變數。


可以看到寫入的文件路徑和寫入的部分內容都是可控的,看到這裡不禁露出了一絲笑容,沒想到一枚 getshell 如此輕鬆。


好吧,先測試一下,把$file的值設置為:

<?php echo 1111; ?>.php

post 到 /index.php? control=edit&action=creat


(此框架是單入口)


預計生成的文件內容是:



好了,那訪問一下生成的文件,URL:



右鍵查看一下源碼,發現輸出的內容是:




居然被過濾了? 回溯之前的代碼,在 index.php 文件中發現代碼:


關鍵在開始的兩行代碼上,htmlEncode ? 搜索這個函數,找到這個函數的代碼如下:



結合起來,就是對 post 和 get 獲取到的所有內容進行htmlspecialchars,所以才會出現上面所看到的尖括弧被過濾的情況。


看到這裡,臉上的笑容都消失了,哎呀,果然沒那麼容易。尖括弧過濾了,那就沒辦法寫入PHP 代碼的解析標籤了,想不到什麼突破的辦法,難道就這樣放棄么?開始犯愁…


一直想著:過濾了尖括弧怎麼辦?過濾了尖括弧怎麼辦?過濾了尖括弧怎麼辦……


那我能不能不用尖括弧呢?不用尖括弧能不能解析?要怎麼才能解析?想到這裡,突然就想到模板!這個框架的模板和大多數 MVC 的模板一樣,使用大括弧作為標記:



這樣就可以使用模板的標記 {} 來繞過尖括弧 <> 的過濾,但是根據這個框架的路由協定,模板不能隨便被包含,所以只能覆蓋原有的模板。


按照這個思路,找一個有載入模板的功能,覆蓋載入的模板,覆蓋之後訪問了就可以解析了。按照這個思路,找到一個載入了模板的功能,URL是:

/index.php? control=basic&action=index

代碼路徑在/basic/index.php,代碼最後就有調用 view(『index』);

載入的模板路徑在:

/themes/basic/index.html

按照這些信息,應該構造 $file 的值為:

../../themes/basic/index.html

但是這樣又有一個問題了,雖然構造這樣的值可以覆蓋原有的模板文件,但是寫入的文件內容就是:



這樣的話就沒有寫入需要的 Webshell 了,怎麼辦呢?!


根據 URL 的特性,./1.php 和 ./test/../1.php 訪問的內容是一樣的,都是 1.php 這個文件,但是 test 這個目錄名我是可以隨便寫的,再根據模板偽代碼的格式構造一個控制 $file 的測試 POC:



(根據 view() 函數的代碼,有一個{php }偽代碼標籤,處理的時候會替換為 <?php >。其實就算是沒有這標籤也可以用其他非組合的標籤代替)



生成的文件內容為:


訪問 URL:

/index.php? control=basic&action=index

右鍵查看源碼,輸出的內容為:



證明代碼執行了,那構造一個包含一句話的 POC,按照上一個 POC 的思路,應該把 file 的值構造為:



 但是訪問後發現輸出的內容為:


想起 $file 的值是通過框架封裝的

$

GP 的值都經過了 htmlencode,怎麼辦呢?! 根據 PHP 的特性,$_POST[『w』] 獲取值的時候可以把引號去掉,所以可以把 poc 改為:




訪問 URL:/index.php? control=basic&action=index ,給參數 w傳值 echo 1111;



右鍵查看源碼,內容為:



證明 post 的代碼確實被執行了,到伺服器上執行:



至此,getshell 完成,雖然過程有點艱辛,但還是拿下了。


最後總結一下:



1. 剛開始遇到過濾尖括弧等的 HTML 字元的時候,利用了 MVC 模板中的偽代碼代替繞過了


2. 遇到覆蓋文件時候填寫完整路徑不能寫入payload 的問題,使用了構造一個不存在的目錄(目錄的名稱就是 payload)的方法進行 payload 的寫入


3. 最後寫入 payload 的時候發現也過濾了引號導致不能寫入 $POST[『w』] ,根據 PHP 的特性,去掉引號依然可以獲取 w 下標的內容,所以替換為 $POST[w]


4. 寫入最終構造好的 payload,Getshell 完成!


*本文原創作者:三隻小瀦,本文屬FreeBuf原創獎勵計劃,未經許可禁止轉載

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 FreeBuf 的精彩文章:

FBI逮捕一名中國黑客:稱其販賣惡意軟體,入侵美國人事管理辦公室
沒有準考證號我是如何暴力查詢英語六級成績的
360加固保關鍵技術淺析
特別企劃 | Adobe Flash「眾望所歸」地死了

TAG:FreeBuf |

您可能感興趣

Isaiah Thomas 作客最新一期《Sneaker Shopping》分享購買 Air Jordan 假鞋經驗
JMeter測試WebSocket的經驗總結
Netflix採用GraphQL的經驗分享
嵌入式未來一段時間還是Linux天下,一位嵌入式er初探Linux kernel經驗
積累經驗! 判斷你的iPad支持哪種Apple Pencil
JamesYalin的攝影經驗分享
分享一點 Google Maps 開發經驗
經驗分享:我的Deeplearning.ai課程學習之旅!
如何在 15 個月內佔領 Kaggle 榜首?bestfitting 經驗大放送
Immerse分享Rift應用移植到Quest平台的開發經驗
TensorFlow入門必看:Google AI實習生經驗談
經驗:解決Inno Setup 和一些應用程序在Windows 中不能訪問UNC路徑的問題
GemFire與Greenplum的最佳集成實踐之實施經驗談
ES6——Promise使用經驗
SQLAlchemy 使用經驗
總結了50個經驗帖,教你如何優雅的去Hermes店裡買到一隻Birkin
LOL:RNG慘遭玲瓏塔 Rookie:Uzi只是有經驗的Jacklove
Virgil Abloh接手LV,靠的難道只是人脈和經驗?
ZooKeeper運維部署的一些經驗
賣家必知的5點Promotions經驗,促銷不要「走彎路」!