隨著互聯(lián)網(wǎng)的普及,網(wǎng)絡(luò)安全變得越來越重要。程序員需要掌握基本的web安全知識,防患于未然,下面列舉一些常見的安全漏洞,以及對應(yīng)的防御解決方案。
SQL注入是比較常見的網(wǎng)絡(luò)攻擊方式之一,主要是通過把SQL命令插入到Web表單遞交或輸入域名或頁面請求的查詢字符串,實現(xiàn)無帳號登錄,甚至篡改數(shù)據(jù)庫。
數(shù)據(jù)庫信息泄漏:數(shù)據(jù)庫中存放的用戶的隱私信息的泄露。
網(wǎng)頁篡改:通過操作數(shù)據(jù)庫對特定網(wǎng)頁進行篡改。
數(shù)據(jù)庫被惡意操作:數(shù)據(jù)庫服務(wù)器被攻擊
服務(wù)器被遠程控制,被安裝后門
刪除和修改數(shù)據(jù)庫信息
1)布爾型盲注
在互聯(lián)網(wǎng)剛剛興起的時候,該方法常常會被用來惡意登錄一些安全性不高的網(wǎng)站:
SELECT * FROM users WHERE user_name ='zhangsan' and password ='mima';
如果用戶在密碼框里填入 'or1=1or1=',那么上面的SQL 就變成了
SELECT * FROM users WHERE user_name ='zhangsan' and password ='' or 1 =1 or 1='' ;
這樣就可以繞過密碼校驗,登錄為任意用戶了
2)報錯型注入
一個常見的語句為 :
SELECT * FROM users WHERE id=1 AND user_name ='zhangsan'
通過修改 zhangsan 這個 入?yún)?,很容易將SQL拼接為
SELECT * FROM users WHERE id=1 AND user_name= 'zhangsan' AND (SELECT 1 FROM (SELECT COUNT(*),CONCAT(USER(),FLOOR(RAND(0)*2))X FROM information_schema.tables GROUP BY X)a) AND 1='1';
這個語句會報一個固定的錯誤
顯然,你用來登錄Mysql的用戶名就暴漏了
3)union注入
這種比較好理解,就是在原來的select 語句上通過union的方式,增加新的信息,將SQL拼接為
SELECT * FROM users WHERE id=1 AND user_name ='zhangsan' union select * from other_table
這種方式可以查詢到你的任意表的信息,嚴重的話可能會被脫庫。
4)SQL堆疊查詢
這種跟 union 類似,可以將SQL拼接為
SELECT * FROM users WHERE id=1 AND user_name ='zhangsan' ; select * from other_table
更為嚴重的是,分號后面的語句時可以隨意寫的,如果時拼上 drop 或者 delete 之類的語句 就可以會造成刪庫的風險了。
SQL注入的攻擊最常見,影響也最大,SQL注入的本質(zhì)是將 用戶本來應(yīng)該傳入的 “數(shù)據(jù)” 變成了 程序 會執(zhí)行的“代碼”,從根源上解決這個問題,就是不要讓 數(shù)據(jù)變成代碼,最好的方式就是預(yù)編譯了。
通常情況下,SQL注入的位置包括:
(1)表單提交,主要是POST請求,也包括GET請求;
(2)URL參數(shù)提交,主要為GET請求參數(shù);
(3)Cookie參數(shù)提交;
(4)HTTP請求頭部的一些可修改的值,比如Referer、User_Agent等;
SQL注入時web開發(fā)中最常見也是危害性最大的安全漏洞,SQL注入攻擊可能會導(dǎo)致 服務(wù)器故障,數(shù)據(jù)泄漏,數(shù)據(jù)被惡意刪除等等嚴重后果。
CSRF跨站點請求偽造(Cross—Site Request Forgery),跟XSS攻擊一樣,存在巨大的危害性,攻擊者盜用了你的身份,以你的身份來調(diào)用后臺接口,對服務(wù)器來說這個請求是完全合法的,但是實際上,這個接口的調(diào)用,你卻并不知情。
簡單模擬一下整個過程如下:
1. 張三打開瀏覽器,訪問受信任網(wǎng)站A,輸入用戶名和密碼請求登錄網(wǎng)站A;網(wǎng)站A 有一個接口為
http://www.a.com/deletedata?id=100 ,那么正常情況下,因為張三已經(jīng)登錄了網(wǎng)站A,那么他是可以直接訪問這個接口的。
2. 張三在同一瀏覽器中,打開一個TAB頁訪問網(wǎng)站B;網(wǎng)站B 上有這么一段代碼 查看 ,這樣的話 如果張三在B網(wǎng)站上點擊了 查看 這個 按鈕,那么實際上 ,他就刪除了 在 A網(wǎng)站上的 數(shù)據(jù)了。
當然例子里是個 deletedata ,而實際上這個接口的含義也可能是查詢了某個數(shù)據(jù),甚至時轉(zhuǎn)了一筆錢等等,那么影響就非常大了。
要防治CSRF 漏洞,一般有兩種方法:
1.驗證 HTTP Referer 字段
HTTP Referer是header的一部分,當瀏覽器向web服務(wù)器發(fā)送請求的時候,一般會帶上Referer,告訴服務(wù)器該網(wǎng)頁是從哪個頁面鏈接過來的,服務(wù)器因此可以獲得一些信息用于處理,以上示例中,如果A網(wǎng)站做了這個校驗,那么他就可以識別出 deletedata 這個請求時來自于 B網(wǎng)站而不是A網(wǎng)站自身,就可以拒絕掉這個請求了。
這種方式最常見也最簡單,但是卻并不是最安全的,畢竟Referer是依賴瀏覽器的,每個瀏覽器對 Referer的實現(xiàn)可能不一樣,對于部分瀏覽器,Referer 甚至是可以篡改的 。另外,由于網(wǎng)站會記錄 Referer信息 ,在用戶對隱私的問題越來越敏感的今天,可能會帶來隱私風險問題。
2.在請求中增加 token 并驗證;
CSRF攻擊之所以能夠成功,是因為攻擊者可以偽造用戶的請求,是因為黑客利用已知信息以及cookie中的未知信息 來發(fā)起了攻擊,那么,如果我們添加一個不能偽造的并且不在cookie中的未知信息,那么攻擊就無法產(chǎn)生了。因此,我們可以在HTTP請求中以參數(shù)的形式加入一個隨機產(chǎn)生的token,并在服務(wù)端進行token校驗,如果沒有token或者token的值不正確,我們就認為這是一個非法的請求,拒絕掉他就可以了。
SSRF是一種由攻擊者構(gòu)造形成由服務(wù)端發(fā)起請求的一個安全漏洞。一般情況下,SSRF攻擊的目標是從外網(wǎng)無法訪問的內(nèi)部系統(tǒng)。因為請求本身是由服務(wù)端發(fā)起的,因此可以通過這個請求調(diào)用到服務(wù)端的一些內(nèi)部接口,探測內(nèi)網(wǎng)的信息,攻擊內(nèi)網(wǎng)的服務(wù)等等。
可能會產(chǎn)生SSRF 漏洞的地方主要有:
1.能夠?qū)ν獍l(fā)起網(wǎng)絡(luò)請求的地方
2.請求遠程服務(wù)器資源的地方
3.一些郵件系統(tǒng),文件上傳,文件處理系統(tǒng),在線處理工具等等
舉一個簡單的示例:
假如 A網(wǎng)站有一個功能,就是用來下載一些第三方的數(shù)據(jù)的,URL 為 http://a.com/downloadurl="http://b.com/b.jpg",
執(zhí)行邏輯上其實就是簡單的 wget -Ob.jpg http://b.com/b.jpg 這樣的。明面上,這個功能很簡單,就是將一些網(wǎng)站 ,比如 b.com 上的 圖片給下載下來保存??雌饋頉]啥問題
但是,如果這里的參數(shù)被人利用 改成了 http://a.com/downloadurl="
http://127.0.0.1/deletedata?id=1" ,那么當你執(zhí)行 weget -Ob.jpg 的時候,就等于是執(zhí)行了內(nèi)部接口 deletedata了,這樣就會對內(nèi)部系統(tǒng)造成攻擊。更深層次的,如果是用的其他一些協(xié)議,比如 downloadurl 為 file:///etc/passwd ,或者
dict://127.0.0.1:6379/info 之類的,就可以直接拿到服務(wù)器上的一些數(shù)據(jù)信息了。
防治SSRF漏洞的思路主要就是禁止對不安全的資源進行下載和訪問:
1.禁用不需要的協(xié)議,僅僅允許http和https請求,并禁止30x跳轉(zhuǎn),可以防止類似于file://, gopher://, ftp:// 等引起的問題。
2.服務(wù)端的服務(wù)都需要做訪問授權(quán),避免root啟動,禁止非正常用戶訪問服務(wù)。
3.設(shè)置URL白名單,限制內(nèi)網(wǎng)IP的請求,過濾輸入信息,嚴格判斷輸入的URL是不是安全的URL
1.XSS簡介
跨站腳本(cross site script)簡稱為XSS,是一種經(jīng)常出現(xiàn)在web應(yīng)用中的計算機安全漏洞,也是web中最主流的攻擊方式。
XSS是指惡意攻擊者利用網(wǎng)站沒有對用戶提交數(shù)據(jù)進行轉(zhuǎn)義處理或者過濾不足的缺點,進而添加一些代碼,嵌入到web頁面中去,使別的用戶訪問都會執(zhí)行相應(yīng)的嵌入代碼。
2.XSS攻擊的危害
1、盜取用戶資料,比如:登錄帳號、網(wǎng)銀帳號等
2、利用用戶身份,讀取、篡改、添加、刪除企業(yè)敏感數(shù)據(jù)等
3、盜竊企業(yè)重要的具有商業(yè)價值的資料
4、非法轉(zhuǎn)賬
5、強制發(fā)送電子郵件
6、網(wǎng)站掛馬
7、控制受害者機器向其它網(wǎng)站發(fā)起攻擊
3.防止XSS解決方案
XSS的根源主要是沒完全過濾客戶端提交的數(shù)據(jù) ,所以重點是要過濾用戶提交的信息。
將重要的cookie標記為http only, 這樣的話js 中的document.cookie語句就不能獲取到cookie了.
只允許用戶輸入我們期望的數(shù)據(jù)。 例如:age用戶年齡只允許用戶輸入數(shù)字,而數(shù)字之外的字符都過濾掉。
對數(shù)據(jù)進行Html Encode 處理: 用戶將數(shù)據(jù)提交上來的時候進行HTML編碼,將相應(yīng)的符號轉(zhuǎn)換為實體名稱再進行下一步的處理。
過濾或移除特殊的Html標簽, 例如: <script>, <iframe> , < for <, > for >, " for
過濾js事件的標簽。例如 "onclick=", "onfocus" 等等。
越權(quán)漏洞也是常見的web漏洞,一般分為分為水平越權(quán)和垂直越權(quán)兩種,水平越權(quán)指的是攻擊者嘗試訪問與他擁有相同權(quán)限的用戶的資源,比如A本來是只能看A自己的用資料的,但是當他把URL 為getInfo?id=a 修改為 getInfo?id=b 后 就可以看到b的數(shù)據(jù)了。垂直越權(quán)是指普通的用戶獲取到了比他級別更高的用戶的權(quán)限,如果普通用戶獲取到了管理員的權(quán)限。
1.水平越權(quán)
水平越權(quán)里,一個最常見的示例就是攻擊者通過遍歷ID 來進行信息的竊取。比如某個頁面如下:
這個頁面在顯示列表時,就通過后臺進行過濾,只顯示了當前登錄者的任務(wù)列表
任務(wù)名
查看詳情
任務(wù)1
getInfo?id=1
任務(wù)2
getInfo?id=2
任務(wù)3
getInfo?id=3
列表里的數(shù)據(jù),攻擊者時沒法偽造的,但是這里有一個查看詳情的鏈接,如果這個 getInfo 接口本身沒有做好鑒權(quán)的話,那么攻擊者就可以通過遍歷ID 的方式來查到到了所有用戶的詳情數(shù)據(jù)了,嚴重的甚至可能會被脫庫。
2.垂直越權(quán)
垂直越權(quán)的常見例子就是菜單的展示,比如管理員可以看到所有的菜單,包括“系統(tǒng)管理” 這個菜單,而其他用戶是看不到 “系統(tǒng)管理” 這個菜單的,但是,如果某個用戶通過特殊途徑,獲取到“系統(tǒng)管理” 這個菜單的URL ,他直接通過這個URL 來進行訪問,發(fā)現(xiàn)時可以訪問,這個就是產(chǎn)生了垂直越權(quán)的漏洞了。
要避免越權(quán)漏洞,主要還是需要從邏輯上進行完善,以下有幾點建議:
1.所有的接口都要做到兩層鑒權(quán),包括接口本身的鑒權(quán)以及接口對應(yīng)的數(shù)據(jù)的鑒權(quán)
2.鑒權(quán),服務(wù)端對請求的數(shù)據(jù)和當前用戶身份做校驗
3.所有的鑒權(quán)都要在后臺做,不能依靠前端來鑒權(quán)
4.對于會暴漏給用戶的數(shù)據(jù),盡量避免通過自增ID的方式來實現(xiàn),最好有自己的生成器,讓黑客沒法通過遍歷的方式來獲取數(shù)據(jù)
5.對于特別敏感的操作,可以進行二次權(quán)限校驗
網(wǎng)絡(luò)漏洞掃描器對目標系統(tǒng)進行漏洞檢測時,首先探測目標系統(tǒng)的存活主機,對存活主機進行端口掃描,確定系統(tǒng)聽開放的端口,同時根據(jù)協(xié)議指紋技術(shù)識別出主機的操作系統(tǒng)類型。然后掃描器對開放的端口進行網(wǎng)絡(luò)服務(wù)類型的識別,確定其提供的網(wǎng)絡(luò)服務(wù)。
漏洞掃描器根據(jù)目標系統(tǒng)的操作系統(tǒng)平臺和提供的網(wǎng)絡(luò)服務(wù),調(diào)用漏洞資料庫中已知的各種漏洞進行逐一檢測,通過對探測響應(yīng)數(shù)據(jù)包的分析判斷是否存在漏洞。