本篇以我自己的網站為例來通俗易懂的講述網站的常見漏洞,如何防止網站被入侵,如何讓網站更安全。
要想足夠安全,首先得知道其中的道理。
本文例子通俗易懂,主要講述了 各種漏洞 的原理及防護,相比網上其它的web安全入門文章來說,本文更豐富,更加具有實戰性和趣味性。
本文講解目錄大緻如下,講述什麼是暴力破解、xss、csrf、挂馬等原理及對應的防護。
對手機驗證碼登入方式進行暴力破解及防護
無視驗證碼而無限新增賬號原理及防護
什麼是XSS?通過留言闆來了解XSS
什麼是CSRF?如何應對?
DDOS的原理及防護
挂馬的原理,如何防止網站被挂馬?
什麼是釣魚網站,如何避免釣魚網站
什麼是安全滲透測試
這裡提前做個部署概念講解: 用戶端,即目前的 浏覽器 軟體 。 服務端 , 如 我是.net , 那麼如果我想讓我的網站放到網際網路上讓你也能夠線上浏覽的話, 我需要對我的vs項目進行打包,然後選擇一台電腦,這台電腦最好裝着 windows server系列的系統(夠專業) 來做伺服器(也就是說伺服器 就是 一台 和你平常用的電腦系統不一樣,配置不一樣,專門用于服務的電腦),然後我再在這台 電腦上(伺服器) 裝上一個 名叫 IIS Web伺服器 的 一款軟體,然後在這個軟體上進行操作,把我的包給導入在這個軟體中。這樣,這個名叫 IIS Web伺服器的軟體就會 對包解析,然後再經過其它的相關配置,最終,你能夠從網際網路上點選浏覽到我的網站。
是以,我下文的伺服器,不要把這個名詞想的太高大上,就是一款軟體而已。
像搞JAVA的,無論是Linux還是Windows都可以當做伺服器系統,還可以有衆多web伺服器軟體可以選擇,WebSphere 伺服器、JBoss伺服器等。
而.Net因為環境封閉,是以隻能用微軟的東西,windows+IIs,唯一差別就是版本了。
我的網站環境: windows server2008 R2 + IIS7.5
接下來我要簡單的介紹下我網站的結構。
我的網站是一個輕部落格網站,叫做1996v輕部落格,使用者可以新增賬號後在我的網站上釋出部落格,也可以通過我發放的權限自由的更改頁面結構。
我的網站分為 前台展示+背景設定 兩部分組成 , 廢話不說了,上圖。

前台頁面的所有展示都是由背景控制的,接下來我們先從 登入頁面 開始 , 看看 有什麼漏洞。
下圖就是登入頁面,乍一看,這個頁面挺幹淨的,就一個登入按鈕的單擊事件,和正常的網站的登入一樣,漏洞,入侵,從哪去挖掘,又談何說起呢?
别急,我們按F12打開開發者控制台(我的浏覽器是谷歌浏覽器)。
因為我不确定目前看我 文章的都是什麼群體,是以我會盡可能的寫的夠詳細,不要嫌我啰嗦,我現在要簡單介紹下F12 開發者控制台是什麼。
如圖,當你按下F12後,右側會彈出個框,這個就是開發者控制台。上面有一列頁籤,我這裡盡對前四個做下說明。
1. Elements 檢視目前文檔的DOM資訊, 也就是可以看到目前頁面經過浏覽器渲染後最終呈現出來的html。
2. Console 控制台,可以直接在這裡面敲代碼,可以得到即時響應。
3. Source 檢視目前站點的資源檔案,在這裡面可以看到目前站點下(www.1996v.com)的目前頁面加載的所需源檔案。
4. Network 這個主要是用來檢視目前的頁面的一些網絡請求。
開發者控制台主要是給前端或者全棧開發師用的,可以擷取和分析被檢視的頁面,基本上主流浏覽器都有這個功能,通常是按F12将其打開。
現在,我們先選擇手機登入:
這是我的登入界面,可以看到,使用者可以自由選擇用手機号去登入,和用賬号密碼去登入這兩種登入方式。
先說下手機号去登入:
下面是我網站的手機登入的大緻實作邏輯,放圖:
整體流程為,當使用者輸入手機号發送驗證并填寫驗證碼點選登入按鈕的時候,我的背景,會接收到使用者填寫的 手機号 和 驗證碼 , 如果 驗證碼與營運商傳回給我的驗證碼相同的話,那麼就登入成功。
講道理,這段代碼沒毛病,邏輯沒毛病,總之,必須你輸入對了正确的手機号和對應的正确的驗證碼你才能登入,否則,你怎麼也登入不了。
但是,我還是能破解的!
首先,我經過多次測試,我知道 每次傳回的驗證碼 是由4個數字組成,其次,驗證碼過期時間為1小時,而如果成功登入,會傳回我一個狀态碼:1。
4個數字,無非就是0001~9999中間的一個!
也就是說,我隻要在1個小時内,我一條條試,頂多9999次,肯定有一次能輸入對!
而隻要輸對了,那就是一件很恐怖的事,我成功的登入了你的賬号,去尋找我想要的東西。
那麼,首先,我先從控制台中的Source來檢視網頁的源檔案,進而知道登入的接口的位址以及參數名稱,
我知道了接口位址:Server/Index/ApplayLogin.ashx,也就是 http://www.1996v.com/Server/Index/ApplayLogin.ashx
我也知道了參數名稱,txtPhoneNum,txtPhoneCode。
我可以在console控制台裡自己寫ajax來進行試驗破解。如圖:
然後回車一下,則會觸發目前console中寫入的内容,一個ajax将會執行。如果ajax傳回的是1則說明登入成功,如果不成功,那麼我就再換一個txtPhoneCode,一個一個ajax來試。
那麼這種方式,因為驗證碼為4位數字,為了保證能夠成功破解,就必須把0001~9999的每一種情況都寫出來,那麼就要寫9999個ajax,複制粘貼ajax太過于麻煩,
那麼有沒有更好的破解方式?
有!使用抓包工具,這裡将展示fiddler2.0工具。
什麼是抓包?我通俗點來說就是意思是說把 發往和接受網絡的資訊攔截下來。
就比如當你點選登入按鈕的時候,會觸發這個ajax,這個ajax最終會變成 一段 http協定 給發送到 http://www.1996v.com/這個位址下,雖然ajax是你寫的,但是你是看不到這段http協定的,而抓包工具可以捕獲到這段http協定,你可以修改這串http協定。
先學而後知,如果你不懂什麼是抓包,沒問題,你仍然看的懂我接下來的教程,你隻需要先記住個概念就行了,我有一款軟體,叫做,fiddler,這個軟體的類型是抓包軟體,它可以模拟和修改http協定,來實作不打開浏覽器也可以對伺服器進行互動的過程。
對于抓包工具及fiddler,我這裡隻是先做個概念,友善後文,如有興趣者,請自行百度:什麼是http協定、fiddler教程。
你點選頁面登入按鈕,然後就會有一個ajax請求發送的http協定,而fiddler則會捕獲這個請求,如圖,輕按兩下對應的請求,右側上方raw頁籤下則是該請求的httpRequestHeader,就是發送的http協定頭了,伺服器收到這個協定後會傳回HttpResponseHeader輸出流,在textview頁籤下可以看到。
OK,我們把完整的 httpRequestHeader給複制下來,然後點選請求構造:
txtPhoneNum=18889785648&txtPhoneCode=0001 這就是發送的參數, 填寫在Request Body裡面,代表着ajax中 data的部分,最後點選Execute按鈕 進行發送。
這樣,隻需要對Request Body中的txtPhoneCode進行修改就好了,不需要寫9999個ajax那麼麻煩。
不過,有沒有更簡單的方法?
當然有,我們還可以自己寫個程式,填寫一下參數規則,然後運作程式,程式自動幫我發送http協定,并且自動幫我換參數。
而網上,已經有現成的工具,不用您去自己寫了。
類似于這樣的功能的軟體,後面我會介紹幾款專業點的web破解軟體。
如上圖,是對office辦公文檔進行密碼破解,原理都一樣,先輸入密碼的規則,然後軟體會根據規則自動生成一個 密碼清單集合 ,比如0001~9999,那麼就會 生成 一個 List<string> 集合,這個集合裡面包含了如上規則的所有密碼,然後軟體對密碼進行一個一個嘗試,直到嘗試到正确的密碼提示您破解成功,這種模式叫做:暴力破解
而密碼清單集合,也有個專門的名詞來描述,叫做:密碼字典
好了,如上是一種破解手段,暴力破解,那麼怎麼防護呢?
就以本文案例來說,加長這個短信驗證碼的長度,本來是4位,我們可以變成6位。對IP進行限制,在該IP下出現錯誤在規定時間超過3次,則封停24小時。對手機号做限制,如果第一次輸入錯誤,則延長10秒進行登入,第二次輸入錯誤則延長1分鐘才能進行登入,依次類推。
這樣,就可以很好的防範暴力破解了。
接下來,我們看看注冊。
當我在注冊頁面填寫完賬号密碼後,到了 上傳頭像這一步了。
在任何網站當中,上傳檔案,和驗證碼,都是兩大主要破解對象,通過上傳檔案的漏洞,我甚至可以獲得伺服器的控制權,後面我會講上傳檔案破解的思路,接下來要講驗證碼這一塊。
如圖,要輸入驗證碼,這個賬号才能注冊成功。在背景當中,驗證碼大多就是用session和伺服器緩存來儲存,預設配置session依賴于iis程序,容易丢失,我這裡就是用session來儲存驗證碼的。
當進入這個頁面的時候,會調用一個驗證碼生成方法:
也就是這個接口 http://www.1996v.com/Server/verification/ValidateCode.aspx ,它會在我背景 産生一個 Session [" ValidateCode "] ,當我點選注冊的時候,我會效驗這個 Session [" ValidateCode "] 是否存在,如果存在就效驗與浏覽器傳給我的 驗證碼值是否相等,如果相等則進行 接下來的注冊代碼邏輯。
我加了驗證碼驗證這一環節,就能防止有人惡意注冊了,如果不加,那麼你通過上面的這些方法分分鐘能注冊一百個一萬個。
什麼是惡意注冊?惡意注冊有什麼用?
我這個網站你是體驗不出來惡意注冊的好處的,但是我可以這樣給你舉個例子。你現在看到的不是我的網站,而是 新浪微網誌,你通過惡意注冊100萬個賬号,然後這100萬個賬号同時關注一個賬号,那麼等于你就擁有了一個擁有百萬粉絲的 新浪微網誌 賬戶, 管它死粉活粉,這玩意可就值錢了,你随便吹個牛逼賣一下,大幾千上萬肯定是有的。
那麼,我加了驗證碼就可以防止惡意注冊了嗎?
當然不是,我上面的驗證碼就存在着2個漏洞,第一是 驗證碼 圖檔太過于簡單,可以軟體識别圖檔來進行破解, 第二是 邏輯漏洞。
先說第一個:用軟體來識别,軟體是怎麼來識别的呢?
就是通過一系列的算法,通過圖檔的背景顔色等,來對圖檔進行分解,最終得出正确率高的驗證碼。
比如周遊所有像素點,然後得出數組,對點和線進行算法分析,删除幹擾的點線,删除不規則的數組項,然後再對過濾出來的資料進行本地資料庫的一個比對,最終得出一個正确的驗證碼。而本地資料庫是從哪冒出來的,它是對前面步驟的重複N次而篩選保留下來的資料。
市面上這類軟體很多,算法越進階的軟體也就越進階, 而怎樣防止這些軟體破解驗證碼呢?那就是不走尋常路,放一些連人都無法輕易識别的驗證碼出來,或者猜個迷之類的...
好,接下來說第二種,邏輯漏洞。
講道理,我的代碼,浏覽器點選注冊按鈕,如果驗證碼錯誤,則重新調用http://www.1996v.com/Server/verification/ValidateCode.aspx接口來對驗證碼進行重新整理,如果驗證碼正确,并且注冊成功,則跳轉到新的頁面。
而服務端,則是判斷了session不為null,以防止未将對象引用到對象執行個體,又判斷了與浏覽器接收過來的code是否相等,不相等則調用驗證碼重新整理接口,那麼,還有什麼我沒有考慮到的呢?
有,當然有,那就是當我驗證碼輸入正确時,因為我背景沒有重新整理session,那麼我就可以通過抓包等形式,無限次的進行注冊!
隻有浏覽器傳過來的參數和我現在的服務端的Session[ " ValidateCode " ] 相等,才能進行注冊的邏輯。而是什麼決定了 Session[ " ValidateCode " ] 的值?是Server/verification/ValidateCode.aspx這個接口,我隻要不調用這個接口,那麼我的 Session[" ValidateCode "] 就永遠不會變,是以我隻需要輸入對一次,那麼就可以通過抓包進行無限次的注冊。
是以,代碼應該變成這樣:
隻要驗證碼輸入正确,則立即調用重新整理Session的接口。
現在,成功新增賬號,進入到目前賬号的首頁展示界面。
我們點選留言闆進入留言闆頁面。
然後,在留言框中輸入一段腳本,看看會不會執行。
結果,這段腳本根本不會執行。
在這裡,我将給大家普及下XSS注入攻擊。
什麼是Xss?
就如同我現在 向留言闆裡插入 <script>alert("小曾你好帥啊")</script> 這樣一段話,如果網站沒有對 這段話進行過濾的話 ,那麼當你浏覽這個留言闆的時候,就會執行這串腳本,彈出個窗說 小曾你好帥啊 。可能你發現可以輸入腳本對你并沒有産生安全威脅。那麼我可以輸入<script>window.open( " xxxxx.com " )</script> 這樣的 跳轉網頁之類的代碼,或者 document.cookie 擷取你的cookie等之類的代碼,這樣的威脅就很大了。
以cookie為例,為了保持登入的穩定狀态,一般會把token令牌(也就是你的賬号密碼)儲存在cookie設定個過期時間放在浏覽器進行儲存,網站效驗你登入狀态,其實最終是根據cookie來的,如果你的網站沒有對ip進行限制(一般都沒有進行限制),我可以把你的cookie複制粘貼然後發送到另一台電腦上,然後設定下cookie,和登入你賬号密碼 是沒差別的。
是以,如果網站裡有留言或者私信或者發表文章的這些功能的時候,一定要對這些特殊字元進行過濾。
像上面這段<script>alert("小曾你好帥啊")</script>最終在我資料庫中儲存的是&lt;script&gt;alert("小曾你好帥啊")&lt;/script&gt
不過,我目前的留言闆是采用json格式進行解析的,是以還需要對\符号進行轉義,否則,如果你在回複框中輸入一個 \ 符号, 則照樣會報錯。
上面這是Xss,隻要對入口處對字元串浏覽器服務端都做好過濾就可以有效的防範。
這裡插入一條例子,在2011年的BlackHat DC 2011黑客大會上,一名黑客Ryan Barnett給出了一段關于XSS的示例javascript代碼:
這段代碼,巧妙的躲過掉一些過濾函數的檢查,最終,被浏覽器解析成 alert(1)
空數組是一個非null值,是以![]的結果是false(布爾型)。在計算false + []時,由于數組對象無法與其他值相加,在加法之前會先做一個字元串的轉換,空數組的toString就是"",也就是說false+[]的結果為"false",
而在js中,~符号是 按位取反運算符, ~[] 則會被解析成-1 ,~[1] 則會變成-2 等等等等,最終就以這種巧妙的思想來變成了windows['alert(1)']。
不過這其實也是和浏覽器的解析有關,可以把它了解成一個漏洞,總之,現如今的浏覽器大多不能再實作這段代碼。
不過 這段代碼 是可以的 最終輸出 eb , 大家可以試着把 這個1給删掉 看看會輸出什麼
在我的網站上你可以發表文章,用的是ueditor,發表文章你可以自由的更改文章的html,但是我背景通過正規表達式對腳本進行了過濾,如果沒有我給你的腳本權限,你所有的腳本代碼都會自動過濾掉,有興趣的朋友可以想想思路想想辦法,看能不能找到可以xss的地方。可以加下.net/web交流群 166843154,一起讨論讨論。
接下來我們在留言框中發一條資訊:
我們會發現,當點選【釋出】按鈕的時候,實際上是以Post的方式調用了 http://www.1996v.com/Server/FootMark/AddFootMark.ashx 這個接口。
現在,我要搞破壞,我寫個頁面,然後這個頁面調用這個接口,隻要是打開了我這個頁面的人,如果他在1996v網站處于登入狀态的話,他都會進行一段留言,留言内容為:CSRF。
接下來我們建立個頁面,這個頁面就寫個ajax:
然後運作該頁面
發現 發表成功,我們在轉回留言頁面,發現同樣的是一行CSRF出現在留言闆上。
是以這裡給大家一個思想就是,浏覽器上所有的一切,你的各種按鈕,與服務端的互動無非都是一段http協定,說白了,就是一個個接口。
你調用什麼樣的接口就會發生什麼樣的事,就比如 我的網站 現在有一個 關注功能的 接口, 這個接口是 http://xxxxxxxxxxxxx.com?name=秦始皇,意思就是,隻要通路了這個接口,那麼 目前登陸者就會關注一個 名叫 秦始皇 的選手,像我的新浪微網誌賬号,什麼都沒有釋出,就莫名其妙的就有幾十個粉絲,像有些人,明明什麼都沒做,點開空間卻突然發現自己不知何時發了好多小廣告。
等等例子,以上這種方式就屬于CSRF(僞裝跨站攻擊)
是以,千萬不要亂點選連結。
當然,浏覽器 也針對這種情況 做了浏覽器上的一個安全限制,叫做:同源政策
大緻意思就是,但凡遵守 同源政策規則 的浏覽器 ,在這個浏覽器上 如果 a網站 想調用b網站 的接口 ,如果b網站的伺服器不同意的話,a網站的調用就會報錯。
是以,不遵守 同源政策 的浏覽器 , 都是 不安全的 浏覽器 ,不過現在大部分主流浏覽器 都遵守 同源政策,放心用吧。
不過,因為同源政策是針對浏覽器,是以如果你會抓包,你懂http協定,你直接在伺服器上寫一個http請求的話,同源政策就沒用了。
目前很多網站,對于一些并沒有涉及到利益或安全的接口上,大多都存在着CSRF的漏洞。
如果你搞的是商城之類的網站,那麼你就必須要重視這塊了。
比如交易的時候,我把你的支付接口進行各種包裝,然後誘導其它人使用這個接口給我彙賬...
那麼怎樣避免呢?除了要效驗Referer主要還是靠Token,後端接口必須要有完善的鑒權機制, 當你進入交易頁面的時候,根據有效時間、有效次數、目前使用者等生成一條Token令牌,然後将令牌存到header中或者直接帶過去,背景進行比對,吻合即交易,不吻合就屬于非法請求。
除非你也知道這條Token,那麼請求都将被攔截。
在這裡,我還要小小的提示下,http協定可不止get、post
還有危險的PUT、DELETE等,如果我用Delete方式進行請求,那麼請求啥,伺服器就會删啥。
我們可以用OPTIONS的請求方式來判斷,伺服器允許哪幾種請求。
我們發現,我的網站伺服器允許的請求類型有:OPTIONS(可以擷取伺服器允許的請求類型)、TRACE(用于遠端診斷伺服器)、GET、HEAD(類似于GET, 但是不傳回body資訊,用于檢查對象是否存在,比如判斷接口是否可以通路)、POST
一般伺服器會自動關閉掉危險的請求方法,上圖我所示的是IIS7.5預設的 伺服器允許請求的類型。
而不管是哪種類型,在背景伺服器上的處理模式都是統一的,伺服器因為CPU等配置的不同,在同一時間能夠請求的并發處理數是有限制的。
比如我這台雲伺服器,可以在同一時間請求50個并發量,如果你開500個線程來發送http請求同一時間通路我的伺服器,那我的伺服器會挂掉的。
對攻擊網站發動大量的正常或非正常請求、耗盡目标主機資源或網絡資源,進而使被攻擊的主機不能為合法使用者提供服務,這個就屬于 DDOS 攻擊
對于DDOS,建議買高防的DDOS伺服器就可以了。
上面的XSS,CSRF主要是動腦筋來找思路,無論技術高低,隻要你能找到漏洞那就能造成很嚴重的後果,我現在要介紹的是危害很嚴重并且普遍存在的 上傳漏洞。
我的網站的上傳,也就是上傳圖檔。我的做法是這樣的,先在浏覽器把檔案轉換為base64,然後傳到浏覽器,再效驗一下,正确就直接按上傳過來的字尾進行儲存,否則就是非法請求。
那麼,如何進行效驗呢?
通過截取擴充名來做判斷,或者通過ContentType (MIME) 判斷,但是這兩種都不安全。
ContentType我把包修改一下修改成image類型就可以繞過。
而擴充名驗證這一塊也有漏洞可尋,不過是存在于IIS6.0伺服器上的。
如果你的伺服器是IIS6.0,我現在上傳一個檔案名叫做 建立文本文檔.txt%00.jpg 的檔案, 這個檔案在伺服器上被辨識字尾是.jpg,但是儲存在本地 卻以 建立文本文檔.txt 的形式儲存,這樣,就成功的繞過了你的字尾名的判斷,這種方式叫做 %00檔案名截斷 。
如果人家上傳的是一個關機指令的腳本,那麼一旦運作成功的話就會關機。
那麼這一塊該怎麼防範呢?我們可以把檔案變成Byte[]來存儲,然後在進行讀取效驗,或者不怕麻煩的可以直接在伺服器再轉一道類型,如果報錯就是假的。這裡就不貼代碼了,請自行百度.net擷取檔案真實類型。
關于IIS6.0的上傳漏洞還有一些,如在網站目錄中如果存在名為*.asp、*.asa的目錄,那該目錄内的任何檔案都會被IIS解析為asp檔案并執行。
這種通過上傳一段腳本木馬的方式就叫做挂馬。
這其中,有一款比較厲害的軟體叫做 中國菜刀 ,俗稱“ 一句話木馬 ” ,意思是 ,你用這個軟體特殊處理一個檔案(如圖檔),然後上傳到網站當中,隻要執行了這個檔案,那麼攻擊者就會拿到網站的控制權,有興趣了解的可以百度下 中國菜刀。
好了,我們總結一下,像這種挂馬形式上傳檔案的漏洞,主要還是 伺服器上的漏洞, 也就是你現在用一款軟體,這個軟體本身有bug,而并不是你導緻的問題,是以像這類東西,盡量用新點的,别用什麼 老版本穩定 這種話來搪塞自己,無論是性能還是安全,版本更新自然有人家更新的意義。像sqlserver2008,就可以通過sql注入的形式故意輸錯進而擷取到表的字段名稱。又如 office軟體 擁有讀寫本地檔案的權利, 而剛好有個可以注入的office的漏洞,這樣人家就可以通過office來對你的本地檔案進行操作了,是以電腦上一些漏洞能更新的就更新。
比如我的網站位址是:www.1996v.com,而釣魚網站的位址是:www.I996v.com
釣魚網站的位址 和我的位址很相似, 不過我的是 1 而 它的是 英文 I,而網站的内容 也差不多和我網站的内容一樣。
通過僞裝url和網站内容用來欺騙行為的網站 就是釣魚網站了。
安全滲透測試是對網站和伺服器的全方位安全測試,通過模拟黑客攻擊的手法,切近實戰,提前檢查網站的漏洞。
接下來我将介紹一些安全滲透的軟體。
像 Burp Suite、WVS(AWVS),都是類似于Fiddler的軟體,可以抓包之類的。
DirBuster目錄滲透工具,專門用于探測Web伺服器的目錄和隐藏檔案。
Nmap網絡連接配接端軟體,網絡連接配接端掃描軟體,用來掃描網上電腦開放的網絡連接配接端。
Pangolin Sql注入工具
AppScan業界領先的web應用安全監測工具(軟體界面可以選擇中文,不過是收費的)
...還有很多,感興趣請自行百度。
嗯.....關于我這個網站,也就是當時利用業餘時間做的。我接下來準備利用業餘時間做一個非常優秀的 開源的CMS、CRM自定義模闆生成系統,我是一個非常非常上進的年輕人,一個非常非常熱愛技術的年輕人,如果你也是和我一樣,或者你也是搞web的,想用好的環境來造就自己,不妨可以加下群 .net/web交流群 166843154,一起讨論讨論。