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