1. 程式人生 > >注入攻擊-XSS攻擊-CSRF攻擊

注入攻擊-XSS攻擊-CSRF攻擊

1.注入攻擊

注入攻擊包括系統命令注入,SQL注入,NoSQL注入,ORM注入等

1.1攻擊原理

在編寫SQL語句時,如果直接將使用者傳入的資料作為引數使用字串拼接的方式插入到SQL查詢中,那麼攻擊者可以通過注入其他語句來執行攻擊操作,這些攻擊操作包括可以通過SQL語句做的任何事:獲取敏感資料、修改資料、刪除資料庫

1.2攻擊示例

cur = db.execute("SELECT * FROM students WHERE password='%s';" % password);

如果攻擊者傳入的password引數值為  'or 1=1 --  那麼最終的被執行的SQL語句將變成:

SELECT * FROM students WHERE password='' or 1=1 --;'

這樣students表中的所有記錄全部查詢並返回,意味著所有記錄都被攻擊者竊取了

備註:在SQL中;用來結束一行語句。--用來註釋後面的語句

1.3主要防範方法

1)使用ORM可以一定程度避免SQL注入問題

2)驗證輸入型別,比如限制URL規則中的變數為整型

3)引數化查詢,在構造SQL語句中避免拼接字串或字串格式化(使用百分號或format方法)

cur = db.execute('SELECT * FROM students WHERE password=%s',password);

4)轉義特殊字元,比如引號、分號和橫線。使用引數化查詢時,各種介面庫會為我們做轉義工作


 

2.XSS攻擊(Cross-Site Scripting,跨站指令碼,因為Cross有交叉的意思故為X,從而區分CSS)

XSS攻擊歷史悠久,最遠可以追溯到90年代,但至今仍然時危害範圍非常廣的攻擊方式。

2.1攻擊原理

XSS是注入攻擊的一種,攻擊者通過將程式碼注入被攻擊者的網站中,使用者一旦訪問網頁就會執行被如注入的惡意指令碼。XSS攻擊分為反射型XSS攻擊和儲存型XSS攻擊。

2.2攻擊示例

反射型XSS又稱非持久型XSS。例如如下程式碼:

response = '<h1>Hello, %s!</h1>' % name;

如果惡意使用者輸入一段javascript程式碼作為查詢引數name的值

http://example.com/hello?name=<script>alert('Bingo!');</script>

客戶端接收的響應將變為下面的程式碼

<h1>Hello, <script>alert('Bingo!');</script>!</h1>

原本的展示標題就有了彈窗,所以可以通過這種方式執行任意JavaScript程式碼,如:竊取使用者的cookie、重定向到釣魚網站、傳送其他請求。

儲存型XSS也被稱為持久型XSS,這種型別XSS攻擊更常見,危害更大,它和非持久型XSS類似,不過它會把攻擊程式碼儲存到資料庫中,任何訪問包含攻擊程式碼的頁面都會殃及。例如:

某個網站通過表單接收使用者的留言,如果伺服器接收資料後未經處理就儲存到資料庫中,那麼使用者可以在留言中插入任意的javascripte程式碼,例如:

<script>window.location.href="http://attacker.com";</script>

其他使用者一旦訪問到留言板頁面就會執行其中的javascript指令碼,從而重定向到攻擊者寫入的站點。

2.3防範措施

1)HTML轉義,轉義後可以確保使用者輸入的內容在瀏覽器中作為文字顯示,而不是作為程式碼解析。這裡的轉義和python中的概念相同,把變數標記的內容標記為文字,具體來說,會把變數中與HTML相關的符號轉換為安全字元,以避免變數中包含影響頁面輸出的HTML標籤和惡意程式碼。轉義後,文字中的特殊字元都會轉義成HTML實體,HTML轉義如&lt表示小於號<。

2)驗證使用者輸入


 

3.CSRF攻擊

CSRF(Cross Site Request Forgery,跨站請求偽造),又被稱為one-click attack 或者 session riding。

3.1攻擊原理

CSRF攻擊方式如下:

使用者登入了A網站,認證資訊儲存在cookie中,當用戶訪問攻擊者建立的B網站時,攻擊者通過在B站傳送一個偽造的請求提交到A網站伺服器上,讓A網站伺服器誤以為請求來自於自己的網站,於是執行相應的操作,該使用者資訊就遭到了篡改。

3.2攻擊示例

3.3防範措施

1)正確使用HTTP方法

-GET方法:屬於安全方法,不會改變資源狀態,僅用於獲取資源,因此又被稱為冪等方法,頁面中所有可以通過連結發起的請求都屬於GET請求。

-POST方法:用於建立、修改和刪除資源。在HTML中使用form標籤建立表單並設定提交方法為POST,在提交時會建立POST請求。

2)CSRF令牌校驗

當處理非GET請求時,除了在表單中加入驗證碼,一般還可以在表單隱藏欄位裡和session變數(簽名cookie)中中加入偽隨機數來防禦CSRF攻擊,這個偽隨機數稱為CSRF令牌(token)

&n