PHP安全之Web攻擊
一、SQL注入攻擊
表單中輸入的內容直接用於驗證身份的查詢,他就會嘗試輸入某些特殊的SQL字串篡改查詢改變其原來的功能,欺騙系統授予訪問許可權。
系統環境不同,攻擊者可能造成的損害也不同,這主要由應用訪問資料庫的安全許可權決定。如果使用者的帳戶具有管理員或其他比較高階的許可權,攻擊者就可能對資料庫的表執行各種他想要做的操作,包括新增、刪除或更新資料,甚至可能直接刪除表
防範方法:
1.檢查變數資料型別和格式
2.過濾特殊符號
3.繫結變數,使用預處理語句
二、跨網站指令碼攻擊(Cross Site Scripting, XSS)
攻擊者將惡意程式碼注入到網頁上,其他使用者在載入網頁時就會執行程式碼,攻擊者可能得到包括但不限於更高的許可權(如執行一些操作)、私密網頁內容、會話和cookie等各種內容。這些惡意程式碼通常是JavaScript、HTML以及其他客戶端指令碼語言。
例如:
<?php echo "歡迎您,".$_GET['name'];
如果傳入一段指令碼<script>[code]</script>,
那麼指令碼也會執行。用這樣的URL將會執行JavaScript的alert函式彈出一個對話方塊:http://localhost/test.php?name=<script>alert(123456)</script>
常用的攻擊手段有:
盜用cookie,獲取敏感資訊;
利用iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻擊)使用者的身份執行一些管理動作,或執行一些一般的如發微博、加好友、發私信等操作;
利用可被攻擊的域受到其他域信任的特點,以受信任來源的身份請求一些平時不允許的操作,如進行不當的投票活動;
在訪問量極大的一些頁面上的XSS可以攻擊一些小型網站,實現DDoS攻擊的效果。
防範方法:使用htmlspecialchars函式將特殊字元轉換成HTML編碼,過濾輸出的變數
三、跨網站請求偽造攻擊(Cross Site Request Forgeries, CSRF)
攻擊者偽造目標使用者的HTTP請求,然後此請求傳送到有CSRF漏洞的網站,網站執行此請求後,引發跨站請求偽造攻擊。攻擊者利用隱蔽的HTTP連線,讓目標使用者在不注意的情況下單擊這個連結,由於是使用者自己點選的,而他又是合法使用者擁有合法許可權,所以目標使用者能夠在網站內執行特定的HTTP連結,從而達到攻擊者的目的。
它與XSS的攻擊方法不同,XSS利用漏洞影響站點內的使用者,攻擊目標是同一站點內的使用者者,而CSRF 通過偽裝成受害使用者傳送惡意請求來影響Web系統中受害使用者的利益。
例如:
某個購物網站購買商品時,採用
,那麼如果目標使用者不小心訪問以後,購買的數量就成了100個
防範方法:
1、檢查網頁的來源
2、檢查內建的隱藏變數
3、使用POST,不要使用GET,處理變數也不要直接使用$_REQUEST
四、Session固定攻擊(Session Fixation)
攻擊者預先設定session id,讓合法使用者使用這個session id來訪問被攻擊的應用程式,一旦使用者的會話ID被成功固定,攻擊者就可以通過此session id來冒充使用者訪問應用程式。
例如:
1.攻擊者訪問網站http:///www.bank.com,獲取他自己的session id,如:SID=123;
2.攻擊者給目標使用者傳送連結,並帶上自己的session id,如:http:///www.bank.com/?SID=123;
3.目標使用者點選了http:///www.bank.com/?SID=123,像往常一樣,輸入自己的使用者名稱、密碼登入到網站;
4.由於伺服器的session id不改變,現在攻擊者點選http:///www.bank.com/?SID=123,他就擁有了目標使用者的身份,可以為所欲為了。
防範方法:
1.定期更改session id
session_regenerate_id(TRUE);//刪除舊的session檔案,每次都會產生一個新的session id。預設false,保留舊的session
2.更改session的名稱
session的預設名稱是PHPSESSID,此變數會儲存在cookie中,如果攻擊者不抓包分析,就不能猜到這個名稱,阻擋部分攻擊
session_name("mysessionid");
3.關閉透明化session id
透明化session id指當瀏覽器中的http請求沒有使用cookie來制定session id時,sessioin id使用連結來傳遞
int_set("session.use_trans_sid", 0);
4.只從cookie檢查session id
int_set(“session.use_cookies”, 1);//表示使用cookies存放session id int_set(“session.use_only_cookies”, 1);//表示只使用cookies存放session id
5.使用URL傳遞隱藏引數
$sid = md5(uniqid(rand()), TRUE));
五、Session劫持攻擊(Session Hijacking)
攻擊者利用各種手段來獲取目標使用者的session id。一旦獲取到session id,那麼攻擊者可以利用目標使用者的身份來登入網站,獲取目標使用者的操作許可權。
攻擊者獲取目標使用者session id的方法:
1.暴力破解:嘗試各種session id,直到破解為止;
2.計算:如果session id使用非隨機的方式產生,那麼就有可能計算出來;
3.竊取:使用網路截獲,xss攻擊等方法獲得
防範方法:
1.定期更改session id
2.更改session的名稱
3.關閉透明化session id
4.設定HttpOnly。通過設定Cookie的HttpOnly為true,可以防止客戶端指令碼訪問這個Cookie,從而有效的防止XSS攻擊。
六、檔案上傳漏洞攻擊(File Upload Attack)
攻擊者利用程式缺陷繞過系統對檔案的驗證與處理策略將惡意程式碼上傳到伺服器並獲得執行伺服器端命令的能力。
常用的攻擊手段有:
上傳Web指令碼程式碼,Web容器解釋執行上傳的惡意指令碼;
上傳Flash跨域策略檔案crossdomain.xml,修改訪問許可權(其他策略檔案利用方式類似);
上傳病毒、木馬檔案,誘騙使用者和管理員下載執行;
上傳包含指令碼的圖片,某些瀏覽器的低階版本會執行該指令碼,用於釣魚和欺詐。
總的來說,利用的上傳檔案要麼具備可執行能力(惡意程式碼),要麼具備影響伺服器行為的能力(配置檔案)。
防範方法:
1.檔案上傳的目錄設定為不可執行;
2.判斷檔案型別,設定白名單。對於圖片的處理,可以使用壓縮函式或者resize函式,在處理圖片的同時破壞圖片中可能包含的HTML程式碼;
3.使用隨機數改寫檔名和檔案路徑:一個是上傳後無法訪問;再來就是像shell、.php 、.rar和crossdomain.xml這種檔案,都將因為重新命名而無法攻擊;
4.單獨設定檔案伺服器的域名:由於瀏覽器同源策略的關係,一系列客戶端攻擊將失效,比如上傳crossdomain.xml、上傳包含Javascript的XSS利用等問題將得到解決。