常見的web漏洞有哪些?
比較常見的 web 漏洞有:SQL注入、XSS跨站站點腳本、CSRF跨站請求偽造等。由于所在團隊或者公司均有嚴格隔離的內網(wǎng)環(huán)境和基礎運維團隊,對弱口令漏洞、敏感信息泄露漏洞等很少涉及。
先簡單的聊一聊 SQL 注入,這個基本上是最常見的 web 漏洞了。SQL注入攻擊(SQL Injection),簡稱注入攻擊、SQL注入,被廣泛用于非法獲取網(wǎng)站控制權,是發(fā)生在應用程序的數(shù)據(jù)庫層上的安全漏洞。在設計程序,忽略了對輸入字符串中夾帶的SQL指令的檢查,被數(shù)據(jù)庫誤認為是正常的SQL指令而運行,從而使數(shù)據(jù)庫受到攻擊,可能導致數(shù)據(jù)被竊取、更改、刪除,以及進一步導致網(wǎng)站被嵌入惡意代碼、被植入后門程序等危害。比如執(zhí)行下述 SQL 時
String sql = "select * from user where username = '" +uname "' and password = '" + pwd + "'";
# 輸入用戶名為: tom' or '1=1 , 密碼不輸入或者隨便輸入, SQL如下:
select * from user from username = 'tom' or '1=1' and password = '你輸入的密碼'
有了or 自然只要username = 'tom' 成立, 后面的也不會起作用,這個sql基本上是很常見的比較典型的 SQL 注入問題,在直接使用 JDBC進行 SQL 拼接操作時,很容易引發(fā)這種情況。通常情況下,SQL注入的位置包括:
(1)表單提交,主要是POST請求,也包括GET請求;
(2)URL參數(shù)提交,主要為GET請求參數(shù);
(3)Cookie參數(shù)提交。
將JDBC代碼中的Statement 換成 PreparedStatement ,使用預編譯機制進行 SQL 注入預防,最普遍的是選用 Mybatis 或 Hibernate 等持久化框架,避免 JDBC 的直接使用,并在 Mybatis 的 SQL 中使用 '$' 符號替換'#',使預編譯機制起作用。
接著我們聊聊XSS跨站站點腳本,跨站腳本攻擊(Cross-site scripting,通常簡稱為XSS)發(fā)生在客戶端,可被用于進行竊取隱私、釣魚欺騙、竊取密碼、傳播惡意代碼等攻擊。XSS攻擊使用到的技術主要為HTML和Javascript,也包括VBScript和ActionScript等。XSS攻擊對WEB服務器雖無直接危害,但是它借助網(wǎng)站進行傳播,使網(wǎng)站的使用用戶受到攻擊,導致網(wǎng)站用戶帳號被竊取,從而對網(wǎng)站也產(chǎn)生了較嚴重的危害。對于這個我是有親身體會的,我的應用是基于Java + Velocity 實現(xiàn)的請求轉發(fā)應用,比如通過 http 請求喚起 RN 、Android 或 IOS 原生,通過 http 請求路由定向到其他 http鏈接等功能的一個跳轉中間件應用,出現(xiàn)的問題是該頁面鏈接被請求偽造之后通過微信分享,給非法用戶的頁面造成引流的效果,而其中的漏洞是某一個參數(shù)服務端未經(jīng)過濾和轉義直接在頁面輸出,導致非法用戶的腳本執(zhí)行,從而引起該攻擊的發(fā)生,在復盤漏洞時,我的應用對 javascript 和 html 的關鍵詞做了過濾處理的,但唯一漏掉了 某個關鍵詞,從而導致該漏洞被利用,在大年初一遠程花費了近3個小時,才完成解決這一漏洞。
順便提一下,還有一種漏洞在運營維護過程中遇到過,在登錄注冊模塊,由于當時剛參加工作不久,欠缺研發(fā)經(jīng)驗,在注冊環(huán)節(jié)未使用驗證碼,導致大量的注冊機注冊,給非法用戶牟利帶來方便,在短信驗證階段,為處理非法驗證和重復發(fā)生的問題,導致一些運營商手機號,被非法用戶觸發(fā)發(fā)生短信驗證碼,給用戶造成困擾,引起用戶向運營商投訴,對公司聲譽造成一定影響。這個事情也是自己親身經(jīng)歷,面向C端用戶的研發(fā),要多考慮安全方面的問題,既要讓用戶用起來方便,又需要避免安全問題,并且一旦發(fā)現(xiàn)安全問題,要具備及時止損的措施的應對預案。
作者:夕陽雨晴,歡迎關注我的頭條號:偶爾美文,主流Java,為你講述不一樣的碼農生活。