南京房產(chǎn)網(wǎng)站建設(shè)手機(jī)如何做網(wǎng)站
1.前言
關(guān)于JS在滲透測(cè)試中的關(guān)鍵作用,想必不用過(guò)多強(qiáng)調(diào),在互聯(lián)網(wǎng)上也有許多從JS中找到敏感信息從而拿下關(guān)鍵系統(tǒng)的案例。大部分師傅喜歡使用findsomething之類的瀏覽器插件,也有使用諸如Unexpected.information以及APIFinder之類的Burp插件,也有師傅喜歡使用packerfuzzer和JSFinder之類的工具。上述腳本和工具都是非常優(yōu)秀的,筆者在日常測(cè)試中也經(jīng)常將上述工具結(jié)合著使用。但是,如果只是單獨(dú)使用上面的部分腳本和工具,實(shí)際上能找到的攻擊面是比較狹隘的,并且也不能比較全面地去搜集JS中存在的,可能被我們利用的信息。
本文作為滲透測(cè)試中的JS分析中的第一篇文章,就打算來(lái)和師傅們分享一下我喜歡在JS中提取哪些信息,以及我用到的工具、腳本、規(guī)則,可能不是最全面的,但應(yīng)該是最常用和實(shí)用的,有不足之處希望師傅們指出。這個(gè)系列后續(xù)還會(huì)出一篇文章介紹怎樣從JS中提取參數(shù)輔助接口測(cè)試,出一到兩篇文章介紹提取JS的幾個(gè)場(chǎng)景,師傅們點(diǎn)點(diǎn)關(guān)注哦。
2.JS接口提取二三事
一提到JS信息的提取,最老生常談的一點(diǎn)當(dāng)然是從JS中提取接口,然后去測(cè)試各個(gè)接口的問(wèn)題。但關(guān)鍵問(wèn)題在于,我們應(yīng)該用什么樣的方法去盡可能全面地提取JS中的接口呢?很多師傅這時(shí)候就會(huì)想到,我用findsomething這樣的插件不就一把梭了嗎?非也,不如我們來(lái)看這樣一個(gè)情況,下面的案例來(lái)自小隊(duì)以往的項(xiàng)目:
看到這樣一個(gè)網(wǎng)站,其使用webpack技術(shù)打包JS
我們打開findsomething,可以看到findsomething直接被致盲了,什么接口都沒(méi)有找到
實(shí)際上,由于webpack壓縮了很多js文件,findsomething并沒(méi)有深入測(cè)試webpack的功能,因此findsomething在很多情況,只是找到了浮在海面上的一點(diǎn)點(diǎn)冰山,卻忽視了隱藏在海面下的更多的細(xì)節(jié)。
這種情況本來(lái)是打算留到JS提取的不同場(chǎng)景和師傅們分享的,由于在本文的這個(gè)場(chǎng)景也非常合適,所以提前分享出來(lái)了。言歸正傳,這種情況我們應(yīng)該怎么去提取JS中的接口呢?我們只需要用到一些針對(duì)webpack情況的工具即可。這里我用的是packerfuzzer:
Packer-Fuzzer會(huì)把所有的JS文件保存到tmp目錄中
由于packerfuzzer在自動(dòng)測(cè)試過(guò)程中可能會(huì)讓你輸入接口的“初級(jí)目錄”,在前后端分離的場(chǎng)景下需要用一些參數(shù)指定后端,因此實(shí)際上我并不喜歡用packerfuzzer自動(dòng)測(cè)試,我喜歡提取出接口和后端后自己用burp的intruder去測(cè)試。因此這里有一個(gè)腳本用于處理packerfuzzer下載回來(lái)的JS文件:
這腳本最開始也是我在Github上亂翻找到的,我對(duì)其正則做了一些優(yōu)化。這個(gè)正則其實(shí)很好理解,該腳本會(huì)匹配被單引號(hào)或者雙引號(hào)包裹起來(lái)的字符串,如果字符串被/分割,則將其提取。所以能夠很全面地提取js中的接口uri,以上文的案例為例,我們用packerfuzzer+接口腳本,直接就可以提取出大量接口,并且有部分接口只能被這個(gè)小腳本的正則匹配到:
是不是比單純使用findsomething強(qiáng)大多了?因此,我現(xiàn)在非常喜歡使用packerfuzzer充當(dāng)一個(gè)“JS下載器”,然后用這個(gè)腳本來(lái)提取接口,對(duì)于絕大部分普通情況,packerfuzzer可以完美下載JS,對(duì)于部分使用webpack的特殊情況,更是只有packerfuzzer能夠勝任。
那么這是不是說(shuō),我們提取JS接口的核心就是我們的小腳本,packerfuzzer就是純純的下載器呢?也絕對(duì)不是這樣的。還記得我們說(shuō),我們提取接口的腳本的規(guī)則是“匹配被單引號(hào)或者雙引號(hào)包裹起來(lái)的字符串,如果字符串被/分割,則將其提取”。那假如一個(gè)很奇葩的寫法,接口uri不被單引號(hào)、雙引號(hào)包裹,或者其中沒(méi)有/呢?這聽著似乎非常匪夷所思,這樣寫JS不會(huì)運(yùn)行異常?然而筆者在某次眾測(cè)中真就遇到了這樣的情況,這回?fù)Q小腳本抓瞎了,但是packerfuzzer卻能找到一些接口。還是打開tmp目錄:
其中有一個(gè).db文件,使用隨便一個(gè)數(shù)據(jù)庫(kù)管理工具打開它
在這種情況下,packerfuzzer的規(guī)則仍然可以找到很多接口,還是很有用的。
那這是不是又說(shuō)明,我們只需要小腳本+packerfuzzer結(jié)合著用,就可以應(yīng)付所有情況,findsomething和Unexpected.information這類插件直接淘汰就好呢?也不盡然,我們?cè)俜窒硪粋€(gè)案例,也來(lái)自于筆者的企業(yè)SRC挖掘案例(本來(lái)也打算留到后續(xù)的文章介紹,這里也先分享出來(lái))。
上圖的這個(gè)網(wǎng)站,直接查看其前端并沒(méi)有找到任何和app.js index.js main.js等比較經(jīng)典的和webpack相關(guān)的文件。
然而查看burp的history,卻發(fā)現(xiàn)該網(wǎng)站加載了app.js,并且unexpected information插件成功在其中匹配到了各種信息
在這種情況下,packerfuzzer可能在一定程度上失靈,但是unexpected information和findsomething卻有可能找到我們需要的信息。
總之,上面我們就大概介紹了要如何去提取接口uri。除了普通的接口,上述技巧亦可能找到一些pdf、docx之類的文檔,攻擊者可能從這些亂七八糟的文件甚至是圖片中再找到一些敏感信息,這里就不繼續(xù)展開了。
上面介紹這些情況,其實(shí)主要是和大家說(shuō)明,這些腳本和工具都很棒,但他們都不是全能的,在不同場(chǎng)景下,側(cè)重使用的腳本和工具都不同,不能單單依賴某一種。不過(guò)我實(shí)測(cè)packerfuzzer+小腳本這種用法的泛用性很高,對(duì)策性一般,鑒定為超大杯,推薦各位師傅試一試。
3.目錄FUZZ和接口提取的奇妙搭配
通過(guò)上述方法我們就一定能萬(wàn)無(wú)一失的提取所有接口了嗎?
我們假設(shè)你通過(guò)分析JS找到了很多接口,比如
http://test.hack.com/api/test/admin/delete
http://test.hack.com/api/test/admin/edit
http://test.hack.com/api/test/admin/get
這種時(shí)候我們要注意了,接口的命名一般都和功能高度相關(guān)。這里有管理員用戶的刪除(delete)、編輯(edit)、獲取(get)
那么你還能想到什么?是不是有可能能有添加(add、create)。那我們可以注意FUZZ這個(gè)點(diǎn)
http://test.hack.com/api/test/admin/add
http://test.hack.com/api/test/admin/create
總之就是有“添加”這個(gè)意思的單詞。對(duì)于增刪改查的接口關(guān)鍵詞,我自己總結(jié)了一些。
查詢(獲取信息)``search list select query get find
刪除(刪除某個(gè)數(shù)據(jù))``del Delete
編輯(更新某個(gè)信息)``Update Up edit Change
添加(增加某個(gè)信息)``add create new
我們FUZZ的思路不止于此,再設(shè)想一個(gè)場(chǎng)景。我們現(xiàn)在獲得了這樣一些接口:
http://test.hack.com/api/test/user/add
http://test.hack.com/api/test/user/update
可以看到,是對(duì)普通用戶進(jìn)行添加和更新的接口。那我們猜想,是否可能存在對(duì)管理員用戶進(jìn)行添加和更新的接口呢?我們可以嘗試FUZZ:
http://test.hack.com/api/test/FUZZ/add
當(dāng)然,實(shí)戰(zhàn)中不一定完全符合上面這個(gè)接口路徑,比如下面這個(gè)呢?
http://test.hack.com/api/test/adminDelete
http://test.hack.com/api/test/adminEdit
http://test.hack.com/api/test/adminGet
很顯然還是能看出規(guī)則。
總之就是要提醒你,多觀察接口,推測(cè)其功能,然后根據(jù)功能去FUZZ,畢竟你要實(shí)現(xiàn)一個(gè)web功能,基本都要有對(duì)應(yīng)的增刪改查接口,我們可以依據(jù)這個(gè)思想去試試。說(shuō)不定就添加用戶進(jìn)后臺(tái)了。上述思想其實(shí)也不止于測(cè)試接口,部分傳統(tǒng)的動(dòng)態(tài)腳本網(wǎng)站,其實(shí)靠上述思想也能找到很多有趣的東西。一個(gè)最簡(jiǎn)單的例子,比方說(shuō):
http://test.hack.com/admin/login.jsp
是不是可以嘗試去找找
http://test.hack.com/admin/register.jsp
當(dāng)然,上述操作在實(shí)戰(zhàn)中肯定不能手動(dòng)試,需要一個(gè)比較強(qiáng)大的字典去進(jìn)行FUZZ,這里推薦FFUF這款工具,非???#xff0c;非常自由,而且可以FUZZ uri甚至整個(gè)數(shù)據(jù)包中的任何位置。
不過(guò),目錄FUZZ和接口提取、測(cè)試的緣分遠(yuǎn)不止于此,在某些情況下,我們是否可以通過(guò)FUZZ JS文件,找到后端的一些文件打開突破口呢?還是以某個(gè)企業(yè)SRC的案例為例:
這就是另一個(gè)故事了,后續(xù)我們?cè)谔崛S的不同場(chǎng)景中會(huì)進(jìn)一步介紹這些東西。
4.后端啊,你在哪里?
上面我們就分享了從JS中提取接口uri的一些方法,幾個(gè)現(xiàn)成的工具組合著用就行。但是,提取出這些接口uri之后,我們要怎么提取后端地址,又要怎么拼接測(cè)試呢?這其中又有很多值得說(shuō)到的點(diǎn)。首先我們來(lái)介紹第一種和JS無(wú)關(guān)的方法。我將其稱之為“現(xiàn)有功能分析法”,聽著很高大上,其實(shí)很EZ,簡(jiǎn)單來(lái)說(shuō)你一個(gè)網(wǎng)站,頁(yè)面上肯定有很多功能,以登錄場(chǎng)景為例,肯定是有一個(gè)登錄的功能嘛。那我們可以抓取登錄的數(shù)據(jù)包,觀察其接口的uri規(guī)則,而且在你訪問(wèn)某個(gè)網(wǎng)站的時(shí)候,很多時(shí)候會(huì)先訪問(wèn)一些接口來(lái)完成初始化,或者獲取你的某些狀態(tài),在沒(méi)有登錄點(diǎn)的情況下,通過(guò)這些接口也是可以的。
比方說(shuō)我們調(diào)用http://test.com/#/login的登錄點(diǎn)
上圖就是一個(gè)登錄點(diǎn)的uri。這里我們引入一個(gè)“初級(jí)目錄”的概念,打引號(hào)是因?yàn)榻^大多數(shù)情況下這并不是真正的目錄。
什么意思呢?我們以Spring開發(fā)為例,對(duì)SpringSSM比較熟悉的小伙伴應(yīng)該知道,我們可以在配置文件里添加一個(gè)配置項(xiàng):
server.servlet.context-path
比方說(shuō)
server.servlet.context-path=/vsk
這樣,你的web應(yīng)用的所有uri前面都要加一層/test1,比方說(shuō)我給登錄的動(dòng)作配置一個(gè)RequestMapping,為@RequestMapping(“/virsical-auth/oauth/token”);
那么如果我想通過(guò)WEB訪問(wèn)這個(gè)動(dòng)作,應(yīng)該訪問(wèn)的uri應(yīng)該是:
/vsk/virsical-auth/oauth/token
(當(dāng)然這里是簡(jiǎn)化過(guò)的,實(shí)際上真正的構(gòu)成規(guī)則我猜測(cè)是設(shè)置初始路徑為/vsk,然后負(fù)責(zé)登錄相關(guān)功能的controller設(shè)置為/virsical-auth,然后給Controller里的具體方法設(shè)置為/oauth/token)
通過(guò)上面這個(gè)例子你想到了什么?沒(méi)錯(cuò),我們上面抓到的那個(gè)數(shù)據(jù)包,有可能是以/vsk作為初始路徑。然后我們通過(guò)前文的提取接口相關(guān)的技術(shù)找到的接口uri可能是/virsical-auth/oauth/token,這樣我們就知道怎么拼接了,就可以得到/vsk/virsical-auth/oauth/token。
當(dāng)然實(shí)戰(zhàn)中絕大部分都是黑盒的情況,你通過(guò)現(xiàn)有功能看到這么一個(gè)uri,其實(shí)也不一定能百分百判斷到底哪個(gè)是初級(jí)uri,比方說(shuō)上述情況。有可能是/vsk作為初級(jí)uri,亦可能是/vsk/virsical-auth/作為初級(jí)uri,這個(gè)需要靠經(jīng)驗(yàn)來(lái)判斷。如果你怕判斷有誤,最好的辦法就是多拼接幾次,比如:
http://test.com/vsk/ <—接口依次拼接在這后面
http://test.com/vsk/virsical-auth/ <—接口依次拼接在這后面
http://test.com/vsk/virsical-auth/oauth/ <—接口依次拼接在這后面
以此類推,不過(guò)一般比較少出現(xiàn)這種情況。上述是“初級(jí)目錄”的情況,還有一種情況則是前后端分離。這個(gè)也很好理解。比方說(shuō)你訪問(wèn)的網(wǎng)站是:
http://admin.test.com/#/login
然而負(fù)責(zé)提供服務(wù)的后端地址可能是:
http://api.admin.test.com/api/admin/login
http://admin.test.com:8080/api/admin/login
這些抓包都很容易看出來(lái),就不贅述了。此外還有一種很有趣的情況,還是以我們上面提取出的接口為例:
注意看藍(lán)框標(biāo)注的部分,這些“接口”uri比其它接口uri顯著短得多,而且規(guī)則也不一樣,很多時(shí)候你把他們與后端或者“初級(jí)路徑”做拼接去請(qǐng)求,卻發(fā)現(xiàn)直接404了,那么這種是什么呢?這些實(shí)際上大部分是前端uri,相信師傅們經(jīng)常能看到
http://test.com/#/login
http://test.com/#/index
這樣的路徑,這實(shí)際上就是前端的uri,當(dāng)然不一定每個(gè)系統(tǒng)都是這樣,也得因地制宜地去觀察規(guī)則,比方說(shuō)在上圖中,我們嘗試訪問(wèn):
http://test.com/#/menu/list
也有可能直接去訪問(wèn)到一些鑒權(quán)沒(méi)做好的頁(yè)面,去看到一些信息或者調(diào)用某些功能。
同樣地,我們要想,上述這種“現(xiàn)有功能分析法”就足夠了嗎?這登錄點(diǎn)又何嘗不是冰山一角呢?讓我們來(lái)假設(shè)這么一些情況:
情況一:某個(gè)后臺(tái),訪問(wèn)即重定向到SSO登錄,能加載出JS,但是在這個(gè)過(guò)程中不會(huì)訪問(wèn)多余的接口,也沒(méi)有登錄之類的現(xiàn)成功能點(diǎn)給我們調(diào)用。這樣我們沒(méi)法通過(guò)現(xiàn)有功能去獲取到接口uri,這對(duì)我們判斷“初級(jí)路徑”就會(huì)造成很大阻礙,更何況如果目標(biāo)采用前后端分離,我們都不知道后端在哪里,又該怎么拼接接口測(cè)試呢?
情況二:還是某個(gè)后臺(tái),假如開發(fā)的思維非常嚴(yán)謹(jǐn),給每個(gè)Controller都設(shè)置了一個(gè)RequestMapping,比方說(shuō)登錄相關(guān)功能可能放在/login/這個(gè)uri下,普通用戶的功能放在/user/,管理員的功能放在/admin/。也就是說(shuō),我們至少有可能存在三種“初級(jí)路徑”,在這種情況下,即使我們有一個(gè)登錄的現(xiàn)有功能,我們也只是獲取到了/login/這個(gè)初級(jí)路徑,而我們提取的接口uri肯定絕大部分都是分布在/user/和/admin/兩個(gè)路徑下,在這種情況下,實(shí)際上也相當(dāng)于我們忽略掉了絕大部分的接口。
那么這又該如何破局呢?其實(shí)也非常ez,因?yàn)樗@些后端地址包括“初級(jí)路徑”,肯定不是無(wú)中生有搞出來(lái)的,這些東西肯定都在JS里。比方說(shuō)上面的那個(gè)多個(gè)初級(jí)路徑的情況,在JS中大概率存放了一些地址:
http://api.test.com/login/
http://api.test.com/user/
http://api.test.com/admin/
當(dāng)用戶訪問(wèn)對(duì)應(yīng)功能,比方說(shuō)普通用戶修改自己的密碼,前端會(huì)取出:
/userApi/changePwd
然后和對(duì)應(yīng)的地址做拼接:
http://api.test.com/user/userApi/changePwd
然后發(fā)起一次請(qǐng)求。
因此我們上述提取接口,實(shí)際上就是提取了所有類似/userApi/changePwd這樣的uri。我們要找后端也很簡(jiǎn)單,寫個(gè)正則專門匹配http://或https://開頭的字符串即可:
這個(gè)正則也比較簡(jiǎn)單,效果大概是這樣:
Unexpected information和findsomething也可以實(shí)現(xiàn)一部分這樣的功能,如下圖也是來(lái)自于某個(gè)企業(yè)src:
Unexpected information插件就幫我們找到了大量后端地址。
我們獲取到所有可能的后端和初級(jí)路徑之后,我比較喜歡的操作其實(shí)是采用笛卡爾積去依此拼接初級(jí)路徑。簡(jiǎn)單來(lái)說(shuō):
后端字典 接口字典`` ``http://api1.test.com/ /user/getinfo`` ``http://api2.test.com/api/admin/ /user/register`` ``http://api2.test.com/api/ /manager/changeSetting
按照笛卡爾積拼接處理可以得到:
http://api1.test.com/user/getinfo` ` ``http://api1.test.com/user/register`` ``http://api1.test.com/manager/changeSetting`` ``http://api2.test.com/api/admin/user/getinfo` ` ``http://api2.test.com/api/admin/user/register`` ``http://api2.test.com/api/admin/manager/changeSetting`` ``http://api2.test.com/api/user/getinfo` ` ``http://api2.test.com/api/user/register`` ``http://api2.test.com/api/manager/changeSetting
然后我們把這個(gè)最終的列表丟給HTTPX之類的工具跑一遍,測(cè)測(cè)活,根據(jù)響應(yīng)碼和數(shù)據(jù)包長(zhǎng)度去篩選出所有可用接口,管他什么后端、初級(jí)路徑,一下就能找到了,要的就是笨辦法!當(dāng)然這一步要是樂(lè)意也可以用burp的Cluster bomb去搞,反正啥工具用得順手就用啥工具去測(cè)活。
綜上我們就簡(jiǎn)單介紹了怎么去提取后端,然后怎么去拼接測(cè)試。然而我們提取出后端或者別的地址后,也不要只盯著接口拼接和測(cè)活去搞,眼界開拓點(diǎn),這些新找到的地址,靠常規(guī)的信息搜集手法不一定能找到,屬于藏得比較深的資產(chǎn),所以算是比較重要的攻擊面,可以進(jìn)一步對(duì)這些新的地址進(jìn)行全端口掃描、漏掃或者其他測(cè)試手段,說(shuō)不定就找到啥洞能直接一把梭getshell了。因此獲取JS中的后端、地址實(shí)際上是兩個(gè)目的,一個(gè)是與接口測(cè)試相結(jié)合,另一個(gè)則是打開新的攻擊面。
5.通過(guò)FUZZ“初級(jí)路徑”打開突破口
同樣地,我們上面介紹了從JS和現(xiàn)有功能中去尋找后端地址和初級(jí)路徑的一些方法和思想。但我們還是捫心自問(wèn)一下,這就是全部了?
實(shí)際上并不是,我舉一個(gè)例子就很好理解了,有些開發(fā)在寫后端的時(shí)候,喜歡加一些用于測(cè)試的接口和頁(yè)面,這些接口肯定不會(huì)放在js里,并且其uri和js中的正常接口可能截然不同。反正大部分情況下初級(jí)路徑是不同的。因此有時(shí)候習(xí)慣性對(duì)后端地址FUZZ一下初級(jí)路徑,會(huì)有很大收獲。這里也給出一個(gè)企業(yè)src中的例子,雖然這個(gè)漏洞被修復(fù)了,不過(guò)我還是要進(jìn)行很多改動(dòng),可能會(huì)影響一些觀看體驗(yàn)。
提取這個(gè)平臺(tái)的后端和接口進(jìn)行測(cè)試,除了登錄接口全部鑒權(quán),其默認(rèn)初始路徑為/api/
我根據(jù)其Title,在bing搜索類似網(wǎng)站:
找到一個(gè)ip,有可能是上述平臺(tái)的測(cè)試版本,其頁(yè)面內(nèi)容和title同樣是大黑客平臺(tái),對(duì)這個(gè)平臺(tái)進(jìn)行目錄FUZZ
成功找到一個(gè)特殊的uri,其中返回所有測(cè)試接口信息,進(jìn)一步拼接測(cè)試找到大量未授權(quán)接口。
上述案例出于保密性,因此用F12給頁(yè)面內(nèi)容全都修改了,并且省略了大量細(xì)節(jié),但卻是一個(gè)真實(shí)存在的案例,通過(guò)FUZZ初級(jí)目錄和接口,找到了開發(fā)者遺留的測(cè)試接口文檔,進(jìn)一步找到大量接口未鑒權(quán)??傊?#xff0c;目錄FUZZ是非常好的組合技,可以在很多意想不到的地方助我們一臂之力。
當(dāng)然這里我們其實(shí)還可以拓展,那就是既然每一級(jí)目錄下都可能有一些新東西,為什么我們不可以寫一個(gè)插件去遞歸測(cè)試呢?比如java中常見的swaggerui、api-docs接口文檔,再比如actuator端點(diǎn)泄露,druid未授權(quán)等問(wèn)題,關(guān)于這塊其實(shí)早就有很多很好用的插件了,例如Tsojanscan、APIKIT等等,強(qiáng)烈推薦師傅們使用(稍微有點(diǎn)跑題hhh)
6.來(lái)點(diǎn)憑據(jù) 來(lái)點(diǎn)token 來(lái)點(diǎn)AK/SK
在前文,我們介紹了要如何提取接口uri,如何尋找后端地址和初級(jí)路徑,對(duì)于攻擊者來(lái)說(shuō),其實(shí)已經(jīng)可以開始測(cè)試了,但這也還不是JS中的全部。相信很多師傅也能看到很多案例,比如從JS中提取AK/SK然后梭哈云資產(chǎn)的。這也正是我們接下來(lái)要討論的點(diǎn),我們還需要從JS里提取哪些敏感信息。
首先我們很容易想到一些要素,比如手機(jī)號(hào)、郵箱、身份證,因?yàn)楹芏嗵崛S并分析的場(chǎng)景都是那種后臺(tái)登錄點(diǎn),提取這些信息,我們可能可以找到潛藏的用戶名,或者我們可以通過(guò)這些信息去進(jìn)行密碼重置等操作,再或者結(jié)合褲子進(jìn)一步查找信息。在部分場(chǎng)景下,甚至只能通過(guò)郵箱或手機(jī)號(hào)作為用戶名登錄。因此搜集這些實(shí)際上是為了后續(xù)的密碼噴灑、爆破相關(guān)攻擊路線服務(wù)的。給出提取正則(python)如下:
#郵箱匹配`` ``matches = re.findall(r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}', line)`` ``#手機(jī)號(hào)匹配`` ``matches = re.findall(r'(?<!\d)(13\d{9}|14[579]\d{8}|15[^4\D]\d{8}|166\d{8}|17[^49\D]\d{8}|18\d{9}|19[189]\d{8})(?!\d)', line)`` ``#身份證匹配`` ``matches = re.findall(r'\b\d{17}[\dXx]|\b\d{14}\d{1}|\b\d{17}[\dXx]', line)
順這個(gè)思路想,我們?cè)诿艽a噴灑、爆破流程中常見驗(yàn)證碼以及一些IP限制,在部分情況下,XFF偽造一個(gè)內(nèi)部IP會(huì)是繞過(guò)方法,如果目標(biāo)的鑒權(quán)機(jī)制檢測(cè)到特定內(nèi)部IP就直接放行,那就更爽了,因此我們還可以寫個(gè)正則匹配IP:
#ip匹配`` ``matches = re.findall(r'\d+\.\d+\.\d+\.\d+', line)
繼續(xù)思考,既然能找到賬號(hào),我們有沒(méi)有可能找到密碼呢?嗯,這個(gè)難度就大了,一般只能通過(guò)js中變量的賦值來(lái)找到蛛絲馬跡,我們可以用正則匹配
Password =`` ``Password :
這樣的關(guān)鍵字,從而找到一些密碼的蛛絲馬跡,通過(guò)這種思路,其實(shí)也可以去找AK/SK,兩個(gè)相關(guān)的正則如下:
#密碼匹配小正則`` ``matches = re.findall(r'(?:^|_)((?:username|password|key|auv)_)\s*[:=><]*\s*["\']([^"\']+)["\']', line)`` ``#匹配信息大正則`` ``matches = re.findall(r'(?i)((access_key|username|user|jwtkey|jwt_key|AESKEY|AES_KEY|appsecret|app_secret|access_token|password|admin_pass|admin_user|algolia_admin_key|algolia_api_key|alias_pass|alicloud_access_key|amazon_secret_access_key|amazonaws|ansible_vault_password|phone|aos_key|api_key|api_key_secret|api_key_sid|api_secret|api\.googlemaps\s+AIza|apidocs|apikey|apiSecret|app_debug|app_id|app_key|app_log_level|app_secret|appkey|appkeysecret|application_key|appspot|auth_token|authorizationToken|authsecret|aws_access|aws_access_key_id|aws_bucket|aws_key|aws_secret|aws_secret_key|aws_token|AWSSecretKey|b2_app_key|bashrc\ password|bintray_apikey|bintray_gpg_password|bintray_key|bintraykey|bluemix_api_key|bluemix_pass|browserstack_access_key|bucket_password|bucketeer_aws_access_key_id|bucketeer_aws_secret_access_key|built_branch_deploy_key|bx_password|cache_driver|cache_s3_secret_key|cattle_access_key|cattle_secret_key|certificate_password|ci_deploy_password|client_secret|client_zpk_secret_key|clojars_password|cloud_api_key|cloud_watch_aws_access_key|cloudant_password|cloudflare_api_key|cloudflare_auth_key|cloudinary_api_secret|cloudinary_name|codecov_token|config|conn\.login|connectionstring|consumer_key|consumer_secret|credentials|cypress_record_key|database_password|database_schema_test|datadog_api_key|datadog_app_key|db_password|db_server|db_username|dbpasswd|dbpassword|dbuser|deploy_password|digitalocean_ssh_key_body|digitalocean_ssh_key_ids|docker_hub_password|docker_key|docker_pass|docker_passwd|docker_password|dockerhub_password|dockerhubpassword|dot-files|dotfiles|droplet_travis_password|dynamoaccesskeyid|dynamosecretaccesskey|elastica_host|elastica_port|elasticsearch_password|encryption_key|encryption_password|env\.heroku_api_key|env\.sonatype_password|eureka\.awssecretkey)\s*[:=><]{1,2}\s*[\"\']{0,1}([0-9a-zA-Z\-_=+/]{8,64})[\"\']{0,1})', line)
如果你有其它想匹配的關(guān)鍵字,自己往上述正則中添加即可。
前面我們提了一嘴AK/SK,從JS中找這玩意真是典中典了,尤其是那些把文件傳儲(chǔ)存桶里的功能點(diǎn),要尤其注意其是否把AK/SK硬編碼在前端了。SK一般是無(wú)特征無(wú)規(guī)律可循的,不過(guò)AK是有規(guī)律的,AK的前四位一般是固定的,不同的云廠商則不同,詳情可以參考這篇文章:
https://wiki.teamssix.com/cloudservice/more/
依據(jù)這篇文章,我們實(shí)際上可以寫出一些提取AK的正則,并且SK一般都會(huì)和AK寫在一起,因此只要在JS中定位到AK,那么離找到SK也不遠(yuǎn)了,正則如下:
#常見的云AK匹配`` ``matches = re.findall(r'''(['"]\s*(?:GOOG[\w\W]{10,30}|AZ[A-Za-z0-9]{34,40}|AKID[A-Za-z0-9]{13,20}|AKIA[A-Za-z0-9]{16}|IBM[A-Za-z0-9]{10,40}|OCID[A-Za-z0-9]{10,40}|LTAI[A-Za-z0-9]{12,20}|AK[\w\W]{10,62}|AK[A-Za-z0-9]{10,40}|AK[A-Za-z0-9]{10,40}|UC[A-Za-z0-9]{10,40}|QY[A-Za-z0-9]{10,40}|KS3[A-Za-z0-9]{10,40}|LTC[A-Za-z0-9]{10,60}|YD[A-Za-z0-9]{10,60}|CTC[A-Za-z0-9]{10,60}|YYT[A-Za-z0-9]{10,60}|YY[A-Za-z0-9]{10,40}|CI[A-Za-z0-9]{10,40}|gcore[A-Za-z0-9]{10,30})\s*['"])''', line)`` ``#谷歌云 AccessKey ID匹配`` ``matches = re.findall(r'\bAIza[0-9A-Za-z_\-]{35}\b', line)`` ``#金山云 AccessKey ID匹配`` ``matches = re.findall(r'\bAKLT[a-zA-Z0-9-_]{16,28}\b', line)`` ``#火山引擎 AccessKey ID匹配`` ``matches = re.findall(r'\b(?:AKLT|AKTP)[a-zA-Z0-9]{35,50}\b', line)`` ``#亞馬遜 AccessKey ID匹配`` ``matches = re.findall(r'["''](?:A3T[A-Z0-9]|AKIA|AGPA|AIDA|AROA|AIPA|ANPA|ANVA|ASIA)[A-Z0-9]{16}["'']', line)`` ``#京東云 AccessKey ID匹配`` ``matches = re.findall(r'\bJDC_[0-9A-Z]{25,40}\b', line)
再接下來(lái),我們還能想到什么呢?前面我們提到了一些明文的鑒權(quán)因素,比如用戶名和密碼。然而實(shí)際情況下我們經(jīng)常遇到別的一些鑒權(quán)因素,比如JWT,再比如形如”Basic 一串base6
編碼”這樣格式的鑒權(quán)憑據(jù),常見于請(qǐng)求頭中。開發(fā)者有沒(méi)有可能在測(cè)試前端的時(shí)候,在前端放了一些測(cè)試用戶的鑒權(quán)憑據(jù),上線后忘記刪除呢?當(dāng)然也是有可能的,筆者就遇到過(guò)這樣的情況:
這里也給出幾個(gè)相關(guān)正則:
#JWT Token匹配`` ``matches = re.findall(r'eyJ[A-Za-z0-9_/+\-]{10,}={0,2}\.[A-Za-z0-9_/+\-\\]{15,}={0,2}\.[A-Za-z0-9_/+\-\\]{10,}={0,2}', line)`` ``#PRIVATE KEY匹配`` ``matches = re.findall(r'-----\s*?BEGIN[ A-Z0-9_-]*?PRIVATE KEY\s*?-----[a-zA-Z0-9\/\n\r=+]*-----\s*?END[ A-Z0-9_-]*? PRIVATE KEY\s*?-----', line)`` ``#Auth Token匹配`` ``matches = re.findall(r'["''\[]*[Aa]uthorization["''\]]*\s*[:=]\s*[''"]?\b(?:[Tt]oken\s+)?[a-zA-Z0-9\-_+/]{20,500}[''"]?', line)`` ``#Basic Token匹配`` ``matches = re.findall(r'\b[Bb]asic\s+[A-Za-z0-9+/]{18,}={0,2}\b', line)`` ``#Bearer Token匹配`` ``matches = re.findall(r'\b[Bb]earer\s+[a-zA-Z0-9\-=._+/\\]{20,500}\b', line)
然后說(shuō)到上述的Token和key,還有一種情況相信各位師傅也經(jīng)常見到,那就是硬編碼在JS里的釘釘、飛書、企微、微信小程序/公眾號(hào)之類的key和token,能搞到這些東西并且能利用也大概率能搞個(gè)高危,下面也給出部分規(guī)則:
#slack webhook匹配`` ``matches = re.findall(r'\bhttps://hooks.slack.com/services/[a-zA-Z0-9\-_]{6,12}/[a-zA-Z0-9\-_]{6,12}/[a-zA-Z0-9\-_]{15,24}\b', line)`` ``#飛書 webhook匹配`` ``matches = re.findall(r'\bhttps://open.feishu.cn/open-apis/bot/v2/hook/[a-z0-9\-]{25,50}\b', line)`` ``#釘釘 webhook匹配`` ``matches = re.findall(r'\bhttps://oapi.dingtalk.com/robot/send\?access_token=[a-z0-9]{50,80}\b', line)`` ``#企業(yè)微信 webhook匹配`` ``matches = re.findall(r'\bhttps://qyapi.weixin.qq.com/cgi-bin/webhook/send\?key=[a-zA-Z0-9\-]{25,50}\b', line)`` ``#微信公眾號(hào)匹配`` ``matches = re.findall(r'["''](gh_[a-z0-9]{11,13})["'']', line)`` ``#企業(yè)微信 corpid匹配`` ``matches = re.findall(r'["''](ww[a-z0-9]{15,18})["'']', line)`` ``#微信 公眾號(hào)/小程序 APPID匹配`` ``matches = re.findall(r'["''](wx[a-z0-9]{15,18})["'']', line)`` ``#騰訊云 API網(wǎng)關(guān) APPKEY匹配`` ``matches = re.findall(r'\bAPID[a-zA-Z0-9]{32,42}\b', line)
除此之外還有一些亂七八糟的應(yīng)用的Token:
#grafana service account token匹配1`` ``matches = re.findall(r'\b(?:VUE|APP|REACT)_[A-Z_0-9]{1,15}_(?:KEY|PASS|PASSWORD|TOKEN|APIKEY)[\'"]*[:=]"(?:[A-Za-z0-9_\-]{15,50}|[a-z0-9/+]{50,100}==?)"', line)`` ``#grafana service account token匹配2`` ``matches = re.findall(r'\bglsa_[A-Za-z0-9]{32}_[A-Fa-f0-9]{8}\b', line)`` ``#grafana cloud api token匹配`` ``matches = re.findall(r'\bglc_[A-Za-z0-9\-_+/]{32,200}={0,2}\b', line)`` ``#grafana api key匹配`` ``matches = re.findall(r'\beyJrIjoi[a-zA-Z0-9\-_+/]{50,100}={0,2}\b', line)`` ``#Github Token匹配`` ``matches = re.findall(r'\b((?:ghp|gho|ghu|ghs|ghr|github_pat)_[a-zA-Z0-9_]{36,255})\b', line)`` ``#Gitlab V2 Token匹配`` ``matches = re.findall(r'\b(glpat-[a-zA-Z0-9\-=_]{20,22})\b', line)
把上面的所有正則綜合起來(lái),就能得到一個(gè)比較好用的敏感信息提取腳本了,我本地高了一些測(cè)試數(shù)據(jù),提取結(jié)果像是下面這樣:
通過(guò)上述正則,我們就能搜集到JS中常見的敏感信息。當(dāng)然你也可以把上述正則改寫成適用于HaE等插件的版本,就可以解放雙手了。不過(guò)由于本文的模式是把JS下載回本地然后用腳本跑,所以我還是自己搞了一個(gè)腳本本地提取敏感信息。上面有很多規(guī)則是從一個(gè)開源工具里扒出來(lái)魔改的,想半天想不起來(lái)是哪款工具了。
7.注釋一點(diǎn)都不重要 //并不是
在我腦海里對(duì)一個(gè)案例印象很深刻,雖然想不起具體是哪篇文章,大意是一個(gè)師傅在測(cè)試過(guò)程中,從JS的注釋里找到一個(gè)接口從而打開突破口(沒(méi)記錯(cuò)的話應(yīng)該是一個(gè)能執(zhí)行SQL Server語(yǔ)句的執(zhí)行點(diǎn))。
并且有些時(shí)候,開發(fā)者可能也會(huì)把默認(rèn)賬號(hào)密碼等敏感信息以注釋的形式寫在某個(gè)文件中,所以提取注釋還是有可能找到一些敏感信息。
那么要怎從JS和HTML中提取注釋呢,我寫了下面這些正則:
match = re.search(r'\*/(.*)', line)`` ``matches = re.findall(r'//[^\n]*', line)`` ``match = re.search(r'/\*(.*)', line)`` ``matches = re.findall(r'<!--(?:.|\n)*?-->', line)
可以有效提取多種風(fēng)格的注釋,以下面這些數(shù)據(jù)為例:
提取結(jié)果如下:
嗯,雖然格式很不好看,但是東西都提取出來(lái)了,能用,沒(méi)毛病。
8.提取漢字以及可能的妙用
繼續(xù)拓展一下,既然一些注釋還有可能用得上的敏感信息多以中文的形式存在,那么有沒(méi)有可能通過(guò)匹配所有中文,去找到一些敏感信息呢?還是以我自己的案例為例,我先是從JS中提取出一個(gè)測(cè)試手機(jī)號(hào)
然后跟過(guò)去看前后文,找到了目標(biāo)一個(gè)內(nèi)部員工的名字
進(jìn)一步尋找,還可以找到注冊(cè)相關(guān)服務(wù)(未開放給普通用戶)要求的密碼規(guī)則:
(可能為后續(xù)密碼爆破提供指導(dǎo))
還找到了目標(biāo)的一些辦公地點(diǎn)相關(guān)的信息:
雖然這些都稱不上有多敏感,也沒(méi)法當(dāng)作漏洞交上去,但是萬(wàn)一呢?很多時(shí)候我們的測(cè)試就缺了那么一點(diǎn)點(diǎn)的關(guān)鍵信息,就比如說(shuō)上面的員工名字,萬(wàn)一褲子里正好有這家伙的常用密碼,萬(wàn)一他名字的拼音就是賬號(hào)呢?多關(guān)注一點(diǎn)細(xì)枝末節(jié)還是很有必要的。這里就不給正則和腳本了,因?yàn)槲艺趯?#xff08;
9.一些奇思妙想
上面我們搜集這些信息大多都是用的正則表達(dá)式,還是比較死板的,總有一些亂七八糟的我們考慮不到的情況。剛好前段時(shí)間大模型炒的沸沸揚(yáng)揚(yáng),有沒(méi)有可能找一堆JS文件,丟給大模型訓(xùn)練,讓幫我們提取出JS中的各種信息呢?目前小隊(duì)的范師傅就在投喂相關(guān)的安全大模型。
10.結(jié)語(yǔ)
綜上,我們就基本解決了“要從JS中提取什么”的問(wèn)題,下一篇文章應(yīng)該會(huì)講講我們可以用什么方法去獲取接口的參數(shù),畢竟上面我們只是找到存活的接口,但是后續(xù)測(cè)試還得找到參數(shù)呢,除了從JS里尋找參數(shù)以及參數(shù)FUZZ之外,還是有一些有趣的方法,師傅們點(diǎn)點(diǎn)關(guān)注不迷路哦。
11.附錄
本文提到的一些工具的下載地址如下:
https://github.com/rtcatc/Packer-Fuzzer
https://github.com/momosecurity/FindSomething
https://github.com/ScriptKid-Beta/Unexpected_information
https://github.com/gh0stkey/HaE
https://github.com/Tsojan/TsojanScan
https://github.com/API-Security/APIKit
小腳本內(nèi)容如下,想要改成提取其他信息的腳本,只需要替換或者增加新的正則即可:
import json``import re``import requests``import sys``import os`` ``fileurl=sys.argv[1]`` ``filemkdir=fileurl.split('_')[0]``if not os.path.exists(filemkdir):` `os.makedirs(filemkdir)`` `` ``#get path + 路徑名稱``paths=[]``for dirpath, dirnames, filenames in os.walk('./'+filemkdir):` `for file in filenames:` `with open("./"+filemkdir+"/"+file,"r",encoding='gb18030', errors='ignore') as f2:` `try:` `line=f2.readlines()` `for line in line:` `line=line.strip('\n').strip('\t')` `#print(line)` `p = re.findall('''(['"]\/[^][^>< \)\(\{\}]*?['"])''',line)` `#print(p)` `if p != None:` `#print(p)` `for path in p:` `path=path.replace(':"',"").replace('"',"")` `paths.append(file+"---"+path)` `except Exception as e:` `print(e)`` `` ``for var in sorted(set(paths)):` `with open (fileurl+'_path.txt',"a+",encoding='gb18030', errors='ignore') as paths:` `paths.write(var+'\n')
關(guān)于我們:
感謝各位大佬們關(guān)注,后續(xù)會(huì)堅(jiān)持更新滲透漏洞思路分享、安全測(cè)試、好用工具分享以及挖掘SRC思路等文章,同時(shí)會(huì)組織不定期抽獎(jiǎng),希望能得到各位的關(guān)注與支持。
CNVD、EDU及SRC賞金,攻防演練資源分享(免殺,溯源,釣魚等),各種新鮮好用工具,最新poc定期更新,以及一些好東西(還在學(xué)怎么挖通用漏洞嗎快來(lái)掃碼加入)
網(wǎng)絡(luò)安全學(xué)習(xí)路線&學(xué)習(xí)資源
網(wǎng)絡(luò)安全的知識(shí)多而雜,怎么科學(xué)合理安排?
下面給大家總結(jié)了一套適用于網(wǎng)安零基礎(chǔ)的學(xué)習(xí)路線,應(yīng)屆生和轉(zhuǎn)行人員都適用,學(xué)完保底6k!就算你底子差,如果能趁著網(wǎng)安良好的發(fā)展勢(shì)頭不斷學(xué)習(xí),日后跳槽大廠、拿到百萬(wàn)年薪也不是不可能!
初級(jí)網(wǎng)工
1、網(wǎng)絡(luò)安全理論知識(shí)(2天)
①了解行業(yè)相關(guān)背景,前景,確定發(fā)展方向。
②學(xué)習(xí)網(wǎng)絡(luò)安全相關(guān)法律法規(guī)。
③網(wǎng)絡(luò)安全運(yùn)營(yíng)的概念。
④等保簡(jiǎn)介、等保規(guī)定、流程和規(guī)范。(非常重要)
2、滲透測(cè)試基礎(chǔ)(一周)
①滲透測(cè)試的流程、分類、標(biāo)準(zhǔn)
②信息收集技術(shù):主動(dòng)/被動(dòng)信息搜集、Nmap工具、Google Hacking
③漏洞掃描、漏洞利用、原理,利用方法、工具(MSF)、繞過(guò)IDS和反病毒偵察
④主機(jī)攻防演練:MS17-010、MS08-067、MS10-046、MS12-20等
3、操作系統(tǒng)基礎(chǔ)(一周)
①Windows系統(tǒng)常見功能和命令
②Kali Linux系統(tǒng)常見功能和命令
③操作系統(tǒng)安全(系統(tǒng)入侵排查/系統(tǒng)加固基礎(chǔ))
4、計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)(一周)
①計(jì)算機(jī)網(wǎng)絡(luò)基礎(chǔ)、協(xié)議和架構(gòu)
②網(wǎng)絡(luò)通信原理、OSI模型、數(shù)據(jù)轉(zhuǎn)發(fā)流程
③常見協(xié)議解析(HTTP、TCP/IP、ARP等)
④網(wǎng)絡(luò)攻擊技術(shù)與網(wǎng)絡(luò)安全防御技術(shù)
⑤Web漏洞原理與防御:主動(dòng)/被動(dòng)攻擊、DDOS攻擊、CVE漏洞復(fù)現(xiàn)
5、數(shù)據(jù)庫(kù)基礎(chǔ)操作(2天)
①數(shù)據(jù)庫(kù)基礎(chǔ)
②SQL語(yǔ)言基礎(chǔ)
③數(shù)據(jù)庫(kù)安全加固
6、Web滲透(1周)
①HTML、CSS和JavaScript簡(jiǎn)介
②OWASP Top10
③Web漏洞掃描工具
④Web滲透工具:Nmap、BurpSuite、SQLMap、其他(菜刀、漏掃等)
恭喜你,如果學(xué)到這里,你基本可以從事一份網(wǎng)絡(luò)安全相關(guān)的工作,比如滲透測(cè)試、Web 滲透、安全服務(wù)、安全分析等崗位;如果等保模塊學(xué)的好,還可以從事等保工程師。薪資區(qū)間6k-15k
到此為止,大概1個(gè)月的時(shí)間。你已經(jīng)成為了一名“腳本小子”。那么你還想往下探索嗎?
【“腳本小子”成長(zhǎng)進(jìn)階資源領(lǐng)取】
7、腳本編程(初級(jí)/中級(jí)/高級(jí))
在網(wǎng)絡(luò)安全領(lǐng)域。是否具備編程能力是“腳本小子”和真正黑客的本質(zhì)區(qū)別。在實(shí)際的滲透測(cè)試過(guò)程中,面對(duì)復(fù)雜多變的網(wǎng)絡(luò)環(huán)境,當(dāng)常用工具不能滿足實(shí)際需求的時(shí)候,往往需要對(duì)現(xiàn)有工具進(jìn)行擴(kuò)展,或者編寫符合我們要求的工具、自動(dòng)化腳本,這個(gè)時(shí)候就需要具備一定的編程能力。在分秒必爭(zhēng)的CTF競(jìng)賽中,想要高效地使用自制的腳本工具來(lái)實(shí)現(xiàn)各種目的,更是需要擁有編程能力.
零基礎(chǔ)入門,建議選擇腳本語(yǔ)言Python/PHP/Go/Java中的一種,對(duì)常用庫(kù)進(jìn)行編程學(xué)習(xí); 搭建開發(fā)環(huán)境和選擇IDE,PHP環(huán)境推薦Wamp和XAMPP, IDE強(qiáng)烈推薦Sublime; ·Python編程學(xué)習(xí),學(xué)習(xí)內(nèi)容包含:語(yǔ)法、正則、文件、 網(wǎng)絡(luò)、多線程等常用庫(kù),推薦《Python核心編程》,不要看完; ·用Python編寫漏洞的exp,然后寫一個(gè)簡(jiǎn)單的網(wǎng)絡(luò)爬蟲; ·PHP基本語(yǔ)法學(xué)習(xí)并書寫一個(gè)簡(jiǎn)單的博客系統(tǒng); 熟悉MVC架構(gòu),并試著學(xué)習(xí)一個(gè)PHP框架或者Python框架 (可選); ·了解Bootstrap的布局或者CSS。
8、超級(jí)網(wǎng)工
這部分內(nèi)容對(duì)零基礎(chǔ)的同學(xué)來(lái)說(shuō)還比較遙遠(yuǎn),就不展開細(xì)說(shuō)了,貼一個(gè)大概的路線。感興趣的童鞋可以研究一下,不懂得地方可以【點(diǎn)這里】加我耗油,跟我學(xué)習(xí)交流一下。
網(wǎng)絡(luò)安全工程師企業(yè)級(jí)學(xué)習(xí)路線
如圖片過(guò)大被平臺(tái)壓縮導(dǎo)致看不清的話,可以【點(diǎn)這里】加我耗油發(fā)給你,大家也可以一起學(xué)習(xí)交流一下。
一些我自己買的、其他平臺(tái)白嫖不到的視頻教程:
需要的話可以掃描下方卡片加我耗油發(fā)給你(都是無(wú)償分享的),大家也可以一起學(xué)習(xí)交流一下。
結(jié)語(yǔ)
網(wǎng)絡(luò)安全產(chǎn)業(yè)就像一個(gè)江湖,各色人等聚集。相對(duì)于歐美國(guó)家基礎(chǔ)扎實(shí)(懂加密、會(huì)防護(hù)、能挖洞、擅工程)的眾多名門正派,我國(guó)的人才更多的屬于旁門左道(很多白帽子可能會(huì)不服氣),因此在未來(lái)的人才培養(yǎng)和建設(shè)上,需要調(diào)整結(jié)構(gòu),鼓勵(lì)更多的人去做“正向”的、結(jié)合“業(yè)務(wù)”與“數(shù)據(jù)”、“自動(dòng)化”的“體系、建設(shè)”,才能解人才之渴,真正的為社會(huì)全面互聯(lián)網(wǎng)化提供安全保障。
特別聲明:
此教程為純技術(shù)分享!本書的目的決不是為那些懷有不良動(dòng)機(jī)的人提供及技術(shù)支持!也不承擔(dān)因?yàn)榧夹g(shù)被濫用所產(chǎn)生的連帶責(zé)任!本書的目的在于最大限度地喚醒大家對(duì)網(wǎng)絡(luò)安全的重視,并采取相應(yīng)的安全措施,從而減少由網(wǎng)絡(luò)安全而帶來(lái)的經(jīng)濟(jì)損失!!!