濫用include
1.漏洞原因:
include是編寫php**中最常用的函式,並且支援相對路徑。有很多php指令碼直接把某輸入變數作為include的引數,造成任意引用指令碼、絕對路徑洩露等漏洞。看以下**:
...
$includepage=$_get["includepage"];
include($includepage);
...很明顯,我們只需要提交不同的includepage變數就可以獲得想要的頁面。如果提交乙個不存在的頁面,就可以使php指令碼發生錯誤而洩露實際絕對路徑(這個問題的解決辦法在下面的文章有說明)。
2.漏洞解決:
這個漏洞的解決很簡單,就是先判斷頁面是否存在再進行include。或者更嚴格地,使用陣列對可include的檔案作出規定。看以下**:
$pagelist=array("test1.php","test2.php","test3.php"); //這裡規定可進行include的檔案
if(isset($_get["includepage"])) //判斷是否有$includepage }
if($checkfind==true)
else
}這樣就可以很好地解決問題了。
未對輸入變數進行過濾
1.漏洞原因:
這個漏洞早在asp中出現過,當時造成的注入漏洞不計其數。但由於php在當時的影響力較小,所以沒有太多的人能夠注意這點。對於php來說,這個漏洞的影響性比asp更大,因為有比較多的php指令碼使用到文字型資料庫。當然也存在sql語句的注入問題。舉個比較經典的例子,首先是資料庫的:
$id=$_get["id"];
$query="select * from my_table where id='".$id."'"; //很經典的sql注入漏洞
$result=mysql_query($query);
這裡很明顯我們可以用注入來獲得資料庫的其它內容了。這裡就不再詳細敘述,和asp注入一樣的,大家可以看看以前的黑防。然後我們看文字資料庫的問題:
$text1=$_post["text1"];
$text2=$_post["text2"];
$text3=$_post["text3"];
$fd=fopen("test.php","a");
fwrite($fd,"\r\n$text1&line;$text2&line;$text3");
fclose($fd);
文字的漏洞可以說是更加嚴重。倘若我們的提交的變數中插入一段很小的php**,就可以另這個文字資料庫test.php變成php後門。甚至插入上傳**,讓我們可以上傳乙個完善的php後門。接著提公升許可權,伺服器就是你的了。
2.漏洞解決:
這個漏洞的解決方法其實很簡單,就是嚴格對全部提交的變數進行過濾。對一些敏感的字元進行替換。我們可以借助php提供的htmlspecialchars()函式來替換html的內容。這裡給出一段例子:
//構造過濾函式
function flt_tags($text) }
$text=htmlspecialchars($text); //html替換
//這兩行把回車替換為
$text=str_replace("\r"," ",$text);
$text=str_replace("\n","",$text);
$text=str_replace("&line;","│",$text); //文字資料庫分隔符"&line;"替換為全形的"│"
$text=preg_replace("/\s/"," ",$text); //空格替換
$text=preg_replace("/\t/"," ",$text); //還是空格替換
if(get_magic_quotes_gpc()) //如果magic_quotes開啟,則進行\'的替換
return $text;
} $text1=$_post["text1"];
$text2=$_post["text2"];
$text3=$_post["text3"];
//過濾全部輸入
$text1=flt_tags($text1);
$text2=flt_tags($text2);
$text3=flt_tags($text3);
$fd=fopen("test.php","a");
fwrite($fd,"\r\n$text1&line;$text2&line;$text3");
fclose($fd);
經過一番替換和過濾後,你就可以安全地把資料寫入文字或資料庫了。
死鎖的產生原因和條件
1 因為系統資源不足。2 程序執行推進的順序不合適。3 資源分配不當等。如果系統資源充足,程序的資源請求都能夠得到滿足,死鎖出現的可能性就很低,否則就會因爭奪有限的資源而陷入死鎖。其次,程序執行推進順序與速度不同,也可能產生死鎖。1 互斥條件 乙個資源每次只能被乙個程序使用。2 請求與保持條件 乙個...
殭屍程序的產生原因和避免方法
殭屍程序的產生 當乙個程序建立了乙個子程序時,他們的執行時非同步的。即父程序無法預知子程序會在什麼時候結束,那麼如果父程序很繁忙來不及wait 子程序時,那麼當子程序結束時,會不會丟失子程序的結束時的狀態資訊呢?處於這種考慮unix提供了一種機制可以保證只要父程序想知道子程序結束時的資訊,它就可以得...
野指標產生的原因和避免方法
struct student stu,pstu intmain void 這是很多人都容易犯的錯誤 定義了結構體變數stu,但結構體內部的char name在定義結構體時只是為其分配了4位元組的記憶體,沒有指向乙個合法的位址,這時其指標指向的區域只是一些亂碼,有事還沒有訪問許可權。這就是我們通常所說...