Web安全測試常見測試方法及修改建議

Web安全測試常見測試方法

auto_693.jpg

1.XSS(CrossSite Script)跨站腳本攻擊

XSS(CrossSite Script)跨站腳本攻擊。它指的是惡意攻擊者往Web 頁面里插入惡意html代碼,當用戶瀏覽該頁之時,嵌入其中Web 里面的html 代碼會被執行,從而達到惡意用戶的特殊目的。

信息系統安全測試方法: 

在數據輸入界面,添加記錄輸入:,添加成功如果彈出對話框,表明此處存在一個XSS 漏洞。

或把url請求中參數改為,如果頁面彈出對話框,表明此處存在一個XSS 漏洞

修改建議:

過濾掉用戶輸入中的危險字符。對輸入數據進行客戶端和程序級的校驗(如通過正則表達式等)。

Eg:對用戶輸入的地方和變量有沒有做長度和對”<”,”>”,”;”,”’”等字符是否做過濾

2.CSRF與跨站腳本(XSS)

CSRF與跨站腳本(XSS),是指請求迫使某個登錄的瀏覽器向易受攻擊的Web應用發送一個請求,然后以受害者的名義,為入侵者的利益進行所選擇的行動。

信息系統安全測試方法:

同個瀏覽器打開兩個頁面,一個頁面權限失效后,另一個頁面是否可操作成功

使用工具發送請求,在http請求頭中不加入referer字段,檢返回消息的應答,應該重新定位到錯誤界面或者登陸界面。

修改建議:

在不同的會話中兩次發送同一請求并且收到相同的響應。這顯示沒有任何參數是動態的(會話標識僅在cookie 中發送),因此應用程序易受到此問題攻擊。因此解決的方法為

1.Cookie Hashing(所有表單都包含同一個偽隨機值):

2. 驗證碼

3.One‐Time Tokens(不同的表單包含一個不同的偽隨機值)客戶端保護措施:應用防止CSRF攻擊的工具或插件。

3.注入測試

SQL注入是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,最終達到欺騙服務器執行惡意的SQL命令。

安全測試方法:

在需要進行查詢的頁面,輸入正確查詢條件 and 1=1等簡單sql語句,查看應答結果,如與輸入正確查詢條件返回結果一致,表明應用程序對用戶輸入未進行過濾,可以初步判斷此處存在SQL注入漏洞

修改建議:

對用戶的輸入進行校驗,可以通過正則表達式,或限制長度;對以下關鍵字進行轉換等。

||alert|and|exec|execute|insert|select|delete|update|count|drop|chr|mid|master|truncate|declare|sitename|netuser|xp_cmdshell|or|+|,|like'|and|exec|execute|insert|create|drop|table|from|grant|group_concat|column_name|information_schema.columns|table_schema|union|where|select|delete|update|order|by|count|chr|mid|master|truncate|declare|or|--|+|,|like|//

不要使用動態拼裝sql,可以使用參數化的sql或者直接使用存儲過程進行數據查詢存取;

不要使用管理員權限的數據庫連接,為每個應用使用單獨的權限有限的數據庫連接;

應用的異常信息應該給出盡可能少的提示,最好使用自定義的錯誤信息對原始錯誤信息進行包裝。

auto_703.jpg

4.登錄認證測試

4.1暴力破解

暴力破解是目前最直接有效的攻擊方式,特別對于金融業務來說,很多情況下口令都為6位純數字,很容易被攻擊。本測試項在于檢查認證系統對暴力破解的防護性。

安全測試方法:

啟動抓包工具,同時打開瀏覽器輸入用戶登錄頁面,輸入用戶名、密碼以及驗證碼,進行登錄,如果在抓包中存在明文的用戶名和密碼,說明存在弱點。

修改建議:

將請求方式從HTTP方式修改為HTTPS方式或者對輸入的用戶名和密碼進行加密,在服務端對密碼進行驗證

4.2代碼注釋

開發版本的Web程序所帶有的注釋在發布版本中沒有被去掉,而導致一些敏感信息的泄漏。我們要查看客戶端能看到的頁面源代碼并發現此類安全隱患。

安全測試方法:

打開登陸頁面(或者待測試頁面),點擊瀏覽器郵件,查看源代碼,檢查源代碼注釋部分是否有敏感信息泄露,敏感信息包括以下內容:字段文字描述、內網 IP 地址、SQL 語句以及物理路徑等等。

修改建議:

請勿在HTML  注釋中遺留任何重要信息(如文件名或文件路徑)。

從生產站點注釋中除去以前(或未來)站點鏈接的跟蹤信息。

避免在HTML  注釋中放置敏感信息。

確保HTML  注釋不包括源代碼片段。

4.3 用戶名破解

為了進行暴力破解,攻擊者需要知道已存在的用戶名,再對該用戶名進行攻擊。

安全測試方法:

在登錄界面輸入不存在的用戶名和任意的口令,如果提示用戶名不存在,則說明存在漏洞;使用正確的用戶名和錯誤的口令進行登錄,如果提示口令或密碼錯誤,則說明存在漏洞。

修改建議:

服務器對所有的登陸錯誤原因進行統一的應答,不會提示準確的錯誤提示信息。

4.4驗證碼暴力破解

在缺少鎖定策略和驗證碼設計有問題的情況下,攻擊者可以通過枚舉的方式來進行暴力猜解。

安全測試方法:

在登錄頁面,輸入正確的用戶名、錯誤的口令以及正確的驗證碼,提交表單,重復10

次,如果系統沒有返回類似賬號鎖定的信息,則說明存在漏洞。

修改建議:

在用戶進行錯誤登錄次數達到系統配置后,需要對該賬號或者該IP進行臨時鎖定,到達解鎖條件后再進行解鎖。

4.5驗證碼自動化登陸

查看是否有驗證碼機制,以及驗證碼機制是否完善,避免使用自動化工具重復登錄和進行業務操作。

安全測試方法:

打開登陸頁面查看是否存在驗證碼,如果不存在說明存在漏洞。

輸入正確的用戶名和口令以及錯誤的驗證碼,如果只是提示驗證碼錯誤,則說明存在漏洞。

選擇驗證碼,點擊右鍵,驗證碼是圖片形式且在一張圖片中,如果不是,則說明存在漏洞。

觀察驗證碼圖片中背景是否存在無規律的點或線條,如果背景為純色(例如只有白色)說明存在漏洞。

修改建議:

將驗證碼生成放在在一張進行了混淆處理的圖片上。

4.6登陸口令漏洞

安全測試方法:

進入系統的口令修改界面,查看是否必須輸入舊口令,如果不需要則存在漏洞。

修改建議:

用戶修改密碼時必須提供舊密碼,且新密碼不能與舊密碼相同,密碼要有一定復雜度,參見口令規則建議。

4.7 默認賬戶名稱設置

一般系統均設有默認登錄用戶,以及超級管理員賬號,如登錄賬號過于簡單將易被破解,造成超級權限泄露。

修改建議:

上線系統清除超級管理員權限用戶,或增加超級管理員登錄名復雜度,不要設置成易猜測的admin、superadmin等名稱。

4.8 錯誤的頁面信息

404、500等錯誤或警告消息,可能會泄露敏感信息。

修改建議:

捕獲異常跳轉至統一錯誤頁面,避免對外泄漏詳細錯誤信息。

5.會話管理測試未更新

5.1會話標識測試

查看登錄成功后會話標識是否變更。如果未變更,那么攻擊者就可以通過一些手段(如構造URL)為受害著確定一個會話標識,當受害者登錄成功后,攻擊者也可以利用這個

會話標識冒充受害者訪問系統。

安全測試方法:

啟動抓包工具或瀏覽器自帶開發者模式打開登錄頁面,輸入正確的用戶名、口令以及驗證碼,進行登錄,登錄后,進行任意一項業務操作。如果登錄的SessionId和進行業務的SessionId沒有變化,則說明存在漏洞。

修改建議:

對每次請求都從上次請求獲得令牌,服務端對每次交互都進行驗證

查看是否存在瀏覽器窗口閑置超時后需重新登錄的機制

5.2會話超時測試

安全測試方法:

打開登錄界面,輸入正確的用戶名和口令,進行登錄,進行一項業務操作,將瀏覽器空閑超過30分鐘,在進行其他業務操作,如果能夠進行其他業務操作,則說明存在漏洞。

修改建議:

需要在后臺進行配置Session的超時時間。

5.3會話清除測試

用戶注銷后會話信息需要清除,否則會導致用戶在點擊注銷按鈕之后還能繼續訪問注銷之前才能訪問的頁面。

安全測試方法:

進入登錄頁面,輸入正確的用戶名和密碼,登錄成功后,進行一些業務操作,點擊注銷按鈕,在瀏覽器輸入地址,輸入上面進行業務操作的地址,如果能夠正常返回業務頁面,則說明存在漏洞。

修改建議:

在用戶注銷后,必須將用戶的Session信息以及緩存信息全部清空。

6.其他

6.1文件目錄測試

目錄列表能夠造成信息泄漏,而且對于攻擊者而言是非常容易進行的。所以在測試過程中,要注意目錄列表漏洞。

安全測試方法:

通過瀏覽器訪問web 服務器上的所有目錄,檢查是否返回目錄結構,如果顯示的是目錄結構,則可能存在安全問題;

或使用DirBuster軟件進行測試;

修改建議:

1.針對每個Directory 域都使用Allow 、Deny 等指令設置,嚴格設定WEB服務器的目錄訪問權限;

2.刪除Options 指令下的Indexes 設置項;

6.2文件上傳漏洞

文件上傳漏洞通常由于網頁代碼中的文件上傳路徑變量過濾不嚴造成的,如果文件上傳功能實現代碼沒有嚴格限制用戶上傳的文件后綴以及文件類型,攻擊者可通過 Web 訪問的目錄上傳任意文件,包括網站后門文件(webshell),進而遠程控制網站服務器。

修改建議:

嚴格限制和校驗上傳的文件類型、大小等,禁止上傳惡意代碼的文件。同時限制相關目錄的執行權限,防范webshell攻擊。

6.3http請求方法測試

有些Web服務器默認情況下開放了一些不必要的HTTP方法(如DELETE、PUT、TRACE、MOVE、COPY),這樣就增加了受攻擊面。

安全測試方法:

使用SoapUI等工具,發送除get、post以外的方法請求,如接收應答為200ok,代表啟用了不必要的方法。

修改建議:

在tomcat  web.xml中增加如下內容:

      /*
     PUT

     DELETE

     HEAD

     OPTIONS

     TRACE

    BASIC

6.4 服務器安全策略

1.服務器用戶權限

運行Web服務器的操作系統賬號權限越高,那么Web遭到攻擊產生的危害就越大。部署到生產環境運行時是不能用root等最高權限的,一切都給予以最小權限。

2.關閉無關端口

網絡上被攻陷的大多數主機,是黑客用掃描工具大范圍進行掃描而被瞄準上的。所以,為了避免被掃描到,除了必要的端口,例如 Web、FTP、SSH 等,其他的都應關閉。

如:關閉 icmp 端口,并設置規則,丟棄 icmp 包。這樣他人無法 Ping到服務器,服務器安全得到提升。

修改方法:丟棄 icmp 包可在 iptables 中, 加入一條語句:-A INPUT -p icmp -j DROP

3.更改默認端口

如:默認的 SSH 端口是 22。建議改成 10000 以上。這樣別人掃描到端口的機率也大大下降。

舉例修改方法:

# 編輯 /etc/ssh/ssh_configvi /etc/ssh/ssh_config# 在 Host * 下 ,加入新的 Port 值。

以 18439 為例(下同):Port 22 Port 18439

# 編輯 /etc/ssh/sshd_configvi /etc/ssh/sshd_config

#加入新的 Port 值Port 22Port 18439

# 保存后,重啟 SSH 服務:service sshd restart

測試新端口連接正常后,刪除 Port 22 的配置。同時從 iptables 中, 刪除22端口,添加新配置的 18439,并重啟 iptables。

4.限制IP登錄

如能以固定 IP 方式連接服務器,那么,可以設置只允許某個特定的 IP 登錄服務器。 設置如下:

# 編輯 /etc/hosts.allowvi /etc/hosts.allow# 例如只允許 123.45.67.89 登錄sshd:123.45.67.89

5.使用證書登錄 SSH

相對于使用密碼登錄來說,使用證書更為安全,具體方法可參見網絡資料。

6.5 口令規則建議

規則1:口令長度的取值范圍為:0‐  個字符;口令的最短長度和最長長度可配置;口令的最短長度建議默認為6個字符。

規則2:口令中至少需要包括一個大寫字母(A‐Z)、一個小寫字母(a‐z)、一個數字字符(0‐9);口令是否包含特殊字符要求可以配置。

規則3:口令中允許同一字符連續出現的最大次數可配置,取值范圍:0‐9,當取值為  0  時,表示無限制,建議默認為  3。

規則4:口令須設置有效期,最短有效期的取值范圍:0‐9999  分鐘,當取值為0時,表示不做限制,建議默認:5  分鐘;最長有效期的取值范圍:0‐999 天,當取值為  0  時,表示口令永久有效,建議默認:90  天。

規則5:在口令到期前,當用戶登錄時系統須進行提示,提前提示的天數可配置,取值范圍:1‐99 天,建議默認:7  天。

規則6:口令到達最長有效期后,用戶再次登錄成功但在進入系統前,系統強制更改口令,直至更改成功。

規則7:口令歷史記錄數可配置,取值范圍為:0‐;建議默認:3個。 — 

規則8:管理員/操作員/最終用戶修改自己的口令時,必須提供舊口令。

規則9:初始口令為系統提供的默認口令、或者是由管理員設定時,則在用戶/操作員使用初始口令成功登錄后,要強制用戶/操作員更改初始口令,直至更改成功。

規則10:口令不能以明文的形式在界面上顯示。

規則11:口令不能以明文的形式保存,須加密保存;口令與用戶名關聯加密,即加密前的數據不僅包括口令,還包括用戶名。

規則12:只有當用戶通過認證之后才可以修改口令。

規則13:修改口令的帳號只能從服務器端的會話信息中獲取,而不能由客戶端指定。

6.6  頁面輸入項校驗建議

對輸入參數進行處理,建議過濾出所有以下字符:

[1] |(豎線符號)
[2] & (& 符號)
[3];(分號)
[4] $(美元符號)
[5] %(百分比符號)
[6] @(at 符號)
[7] '(單引號)
[8] "(引號)
[9] '(反斜杠轉義單引號)
[10] "(反斜杠轉義引號)
[11] <>(尖括號)
[12] ()(括號)
[13] +(加號)
[14] CR(回車符,ASCII 0x0d)
[15] LF(換行,ASCII 0x0a)
[16] ,(逗號)
[17] (反斜杠)