2023-11-30 分類: 網站建設
本文主要講解《如何防止pHp程序漏洞》。文章中的講解簡單明了,易學易懂。現在,請跟隨小編的思路,深入了解《如何防止pHp程序產生的漏洞》吧!
虐待
1.漏洞原因:
是寫pHp網站最常用的函數,支持相對路徑。很多pHp腳本直接使用某個輸入變量作為參數,導致腳本任意引用、絕對路徑泄露等漏洞。看下面的代碼:
...
$=$_GET[""];
($);
...
顯然,我們只需要提交不同的變量就可以得到想要的頁面。如果提交的頁面不存在,可以在 pHp 腳本中報錯,并顯示實際絕對路徑(此問題的解決方法在下一篇文章中說明)。
2.漏洞解決方案:
這個漏洞的解決方法很簡單,就是先判斷頁面是否存在再繼續。或者更嚴格地說,使用數組來指定可用文件。看下面的代碼:
復制代碼代碼如下:
$=(".php",".php",".php"); //此處指定可用文件
if(($_GET[""])) //判斷是否有$
{
$=$_GET[""];
($ 為 $)
{
if($==$) //檢查文件是否在允許列表中
{
($);
$=真;
;
}
}
if($==true){ ($);}
else{ die("無效的參考頁!");}
}
這將很好地解決問題。
Tips:還有其他函數有這個問題:()、()、()、()等,寫的時候也要注意。
輸入變量未過濾
1.漏洞原因:
這個漏洞最早出現在ASp中,當時造成的注入漏洞數不勝數。但是由于當時 pHp 的影響力比較小,所以沒有多少人能夠關注到這一點。對于 pHp 來說,這個漏洞的影響要大于 ASp,因為更多的 pHp 腳本使用了基于文本的數據庫。當然,還有SQL語句注入的問題。舉一個更經典的例子,首先是數據庫:
復制代碼代碼如下:
$id=$_GET["id"];
$=" * FROM id='".$id."'"; //很經典的SQL注入漏洞
$=($);
這里很明顯,我們可以使用注入來獲取數據庫的其他內容。這里就不細說了,和ASp注入一樣,大家可以看前面的hack。然后我們看一下文本數據庫的問題:
復制代碼代碼如下:
$=$[""];
$=$[""];
$=$[""];
$fd=("test.php","a");
($fd,"\r\n$&line;$&line;$");
($fd);
文中的漏洞可以說是比較嚴重了。如果我們在提交的變量中插入一小段 pHp 代碼,我們就可以將這個文本數據庫 test.php 變成一個 pHp 后門。甚至插入上傳代碼,這樣我們就可以上傳一個完整的pHp后門。然后提升權限,服務器就是你的了。
2.漏洞解決方案:
這個漏洞的解決方法其實很簡單,就是嚴格過濾所有提交的變量。替換一些敏感字符。我們可以使用 pHp 提供的 () 函數來替換 HTML 內容。下面是一個例子:
復制代碼代碼如下:
//構造過濾函數
($文本)
{
$=("操","操"); //詞匯過濾列表
$text=($text);
($ as $) //這里進行詞匯過濾
{
if(($text,$)==true){ die("錯誤:您提交的內容包含敏感詞,請不要提交敏感內容。");}
}
$text=($text); //HTML 替換
//將回車替換為
$text=("\r"," ",$text);
$text=("\n","",$text);
$text=("&line;","│",$text); //替換文本數據庫分隔符“&line;” 全角“│”
$text=("/\s{ 2 }/"," ",$text); //空間替換中國網管聯盟
$text=("/\t/"," ",$text); //或空格替換
if(()){ $text=($text);} //如果開啟,則替換\'
$文本;
}
$=$[""];
$=$[""];
$=$[""];
//過濾所有輸入
$=($);
$=($);
$=($);
$fd=("test.php","a");
($fd,"\r\n$&line;$&line;$");
($fd);
經過一些替換和過濾后,您可以安全地將數據寫入文本或數據庫。
管理員判斷不完整
1.漏洞原因:
我們使用pHp編寫腳本,通常涉及到管理員的權限。并且有些腳本只對管理員權限做出“是”的判斷,而往往忽略“否”的判斷。在pHp配置文件中打開的情況(4.2.0及以后的版本默認是關閉的,但是很多人為了方便打開,是極其危險的行為),會出現提交變量 假裝是管理員。我們來看一下示例代碼:
復制代碼代碼如下:
$=""; //判斷是否的變量
$=$["符號"]; //獲取用戶變量
如果($==$)
{
$=真;
}
if($){ echo "現在是管理員狀態。";}
看起來很安全,哈哈。現在我們假設 pHp 配置文件已打開。我們提交這樣一個地址“test.php?=true”,你看到結果了嗎?雖然我們沒有正確的,但我們提交的變量由于打開狀態自動注冊為真。而且,腳本缺少“否”判斷,這讓我們可以通過=true 成功獲取管理員權限。這個問題存在于大多數網站和論壇中。
2.漏洞解決方案:
解決這個問題,我們只需要在腳本中給管理員添加一個“否”判斷即可。我們仍然假設 pHp 配置文件是打開的。看一下代碼:
復制代碼代碼如下:
$=""; //判斷是否的變量
$=$["符號"]; //獲取用戶變量
如果($==$)
{
$=真;
}
別的
{
$=;
}
if($){ echo "現在是管理員狀態。";}
這樣,即使攻擊者提交的變量=true 不正確,腳本也會在以后的判斷中設置$為。這解決了部分問題。但是,因為$是一個變量,如果以后其他腳本引用出現漏洞,重新給$賦值,就會造成新的危機。因此,我們應該使用常量來存儲管理員權限的判斷。使用()語句定義一個常量來記錄管理員的權限。之后,如果重新賦值,就會報錯,達到保護的目的。看下面的代碼:
復制代碼代碼如下:
$=""; //判斷是否的變量
$=$["符號"]; //獲取用戶變量
如果($==$)
{
(,真的);
}
別的
{
(,);
}
if(){ echo "現在是管理員狀態。";}
值得注意的是,我們已經使用了語句,所以在調用常量之前不要習慣性地添加變量符號$,而是使用and!。
文本數據庫曝光
1.漏洞原因:
如前所述,由于文本數據庫具有很大的靈活性,因此不需要任何外部支持。此外,pHp 具有非常強的文件處理能力,因此在 pHp 腳本中廣泛使用文本數據庫。甚至有幾個使用文本數據庫的優秀論壇程序。但有得有失,文本數據庫的安全性低于其他數據庫。
2.漏洞解決方案:
作為普通文件,可以下載文本數據庫,就像MDb一樣。所以我們必須通過保護MDb來保護文本數據庫。將文本數據庫的后綴更改為.pHp。并加入數據庫的第一行。這樣,文本數據庫就會作為pHp文件使用,第一行就退出執行。即返回一個空頁面,從而達到保護文本數據庫的目的。
錯誤路徑泄漏
1.漏洞原因:
pHp遇到錯誤時,會給出錯誤腳本的位置、行號和原因,例如:
: 在 D:\\\test.php 第 3 行使用 test-'test'
很多人說這沒什么大不了的。但是泄露實際路徑的后果是難以想象的。對于某些入侵者來說php代碼執行漏洞,這些信息非常重要。其實現在很多服務器都有這個問題。
有的網管干脆把pHp配置文件里的設置設為Off,但我覺得這個方法太消極了。有時,我們確實需要 pHp 返回錯誤消息以進行調試。并且可能需要在發生錯誤時給用戶一個解釋,甚至導航到另一個頁面。
2.漏洞解決方案:
pHp提供了一個從4.1.0開始的自定義錯誤處理函數(),但是很少有腳本編寫者知道。在很多 pHp 論壇中,我只看到了一些處理這種情況的。使用方法如下:
([, 整數 ])
現在我們使用自定義錯誤處理來過濾掉實際路徑。
復制代碼代碼如下:
//身份判斷為管理員,true為管理員。
//自定義錯誤處理函數必須有這4個輸入變量$,$,$,$,否則無效。
($,$,$,$)
{
//如果你不是管理員,過濾實際路徑
如果(!)
{
$=((),"",$);
$=((),"",$);
}
($)
{
案件:
echo ": [ID $] $ (行: $ of $)
\n";
echo "程序已停止運行,請聯系管理員。";
//遇到關卡錯誤時退出腳本
出口;
;
案件:
echo ": [ID $] $ (行: $ of $)
\n";
;
:
//不顯示電平錯誤
;
}
}
//將錯誤處理設置為函數
("");
…
這樣就可以很好的解決安全性和調試方便性之間的矛盾。而且你也可以花一點時間思考,讓錯誤信息更美觀,以配合網站的風格。但有兩點需要注意:
(1), ,,,, 不會被這個句柄處理,也就是會以最原始的方式顯示出來。不過,這些錯誤是編譯或者pHp內核錯誤,一般情況下不會發生。
(2)使用()后,()會失效,即所有的錯誤(除了上面的錯誤)都會由自定義函數處理。
關于()的其他信息可以參考pHp官方手冊。
pOST 漏洞
1.漏洞原因:
如前所述,依賴注冊變量是一個壞習慣。在一些留言簿和論壇程序中,需要嚴格檢查獲取頁面的方法和提交的時間間隔。防止泛濫的發帖和外部提交。下面我們來看看一個留言板程序的代碼:
復制代碼代碼如下:
...
$=($);
$=($);
$=($);
$fd=("data.php","a");
($fd,"\r\n$&line;$&line;$");
($fd);
顯然,如果我們提交 URL “post.php?=&=&="。數據將正常寫入文件。該程序不檢測變量的來源和瀏覽器獲取頁面的方式。如果我們多次提交到這個頁面,它就會像洪水一樣。現在一些軟件利用這個漏洞在論壇或留言簿上發布廣告。這是一種可恥的行為(我朋友的留言簿一周就塞滿了10多頁,無奈)。
2.漏洞解決方案:
在處理和保存數據之前,首先要確定瀏覽器是如何獲取頁面的。使用 $[""] 變量來獲取瀏覽器獲取頁面的方式。檢查它是否是“pOST”。腳本中用于記錄用戶是否通過正常方式提交數據(即填寫待提交內容的頁面)。或者使用 $[""] 來檢測,但不推薦這樣做。因為有些瀏覽器沒有設置,有些防火墻也會屏蔽。另外,我們還需要檢查提交的內容,看看數據庫中是否有重復的內容。以留言板為例php代碼執行漏洞,使用確定:
在填寫瀏覽內容的頁面,我們在最前面添加:
$[""]=time(); //注冊和填寫的時間
在接收和保存消息數據的頁面上,我們在處理數據之前也使用如下處理:
復制代碼代碼如下:
if(($[""])!=”pOST”){ die(": Do not .");} //檢查頁面獲取方式是否為pOST
if(!($[""]) or (time()-$[""] <10)){ die(": Do not .");} //檢查消息并填寫時間
if(($[""]) and (time()-$[""] <120)){ die("錯誤:兩次提交的間隔不能少于2分鐘。"); } //查看消息間隔
($[""]); //注銷變量,防止進入一次填寫頁面后多次提交
$[""]=time(); //注冊發送消息的時間,防止澆水或惡意攻擊
...
數據處理和存儲
感謝您的閱讀。以上就是《如何防止pHp程序產生的漏洞》的內容。看了這篇文章,相信大家對如何防范pHp程序產生的漏洞有了更深入的了解。每個人都需要通過實踐來驗證。這就是伊素云。小編會為大家推送更多相關知識點的文章,歡迎關注!
網站標題:pHp腳本濫用1.漏洞原因及學習與理解(一)
文章地址:http://m.newbst.com/news22/297772.html
成都網站建設公司_創新互聯,為您提供標簽優化、品牌網站建設、關鍵詞優化、建站公司、企業網站制作、商城網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:631063699@qq.com。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯
猜你還喜歡下面的內容