pikachu-unsafeupload

首先在文章的開始,我要推薦一個漏洞測試靶場,叫做pikachu,這是一個比較完整的web靶場,裏面包含了SQL注入,XSS,文件包含,文件上傳,任意文件下載等漏洞,比較適合在學習時測試。
因爲最近一段時間在研究代碼審計,但是直接上手CMS去審計還是比較難,所以就從pikachu進行審計,之前在北方區拉練賽時我發現他們的賽題就是直接抄的pikachu的源碼,所以在文章的結尾我會分享一下,之前市賽審計出mysql密碼的技巧。

Client Check

首先呢,根據名稱我們也能猜測出這裏過濾條件應該是客戶端過濾。在這裏插入圖片描述
但是,我們還是要看一下源碼。
在這裏插入圖片描述
這裏我們可以看到,本段代碼,在include_once $PIKA_ROOT_DIR.‘inc/uploadfunction.php’;
一段包含了uploadfunction.php文件,這裏是存放文件上傳函數的地方,我們繼續往下看,發現頁面的上傳功能是調用了upload_client()函數,我們現在去查看uploadfunction.php。
在這裏插入圖片描述
我們看到之前在clientcheck.php文件中上傳調用的函數,通過閱讀我們發現並沒有任何的過濾手段,所以現在我們去查看前端代碼。本着遇事不決,摁下F12的原則,我們可以查看到他的確是在前端進行驗證,這裏有兩個辦法,一是直接禁用頁面加載JS這樣這裏定義的JS驗證也就失效了,二是也是比較推薦的辦法,首先上傳格式爲允許上傳的格式,這裏允許上傳的格式是[jpg,png,gif],進行抓包,在抓包工具中修改後綴,達到繞過前端的效果。這裏我們來演示一下第二種做法。
在這裏插入圖片描述
我們在箭頭一的位置進行修改文件名,在箭頭二我們可以發現已經成功上傳,並且返回了上傳的地址。長話短說就等會最後一起驗證了。
在這裏插入圖片描述

MIME type

首先我們依舊是查看源碼,通過文件名大概也能猜到是MIME繞過,但是我們依舊是要常規操作進行測試一波。
在這裏插入圖片描述
通過本段代碼,我們可以知道,首先建立了一個數組,裏面存放了三種MIME類型,之後建立了一個上傳目錄,並將數組以及存放地址作爲參數調用upload_sick()函數。
在這裏插入圖片描述
我們在箭頭的位置可以看到對上傳的文件MIME類型進行驗證,如果上傳的文件的類型不是數組中存放的類型則禁止上傳。所以這裏的繞過方法同上,也是在burpsutie中進行改包。將數據包中的content-type值修改爲允許上傳的MIME類型。這裏以image/jpg爲例進行修改上傳。
在這裏插入圖片描述
這裏我們發現已經成功上傳。

getimagesize

首先通過名字,我們又可以猜測出這個頁面估計是使用了getimagesize()這個函數,這個函數是幹什麼的呢?這個函數用於獲取圖像大小及相關信息,也就是說他是可以通過獲取圖片信息知道我們上傳的是不是假圖片,所以我們前面的方法也就不好用了。
在這裏插入圖片描述
在本段代碼中,我們發現頁面創建了兩個數組,分別存儲了後綴名以及MIME類型,並且根據當天日期生成了一個文件夾,之後調用了upload()函數
在這裏插入圖片描述
我們溯源找到這個函數,在這一小段中我們可以發現,後端驗證了上傳方式並對上傳後的後綴進行了驗證,並且驗證了大小寫以及空值,也就是講我們只能上傳數組中有的後綴名並且更改大小寫無效,也不能讓後綴名爲空。在這裏插入圖片描述
在這一段中我們又發現了,代碼對MIME類型也進行了驗證,但這都是小問題,在下面我們發現了它通過了getimagesize()函數進行獲取了圖片信息,驗證了上傳圖片是否是假圖片並且限制了上傳大小不能超過50kb,並且對上傳後的文件名進行了重命名操作。
是不是看似過濾的很嚴密?那麼下面我們來繞過一下試試看。
首先我們需要修改木馬文件,在文件前面添加GIF89a從而欺騙繞過getimagesize函數,也可以通過在windows的dos界面進行圖片以及php合併操作,這裏就不講這種操作了。在這裏插入圖片描述
然後我們進行抓包上傳,因爲是白名單原則所以我們必須上傳圖片類型的後綴名以及MIME類型,然後進行上傳操作。
在這裏插入圖片描述
我們看到已經成功上傳並且路徑爲
uploads/2020/02/06/9126165e3be20d06eb4681438516.jpg

但是這是上傳後只是一個圖片,並沒有辦法可以執行想要的操作,所以這時候我們還需要使用文件包含。利用之前的頁面上傳一段具有文件包含的木馬文件。
<?php include($_GET['name']); ?>
在這裏插入圖片描述
然後通過訪問我們之前上傳的文件包含文件進行利用,構建payload爲
http://192.168.52.133/pikachu/vul/unsafeupload/uploads/include.php?name=2020/02/06/9126165e3be20d06eb4681438516.jpg
在這裏插入圖片描述
發現成功利用。這裏因爲我沒有設置編碼,所以中文在這裏都是顯示亂碼。
在uploads目錄我們發現之前上傳的文件都在這裏在這裏插入圖片描述

彩蛋

其實蒐集到數據庫密碼的方法不難,我也正是通過數據庫密碼答對了一個大題。要不然讓我手工去寫payload去注入真的有點頭疼。
在這裏的測試環境中是通過/inc/config.inc.php這個文件,裏面存放了數據庫名以及用戶名及密碼還有數據庫端口。在這裏插入圖片描述
但是具體環境不同,我之前是在一個php頁面找到的密碼,他連接數據庫是直接通過mysql_connect()進行連接,就比較呆。所以得到數據庫名後又是root用戶權限,所以自然而然就穩了,當然因爲比賽廠家的那個靶機裏面有不少題目都在裏面,我是直接滲透進入靶機了所以可以進行較多操作,像查看源代碼,但是也有一部分老哥說沒有辦法滲透進主機,這我就不知道了。據說寧波是直接摘取的這個源碼作爲題目,所以我就出了這麼一份教程。因爲我想教程總要做到詳細,讓所有人都能看懂,所以本章講解可能有些囉嗦。希望大家能多多包涵啊~

最後,祝大家萬事如意!本文章僅供學習使用!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章