一、環境搭建
1.環境描述
操作系統:win7
PHP集成環境:phpstudy
源碼:LFI-Labs(去GitHub上下載)
將下載好的源碼放在phpstudy的WWW目錄下。
2.解決報錯
如圖所示,它會出現以下報錯:
我找到的相關資料是:
這樣的警告,只是一個因爲PHP版本不同而產生的警告(NOTICE或者WARNING),而非錯誤(ERROR)。PHP中的變量在不聲明的情況下使用 的時候,PHP4運行正常,但是到了PHP5環境下就會出現上述的警告或者提示。
解決措施:
在index.php的最上方添加error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);
:
- 這句代碼的意思是:提示除 E_NOTICE 和 E_WARNING 之外的所有錯誤信息。
- 因爲根據它的報錯提示可知,這裏出現的是Notice和Warning,所以我們屏蔽這兩個。
- 但是這樣的話,每一關的index.php文件都需要添加這句話,有點小麻煩;據說是可以直接修改配置文件php.ini文件的,但我怕把環境整壞了,謹慎一點,還是每一關的index.php文件都手動添加吧。
這個環境問題我折騰了三個多小時,是我太菜……
因爲我首先按照之前搭Sqli-Labs、DVWA、pikachu等源碼環境的方法,想要去修改它的配置文件去連接數據庫;
但是發現它源碼的配置文件是在docker裏配置的,然後我的固化思維就是要找到在phpstudy的配置方法,但是我在網上沒有找到關於LFI-Labs的搭建教程;
加上它又在報錯,我鑽牛角尖了就一直認爲可能是因爲它本身是要搭建在docker上的才導致的報錯,然後還學習了一下如何在phpstudy中設置Apache虛擬主機;
………
反正嘗試了很多方法,最後纔想到從報錯信息入手。
但是網上只有與第一行報錯信息類似的報錯的解決方法,然後我就又傻了,想着應該是要一個一個解決報錯,但後兩行報錯又找不到相似的報錯……
直到最後的時候才靈機一動舉一反三,寫出了最後的error_reporting(E_ALL & ~E_NOTICE & ~E_WARNING);。
雖然最後有收穫,但時間成本太高了……歸根到底還是我太菜了……
二、實驗操作
1.LFI-1
這是最簡單的文件包含漏洞。我們通過查看源碼可知參數名是page:
然後我們選擇查看phpinfo.php文件,因爲包含這個文件的話,我們可以通過頁面回顯來判斷知否執行成功:
?page=../../phpinfo.php
- 這裏使用的是相對路徑,
../
是上一層目錄的意思,當我們不知道phpinfo.php文件到底在哪一層的時候,就一層一層往上查。
2.LFI-2
查看原,可知參數名是library。
查看源碼可以知道,它在我們傳進去的參數前後拼接了內容:
- 在PHP語言中,是以
.
來拼接字符串 - 預定義的 $_GET 變量用於收集來自 method=“get” 的表單中的值
根據源碼可以看出,後面多了個“.php”,所以我們的繞過方式有兩種:
1.去掉後綴
?library=../../../phpinfo
2.00截斷
?library=../../../phpinfo.php%00
使用00截斷時需要注意的幾點
- 1.定義在前一篇理論知識中已經講過了:Windows在讀文件名時,當遇到ASCII碼0時會判斷爲讀取結束,會自動停止對後面內容的讀取。在URL中的形式是%00,在十六進制中是0x00。
- 2.00截斷必須滿足兩個條件:
(1)php版本小於5.3.4。如果版本過高可以調低:
(2)php的magic_quotes_gpc爲OFF狀態
- 3.如果已經滿足以上兩個條件了依然執行不成功,有可能是瀏覽器過濾掉了%00。這時候可以用burpsuite抓包,發送到重發器裏修改包。
然而我還是不能使用00截斷的方法,實在不知道爲啥了,有知道的師傅請留言指教一下~
3.LFI-3
這種報錯一看就是設置了過濾機制:
查看源碼:
意思就是如果最後的四個字符是“.php”的話就會報錯。
我們可以在末尾添加點 .
或者斜槓點 /.
:
?file=../../phpinfo.php.
?file=../../phpinfo.php/.
需要注意的一點是,這裏沒有頁面回顯,要通過查看頁面源碼來判斷是否文件包含成功:
4.LFI-4
LFI-4其實和LFI-2一樣,去掉後綴名就行了。
?class=../../../../../phpinfo
這裏需要提一點的是源碼中的addslashes() 函數:
它的作用是返回在預定義字符之前添加反斜槓的字符串:
- 單引號(’)
- 雙引號(")
- 反斜槓(\)
- NULL
5.LFI-5
查看源碼,發現會將 ../
替換爲空:
所以我們採取雙寫繞過的方式:
?file=..././..././....//phpinfo.php
6.LFI-6
第6關是採用的post方法,所以這裏用burpsuite進行抓包改包:
不知道爲什麼會報錯……
7.LFI-7~LFI-10
這後面幾道其實和前面都一樣了,只是傳參方法是post而已。
8.LFI-11~12
這裏稍微值得提一下的就是它這裏用的參數不是fil而是stylepath:
11是post方法,12是get方法。
9.LFI-13
第13題和第5題其實是一樣的。
10.LFI-14
第14題在第10題的基礎上加入了11 12題的那個隱藏屬性的參數stylepath。
11.包含日誌文件
要通過日誌文件進行文件包含漏洞的利用,前提是需要知道日誌的存放路徑纔行。
這裏展示的是日誌的默認路徑:
因爲日誌也會記錄我們的請求,所以利用方式就是在訪問的時候輸入文件包含的PHP代碼,它會被寫入日誌文件中:
從上圖可以看到瀏覽器會對它進行編碼,所以我們在 burpsuite中進行抓包改包:
執行的時候會被禁止:
但它其實已經被寫進日誌文件了,重新訪問的時候就會出現phpinfo.php的頁面:
三、總結:
1.這上面用到的繞過方式有:
00截斷繞過
.
點、\.
斜槓點繞過
去掉後綴名繞過
雙寫繞過
2.後續操作:
我們繞過了以後,就可以包含一句話木馬文件,甚至在包含 日誌文件的時候直接寫一句話木馬,然後連接菜刀,就可以得到webshell了。