還有伺服器和mysql教程也要加強一些安全防範。
對於linux伺服器的安全設定:
加密口令,使用“/usr/sbin/authconfig”工具開啟密碼的shadow功能,對password進行加密。
禁止訪問重要檔案,進入linux命令介面,在提示符下輸入:
#chmod 600 /etc/inetd.conf //改變檔案屬性為600
#chattr +i /etc/inetd.conf //保證檔案屬主為root
#chattr –i /etc/inetd.conf // 對該檔案的改變做限制
禁止任何使用者通過su命令改變為root使用者
在su設定檔即/etc/pam.d/目錄下的開頭添加下面兩行:
auth sufficient /lib/security/pam_rootok.so debug
auth required /lib/security/pam_whell.so group=wheel
刪除所有的特殊帳戶
#userdel lp等等 刪除使用者
#groupdel lp等等 刪除群組
禁止不使用的suid/sgid程式
#find / -type f (-perm -04000 - o –perm -02000 ) -execls –lg {} ;
代碼如下 |
複製代碼 |
$arrfiltrate=array("'",";","union","select","insert","update","delete","load_file","outfile"); |
//出錯後要跳轉的url
代碼如下 |
複製代碼 |
$strgourl=""; function funstringexist($strfiltrate,$arrfiltrate) { foreach ($arrfiltrate as $key=>$value) { if (eregi($value,$strfiltrate)) { return true; } } return false; } |
//合并$_post 、 $_get和$_cookie
代碼如下 |
複製代碼 |
if(function_exists(array_merge)) { $arrpostgetcookiesession=array_merge($http_post_vars,$http_get_vars,$http_cookie_vars); $string = implode("",$arrpostgetcookiesession); } |
//驗證
代碼如下 |
複製代碼 |
if(funstringexist($string,$arrfiltrate)) { echo "<script language="網頁特效">alert("提示,非法字元");</script>"; } else { echo "<script language="javascript">window.location="".$strgourl."";</script>"; } |
第二款防注入執行個體
代碼如下 |
複製代碼 |
php通用防注入安全的程式碼 說明: 判斷傳遞的變數中是否含有非法字元 如$_post、$_get 功能: 防注入 **************************/ //要過濾的非法字元 $arrfiltrate=array("'",";","union"); //出錯後要跳轉的url,不填則預設前一頁 $strgourl=""; //是否存在數組中的值 function funstringexist($strfiltrate,$arrfiltrate){ foreach ($arrfiltrate as $key=>$value){ if (eregi($value,$strfiltrate)){ return true; } } return false; } //合并$_post 和 $_get if(function_exists(array_merge)){ $arrpostandget=array_merge($http_post_vars,$http_get_vars); }else{ foreach($http_post_vars as $key=>$value){ $arrpostandget[]=$value; } foreach($http_get_vars as $key=>$value){ $arrpostandget[]=$value; } } //驗證開始 foreach($arrpostandget as $key=>$value){ if (funstringexist($value,$arrfiltrate)){ echo "alert(/"neeao提示,非法字元/");"; if (empty($strgourl)){ echo "history.go(-1);"; }else{ echo "window.location=/"".$strgourl."/";"; } exit; } } |
看一下關於注入細節
轉化成ascii後是char(97,108,112,104,97)
轉化成16進位是0x616c706861
(我們將在光碟片中提供16進位和ascii轉換工具)
好了直接在瀏覽器裡輸入:
代碼如下 |
複製代碼 |
http://localhost/site/admin/login.php? username=char(97,108,112,104,97)%23 |
sql語句變成:
代碼如下 |
複製代碼 |
select * from alphaaut hor where username=char(97,108,112,104,97)# and password= |
如圖21
正如我們期望的那樣,他順利執行了,我們得到我們想要的。
當然咯,我們也可以這樣構造
代碼如下 |
複製代碼 |
http://www.111cn.net/site/admin/login.php?username=0x616c706861%23 |
sql語句變成:
代碼如下 |
複製代碼 |
select * from alphaauthor where username =0x616c706861%23# and password= |
我們再一次是成功者了。很有成就感吧,
或許你會問我們是否可以把#也放在char()裡
實際上char(97,108,112,104,97)相當於 alpha
注意是alpha上加引號,表示alpha字串。
我們知道在mysql中如果執行
代碼如下 |
複製代碼 |
mysql> select * from dl_users where username=alpha; error 1054 (42s22): unknown column alpha in where clause |
看返回錯誤了。因為他會認為alpha是一個變數。所以我們得在alpha上加引號。
如下
代碼如下 |
複製代碼 |
mysql> select * from dl_users where username= alpha ; |