PHP常见漏洞及解决方法

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
PHP常見漏洞及解決方法
系級:資管97 學號:A0933310 姓名:黃銘宗 指導教授:梁明章
濫用include (1)

漏洞原因 有很多PHP腳本直接把某輸入變量作為 Include的參數,造成任意引用腳本、絕對路 徑洩露等漏洞。

範例
...
$includepage=$_GET["includepage"]; include($includepage); ...
未對輸入變量進行過濾(1)


漏洞原因
範例
◦ 存在SQL注入漏洞、檔案儲存問題
◦ $id=$_GET["id"]; ◦ $query="SELECT * FROM my_table where id='".$id."'"; $result=mysql_query($query); ◦ -------------------------------------------------------◦ $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);
錯誤路徑洩露(2)
漏洞解決 ◦ display_errors設置為Off、 ◦ 利用set_error_handler()來解決 範例 ◦ //自定義的錯誤處理函數一定要有這4個輸 入變量$errno,$errstr,$errfile,$errline,否則 無效。


function my_error_handler($errno,$errstr,$errfile,$errline) { if(!admin) { $errfile=str_replace(getcwd(),"",$errfile); $errstr=str_replace(getcwd(),"",$errstr); } switch($errno) { case E_ERROR: case E_ERROR: echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) echo "ERROR: [ID $errno] $errstr (Line: $errline of $errfile) \n"; echo ""; exit; break; case E_WARNING: case E_WARNING: echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) echo "WARNING: [ID $errno] $errstr (Line: $errline of $errfile) \n"; break; default: break; } }
錯誤路徑洩露(1)

漏洞原因 ◦ PHP遇到錯誤時,就會給出出錯腳本的位置、 行數和原因,例如: Notice: Use of undefined constant test assumed 'test' in D:\interpub\bigfly\test.php on line 3 Notice: Use of undefined constant test - assumed 'test' in D:\interpub\bigfly\test.php on line 3
◦ $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);
濫用include (1)
பைடு நூலகம்
漏洞解決 範例
◦ 先判斷頁面是否存在再進行Include。
◦ $pagelist=array("test1.php","test2.php","test3.php"); ◦ if(isset($_GET["includepage"])) { $includepage=$_GET["includepage"]; foreach($pagelist as $prepage) { if($includepage==$prepage) { include($prepage); $checkfind=true; break; } } if($checkfind==true){ unset($checkfind); } else{ die(""); } }
管理員判斷不完全(1)

漏洞原因

範例
◦ 我們用PHP寫腳本,通常要涉及管理員的權限 問題。 而一些腳本對管理員權限作出“是”判斷, 而往往忽略了“否”判斷。 ◦ $cookiesign="admincookiesign"; $adminsign=$_COOKIE["sign"]; ◦ If($adminsign==$cookiesign) { $admin=true; } ◦ if($admin){ echo ""; }
◦ $text=htmlspecialchars($text); //HTML替換 ◦ $text=str_replace("\r"," ",$text); $text=str_replace("\n","",$text); $text=str_replace("&line;","│",$text); $text=preg_replace("/\s{ 2 }/"," ",$text); $text=preg_replace("/\t/"," ",$text); ◦ if(get_magic_quotes_gpc()){ $text=stripslashes($text); } return $text; }
未對輸入變量進行過濾(1)

漏洞解決 範例
◦ 嚴格對全部提交的變量進行過濾。
◦ function flt_tags($text) { $badwords=array("",""); ◦ $badwords=array("",""); $text=rtrim($text); foreach($badwords as $badword) ◦ foreach($badwords as $badword) { if(stristr($text,$badword)==true){ die(""); } }
管理員判斷不完全(1)


漏洞解決 範例
◦ 在腳本中加入對管理員的“否”判斷即可。
$cookiesign="admincookiesign"; $adminsign=$_COOKIE["sign"]; if($adminsign==$cookiesign) { define(admin,true); } else { define(admin,false); } if(admin){ echo ""; }
相关文档
最新文档