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