程夢成,葉 丹
(廣東電網有限責任公司河源供電局,廣東 河源 517000)
南方電網公司每年都會委派網絡安全專家對各地市局的電力二次系統進行滲透測試,各地市局根據等保測評結果進行相應整改。Web應用屬于電力二次系統的管理信息大區,相比生產控制大區的SCADA/EMS等系統,Web應用的安全往往容易被忽略。網絡安全管理人員應該提高對Web應用漏洞的重視程度,防患于未然。
Web漏洞主要分為客戶端和服務端兩大類[1]。
客戶端的漏洞主要有跨站腳本攻擊(Cross Site Scripting,XSS)和跨站請求偽造(Cross-Site Request Forgery,CSRF)。
1.1.1 XSS漏洞
為了與層疊樣式表(Cascading Style Sheets)的縮寫區分,將跨站腳本攻擊記為XSS。XSS是指攻擊者向Web頁面插入惡意代碼,而服務器或瀏覽器對提交的數據過濾不足,當用戶瀏覽該頁面時,嵌入其中的惡意腳本會被執行[2]。
反射型XSS是最常見的。攻擊者通常需要誘騙用戶點擊一個特定鏈接,這樣惡意代碼才會在用戶的瀏覽器上執行,所以又稱為非持久型XSS。DOM型XSS可以看作反射型XSS的一種特例。
相比反射型XSS而言,存儲型XSS的危害要大得多。存儲型XSS通過論壇或貼吧將用戶發表的內容存儲到服務器,其他用戶只要瀏覽該內容,就會在他們的瀏覽器上執行惡意代碼。
1.1.2 CSRF漏洞
CSRF可以通俗理解為利用被攻擊者的身份發送請求。CSRF攻擊的原理很簡單:某用戶登陸受信任網站A,驗證通過,網站A產生Cookie并返回給瀏覽器;該用戶在退出網站A之前,在當前瀏覽器中訪問惡意網站B;此時網站B請求訪問第三方網站A,瀏覽器會帶上網站A產生的Cookie,所以網站B對網站A的請求等同于用戶使用瀏覽器再次訪問網站A,而實際上該操作用戶是不知情的。
需要說明的是,XSS是利用用戶輸入的不嚴謹執行JS語句,而CSRF則是通過偽造受信任用戶發送請求。CSRF可以通過XSS來實現。
服務端漏洞主要分為SQL注入漏洞和文件上傳漏洞。
1.2.1 SQL注入漏洞
SQL注入是指網站未對攻擊者提交的數據嚴格過濾,這些SQL語句的執行導致數據庫敏感信息泄露[3]。
SQL注入按照頁面返回結果分為兩大類。
第一類,有回顯。攻擊者可以根據回顯內容判斷是否注入成功。步驟如下:(1)判斷是否存在注入(字符型還是數字型);(2)猜解SQL查詢語句中的字段數(order by 或union select);(3)確定顯示的字段順序;(4)獲取當前數據庫;(5)獲取數據庫中的表;(6)獲取表中的字段名;(7)下載數據。
第二類,沒有回顯,也就是盲注,通常分為bool型和延遲型。數據庫名、表名以及字段名需要比較ASCII字符進行猜解,其他步驟同上。需要注意,攻擊者通常會使用SQLMAP等自動化工具提高注入效率。
1.2.2 文件上傳漏洞
一般網站都有上傳頭像或者附件的功能,如果文件上傳驗證不嚴格,網站會被攻擊者上傳木馬,危害極大。攻擊者一般需要繞過以下幾種檢測方式:(1)javascript,用抓包工具改文件后綴;(2)MIME類型,用抓包工具修改Content-type關鍵字;(3)目錄路徑,用%00進行截斷;(4)文件擴展名,對黑名單使用大小寫或者特殊文件名繞過,對白名單使用%00和解析漏洞繞過;(5)文件內容,在文件幻數后加一句話木馬等。
可以過濾用戶輸入的字符串,驗證輸入的長度和類型是否符合要求,對特殊字符進行轉義處理;對輸出數據進行URL、HTML編碼;服務端使用CSP(Content Security Policy)策略,用來確定瀏覽器可以加載哪些資源,從而減少XSS的發生;如果瀏覽器支持HttpOnly字段,那么瀏覽器無法通過JS腳本讀取Cookie。
可以檢查HTTP請求頭Refer字段,如果來源是非站內地址,表示有可能受到了CSRF攻擊。此外,通過減少客戶端Cookie和服務端Session的有效時間,也可以降低CSRF攻擊的可能性。最有效的方法是Anti-CSRF Token。客戶每次訪問時服務端會隨機生成一次性Token,當惡意網站B訪問第三方站點A時,產生的Token和用戶直接訪問網站A的Token是不一樣的。如果客戶端的Token和服務端的Token不匹配,服務端會拒絕提供服務。
在開發階段,輸入需要嚴格驗證,要遵循安全編碼規范。例如,在JSP中用PreparedStatement代替Statement,將PHP的magic_quotes_gpc設置為打開,以防范大多數SQL注入。此外,應該加固數據庫,如單獨為應用創建有限訪問賬戶,限制用戶能夠訪問的數據庫表。
文件上傳漏洞的防御基本上對應1.2.2中提到的5種檢測方式。其中:對圖片進行二次渲染,基本上避免了文件上傳漏洞;文件擴展名檢測盡量使用白名單過濾。值得一提的是,攻擊者即使成功上傳了webshell,也需要得到webshell的路徑。所以,避免在任何地方暴露上傳文件的地址,或者用時間戳、隨機字符串等方式對文件重命名。
我國絕大部分的電力二次系統都有一定的Web漏洞隱患,需要及時加以防范。Web應用安全漏洞的本質是對用戶輸入的信任,開發者考慮的是可以做什么,而攻擊者往往考慮還可以做什么。開發者在開發設計時應該規范用戶行為,加強表單驗證,采用白名單安全策略,使數據與代碼分離,最大程度減少Web漏洞。