《智能合約安全入門》從環(huán)境介紹,Solidity、web3基礎(chǔ)和漏洞原理及利用方面,詳細地介紹智能合約相關(guān)漏洞知識。其中,第一部分介紹了 Remix IDE、Metamask 以及geth等環(huán)境的安裝和使用方法;第二部分介紹了solidity語言的基礎(chǔ)知識與基本語法,以及web3的使用方法;第三部分重點講解了智能合約常見漏洞的基本原理及其攻擊方式,同時還增加了 Ethernaut 通關(guān)游戲的部分內(nèi)容,以此來加深對漏洞原理的理解。
天融信科技集團(證券代碼:002212)創(chuàng)始于1995年,是國內(nèi)首家網(wǎng)絡(luò)安全企業(yè),親歷中國網(wǎng)絡(luò)安全產(chǎn)業(yè)的發(fā)展歷程,如今已從中國第一臺自主研發(fā)防火墻的締造者成長為中國領(lǐng)先的網(wǎng)絡(luò)安全、大數(shù)據(jù)與云服務(wù)提供商。天融信始終以捍衛(wèi)國家網(wǎng)絡(luò)空間安全為己任,創(chuàng)新超越,致力于成為民族安全產(chǎn)業(yè)的領(lǐng)導(dǎo)者、領(lǐng)先安全技術(shù)的創(chuàng)造者和數(shù)字時代安全的賦能者。
目 錄
第0章 初探區(qū)塊鏈與智能合約 1
關(guān)于區(qū)塊鏈 1
區(qū)塊鏈定義 1
區(qū)塊鏈技術(shù) 1
區(qū)塊鏈層級結(jié)構(gòu) 2
區(qū)塊鏈的優(yōu)點 2
關(guān)于智能合約 2
以太坊 3
第1章 環(huán)境準備 5
1.1 使用npm安裝Remix IDE 5
1.2 使用docker安裝Remix IDE 6
1.3 使用docker安裝geth 7
1.4 本章總結(jié) 8
第2章 Remix環(huán)境介紹和使用方法 9
2.1 Remix環(huán)境的使用方法1 9
部署學(xué)習(xí) 11
2.2 Remix環(huán)境的使用方法2 12
2.2.1 部署學(xué)習(xí) 13
2.2.2 構(gòu)造函數(shù) 14
2.2.3 初始化合約余額 14
2.3 Remix環(huán)境的使用方法3 15
Remix搭配MetaMask 15
2.4 本章總結(jié) 17
第3章 MetaMask的使用方法 18
3.1 安裝MetaMask 18
3.2 獲取測試幣 20
3.3 MetaMask Api的使用方法 21
3.4 本章總結(jié) 22
第4章 geth的使用方法 23
4.1 geth基礎(chǔ)命令 23
子命令的使用方法 24
4.2 console的基礎(chǔ)命令 25
4.2.1 console中web3對象的命令 25
4.2.2 console中的挖礦 26
4.3 geth啟動節(jié)點 26
4.3.1 啟動節(jié)點 26
4.3.2 測試節(jié)點 27
4.3.3 啟動參數(shù)說明 27
4.3.4 關(guān)于RPC 27
4.3.5 連接節(jié)點 28
4.3.6 新建用戶 28
4.3.7 開始挖礦 28
4.3.8 測試轉(zhuǎn)賬 29
4.4 部署智能合約1 30
4.4.1 使用容器提供例子 30
4.4.2 重新編譯 31
4.5 調(diào)用智能合約1 34
4.6 geth從頭搭建私鏈 36
4.6.1 創(chuàng)建目錄 36
4.6.2 啟動私鏈節(jié)點 38
4.7 部署智能合約2 39
4.8 調(diào)用智能合約2 40
4.9 geth的新版本 40
4.10 本章總結(jié) 41
第5章 Solidity語言基礎(chǔ) 42
5.1 創(chuàng)建合約 42
5.2 合約接口 43
5.3 變量類型 44
5.4 變量修飾 44
5.5 類型轉(zhuǎn)換 45
5.6 數(shù)學(xué)運算 45
5.7 字符串比較 46
5.8 結(jié)構(gòu)體 46
5.9 普通數(shù)組 46
5.10 函數(shù)定義及修飾 47
5.11 構(gòu)造函數(shù) 47
5.12 函數(shù)返回值 48
5.13 自毀函數(shù) 48
5.14 fallback函數(shù) 49
5.15 receive函數(shù) 50
5.16 msg全局變量和tx全局變量 50
5.16.1 msg全局變量 50
5.16.2 tx全局變量 51
5.17 創(chuàng)建事件 52
5.18 循環(huán)結(jié)構(gòu) 53
5.19 以太幣單位 53
5.20 轉(zhuǎn)賬函數(shù) 54
5.21 本章總結(jié) 55
第6章 Solidity數(shù)據(jù)存儲 56
6.1 存儲中的狀態(tài)變量存儲結(jié)構(gòu) 56
6.2 緊湊存儲 57
6.3 動態(tài)大小數(shù)據(jù)存儲 58
6.3.1 動態(tài)String 58
6.3.2 關(guān)于length*2問題 60
6.4 動態(tài)數(shù)組存儲 60
6.5 字典mapping存儲 61
6.6 本章總結(jié) 62
第7章 web3.js和web3.py 63
7.1 web3.js 63
7.2 web3.js配合MetaMask使用 64
7.2.1 異步請求方式1 65
7.2.2 異步請求方式2 65
7.2.3 異步請求方式3 66
7.3 常用函數(shù) 67
7.3.1 hash函數(shù) 67
7.3.2 與地址相關(guān) 68
7.3.3 單位轉(zhuǎn)換 68
7.3.4 字符串轉(zhuǎn)換 68
7.3.5 賬戶和余額 69
7.3.6 獲取插槽數(shù)據(jù) 69
7.3.7 獲取區(qū)塊信息 69
7.3.8 獲取交易信息 70
7.3.9 交易簽名和發(fā)送 71
7.3.10 ABI簽名和編碼 73
7.4 web3.js連接節(jié)點 74
7.5 web3.js部署合約 75
7.6 web3.js合約交互 77
7.6.1 實例化合約對象 77
7.6.2 web3.js call調(diào)用 77
7.6.3 web3.js send調(diào)用 78
7.7 web3.py 78
7.8 web3.py部署合約 79
7.9 web3.py合約交互 79
7.10 本章總結(jié) 80
第8章 利用漏洞 81
8.1 關(guān)于call函數(shù) 81
8.1.1 函數(shù)選擇器(函數(shù)簽名) 81
8.1.2 call函數(shù)無參數(shù)調(diào)用 83
8.1.3 call函數(shù)有參數(shù)調(diào)用 85
8.1.4 call函數(shù)調(diào)用其他合約 87
8.2 漏洞場景 88
8.3 代碼分析 89
8.4 漏洞復(fù)現(xiàn) 89
8.5 本章總結(jié) 91
第9章 重入漏洞 92
9.1 關(guān)于重入漏洞 92
9.2 關(guān)于fallback函數(shù) 92
9.3 攻擊場景 92
9.4 漏洞場景 93
9.5 攻擊演示 95
9.6 本章總結(jié) 98
第10章 整型溢出漏洞 99
10.1 溢出原理 99
10.2 溢出場景 100
10.2.1 加法溢出 100
10.2.2 減法溢出 101
10.3 案例分析 102
10.3.1 BEC合約代碼片段 102
10.3.2 代碼分析 102
10.4 攻擊模擬 103
10.5 本章總結(jié) 105
第11章 訪問控制漏洞 106
11.1 關(guān)于訪問控制漏洞 106
11.1.1 代碼層面的可見性 106
11.1.2 邏輯層面的權(quán)限約束 106
11.2 漏洞場景1 106
11.2.1 漏洞場景分析 107
11.2.2 漏洞場景演示 107
11.2.3 規(guī)避建議 109
11.3 漏洞場景2 109
11.3.1 漏洞場景分析 110
11.3.2 漏洞場景演示 110
11.3.3 規(guī)避建議 110
11.4 漏洞場景3 111
11.4.1 tx.origin全局變量和msg.sender全局變量 111
11.4.2 漏洞場景分析 111
11.4.3 漏洞場景演示 112
11.4.4 規(guī)避建議 114
11.5 本章總結(jié) 114
第12章 未檢查返回值 115
12.1 低級別調(diào)用函數(shù) 115
12.2 低級別調(diào)用中產(chǎn)生異常的原因 115
12.3 低級別函數(shù)與普通函數(shù)調(diào)用的區(qū)別 116
12.4 漏洞場景 116
12.4.1 關(guān)于send函數(shù) 117
12.4.2 漏洞場景分析 117
12.4.3 漏洞場景演示 117
12.5 真實案例 119
12.6 漏洞預(yù)防 120
第13章 可預(yù)測隨機值 121
13.1 隨機數(shù)生成 121
13.1.1 區(qū)塊變量作為熵源的PRNG 121
13.1.2 區(qū)塊變量測試 121
13.2 漏洞場景 123
13.2.1 漏洞場景分析 123
13.2.2 漏洞場景演示 124
13.3 漏洞修復(fù) 125
第14章 時間控制漏洞 126
14.1 關(guān)于block.timestamp 126
14.2 以太坊中時間戳的合理要求 126
14.3 漏洞場景1 127
14.3.1 漏洞場景分析 127
14.3.2 漏洞場景演示 128
14.3.3 另外攻擊姿勢 131
14.4 漏洞場景2 132
14.5 本章總結(jié) 132
第15章 搶先交易漏洞 134
15.1 關(guān)于搶先交易漏洞 134
15.2 滿足“搶先交易”的條件 134
15.3 決定交易順序的原則 134
15.3.1 手續(xù)費高低原則 134
15.3.2 先進先出原則 135
15.3.3 共識節(jié)點排序原則 135
15.4 交易池 135
15.5 攻擊流程 136
15.6 漏洞場景分析 137
15.7 漏洞場景演示 138
15.7.1 本地搭建私鏈 138
15.7.2 錯誤不期而遇 139
15.7.3 改用geth 140
15.7.4 部署合約 141
15.7.5 攻擊演示 142
15.7.6 小結(jié) 143
15.8 本章總結(jié) 145
第16章 短地址攻擊漏洞 147
16.1 關(guān)于短地址攻擊漏洞 147
16.2 漏洞場景分析 148
16.3 攻擊者地址的生成 149
16.4 漏洞場景演示 150
16.5 本章總結(jié) 152
第17章 拒絕服務(wù)漏洞 153
17.1 關(guān)于拒絕服務(wù)漏洞 153
17.2 漏洞場景1 153
17.2.1 漏洞場景演示 154
17.2.2 selfdestruct函數(shù) 155
17.3 漏洞場景2 156
17.3.1 所有者丟失 156
17.3.2 漏洞場景演示 156
17.4 漏洞場景3 158
17.5 漏洞場景4 159
17.5.1 非預(yù)期異常 159
17.5.2 攻擊payload 159
17.5.3 漏洞場景演示 160
17.6 本章總結(jié) 161
第18章 賬戶及賬戶生成 162
18.1 以太坊賬戶 162
18.2 以太坊地址 163
18.3 外部賬戶的生成 163
18.4 特定外部賬戶的生成 167
18.5 合約賬戶的生成 168
18.6 Create2 170
18.6.1 關(guān)于Create2 170
18.6.2 Create code 170
18.6.3 Factory合約 171
18.7 本章總結(jié) 175
第19章 Ethernaut 176
19.1 關(guān)于Ethernaut 176
19.2 環(huán)境準備 177
19.2.1 Hello Ethernaut 177
19.2.2 安裝MetaMask插件 177
19.2.3 測試網(wǎng)絡(luò)的選擇 177
19.2.4 控制臺的使用 178
19.3 本章總結(jié) 178
第20章 Ethernaut Level 1 179
20.1 Level 1 Fallback 179
20.2 源碼分析 180
20.2.1 fallback函數(shù) 180
20.2.2 攻擊過程 181
20.3 闖關(guān)嘗試 181
20.4 本章總結(jié) 183
第21章 Ethernaut Level 2~5 184
21.1 Level 2 Fallout 184
21.1.1 關(guān)卡源碼 184
21.1.2 源碼分析 185
21.1.3 闖關(guān)嘗試 185
21.2 Level 3 CoinFlip 186
21.2.1 關(guān)卡源碼 186
21.2.2 源碼分析 187
21.2.3 闖關(guān)嘗試 187
21.2.4 攻擊payload 187
21.2.5 問題總結(jié) 190
21.3 Level 4 Telephone 190
21.3.1 關(guān)卡源碼 190
21.3.2 源碼分析 191
21.3.3 攻擊payload 191
21.3.4 闖關(guān)嘗試 191
21.4 Level 5 Token 192
21.4.1 關(guān)卡源碼 192
21.4.2 源碼分析 193
21.4.3 闖關(guān)嘗試 193
21.5 本章總結(jié) 194
第22章 Ethernaut Level 6~9 195
22.1 Level 6 Delegation 195
22.1.1 關(guān)卡源碼 195
22.1.2 源碼分析 196
22.1.3 闖關(guān)嘗試 197
22.1.4 另謀出路 198
22.2 Level 7 Force 199
22.2.1 關(guān)卡源碼 199
22.2.2 源碼分析 199
22.2.3 攻擊payload 200
22.2.4 闖關(guān)嘗試 200
22.3 Leval 8 Vault 201
22.3.1 關(guān)卡源碼 201
22.3.2 源碼分析 202
22.3.3 闖關(guān)嘗試 202
22.4 Level 9 King 202
22.4.1 關(guān)卡源碼 203
22.4.2 源碼分析 203
22.4.3 攻擊payload 204
22.4.4 闖關(guān)嘗試 204
22.5 本章總結(jié) 205
第23章 Ethernaut Level 10~13 206
23.1 Level 10 Reentrance 206
23.1.1 關(guān)卡源碼 206
23.1.2 源碼分析 207
23.1.3 關(guān)于重入漏洞 207
23.1.4 攻擊payload 207
23.1.5 闖關(guān)嘗試 208
23.2 Level 11 Elevator 209
23.2.1 關(guān)卡源碼 209
23.2.2 源碼分析 210
23.2.3 攻擊payload 210
23.2.4 闖關(guān)嘗試 211
23.3 Level 12 Privacy 211
23.3.1 關(guān)卡源碼 211
23.3.2 源碼分析 212
23.3.3 闖關(guān)嘗試 213
23.4 Level 13 GatekeeperOne 214
23.4.1 關(guān)卡源碼 214
23.4.2 源碼分析 215
23.4.3 攻擊payload 215
23.4.4 闖關(guān)嘗試 215
23.5 本章總結(jié) 218
第24章 Ethernaut Level 14~17 219
24.1 Level 14 GatekeeperTwo 219
24.1.1 關(guān)卡源碼 219
24.1.2 源碼分析 220
24.1.3 攻擊payload 221
24.1.4 闖關(guān)嘗試 221
24.2 Level 15 NaughtCoin 222
24.2.1 關(guān)卡源碼 222
24.2.2 源碼分析 223
24.2.3 闖關(guān)嘗試 224
24.3 Level 16 Preservation 224
24.3.1 關(guān)卡源碼 224
24.3.2 源碼分析 225
24.3.3 攻擊payload 226
24.3.4 闖關(guān)嘗試 227
24.4 Level 17 Recovery 228
24.4.1 關(guān)卡源碼 228
24.4.2 源碼分析 229
24.4.3 闖關(guān)嘗試 229
24.5 本章總結(jié) 230
第25章 Ethernaut Level 18~20 231
25.1 Level 18 MagicNumber 231
25.1.1 關(guān)卡源碼 231
25.1.2 源碼分析 232
25.1.3 闖關(guān)嘗試 233
25.2 Level 19 AlienCodex 235
25.2.1 關(guān)卡源碼 235
25.2.2 源碼分析 235
25.2.3 闖關(guān)嘗試 237
25.3 Level 20 Denial 238
25.3.1 關(guān)卡源碼 238
25.3.2 源碼分析 239
25.3.3 payload 240
25.3.4 闖關(guān)嘗試 240
25.4 本章總結(jié) 242
第26章 通用payload 243