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