[當人工智能遇上安全] 3.安全領域中的機器學習及機器學習惡意請求識別案例分享

      網友投稿 1112 2022-05-30

      前一篇文章分享了張超大佬的兩次報告,帶領大家了解Fuzzing,第一篇是學術論文相關的“數據流敏感的漏洞挖掘方法”,第二篇是安全攻防實戰相關的“智能軟件漏洞攻防”。這篇文章將分享機器學習在安全領域的應用,并復現一個基于機器學習(邏輯回歸)的惡意請求識別。本文參考學習了大神們的總結,并復現總結相關知識,參考文獻見后。基礎性入門文章,只希望對初學者有所幫助。

      文章目錄

      一.安全領域中的機器學習

      1.身份識別與認證

      2.社會工程學

      3.網絡安全

      4.Web安全

      5.安全漏洞與惡意代碼

      6.入侵檢測與防御

      二.基于機器學習的惡意代碼檢測

      1.傳統的惡意代碼檢測

      2.基于機器學習的惡意代碼檢測

      3.機器學習在安全領域的特點及難點

      三.邏輯回歸識別網站惡意請求

      1.數據集

      2.N-grams和TF-IDF結合構造特征矩陣

      3.訓練模型

      4.檢測新數據集是惡意請求還是正常請求

      5.完整代碼

      四.總結

      前文推薦(華為云):

      [當人工智能遇上安全] 1.人工智能真的安全嗎?浙大團隊外灘大會分享AI對抗樣本技術

      [當人工智能遇上安全] 2.清華張超老師 - GreyOne: Discover Vulnerabilities with Data Flow Sensitive Fuzzing

      [當人工智能遇上安全] 3.安全領域中的機器學習及機器學習惡意請求識別案例分享

      一.安全領域中的機器學習

      機器學習方法是計算機利用已有的數據(經驗),訓練得出某種模型,并利用此模型預測未來的一種方法。機器學習學科融合了數學中的多個領域,主要包括統計學、概率論、線性代數以及數學計算。機器學習中的“訓練”與“預測”過程可以對應到人類的“歸納”和“推測”過程,如下圖所示。

      機器學習和模式識別、統計學習、數據挖掘、計算機視覺,語音識別,自然語言處理等領域有著很深的聯系。從范圍上來說,機器學習跟模式識別、統計學習、數據挖掘是類似的,同時,機器學習與其他領域的處理技術的結合,形成了計算機視覺、語音識別、自然語言處理等交叉學科。一般說數據挖掘時,可以等同于說機器學習,我們平常所說的機器學習應用,應該是通用的,不僅僅局限在結構化數據,還有圖像、音頻、視頻等應用。

      模式識別 ≈ 機器學習 + 工業應用

      數據挖掘 ≈ 機器學習 + 數據庫

      統計學習 ≈ 機器學習 + 數理統計

      計算機視覺 ≈ 機器學習 + 圖像處理 + 視頻處理

      語音識別 ≈ 機器學習 + 語音處理

      自然語言處理 ≈ 機器學習 + 文本處理

      機器學習能夠深入挖掘大數據價值,被廣泛用于各個領域,同時在網絡安全領域也有相關的應用。為了更清晰地闡述機器學習在安全攻防領域的實際應用與解決方案,如下圖所示,FreeBuf官網匯總了六大安全領域,分別是身份識別與認證、社會工程學、網絡安全、 Web安全、安全漏洞與惡意代碼、入侵檢測與防御,且在每一領域列舉了典型的應用案例。

      機器學習在安全攻防場景的應用與分析 - 騰訊云FreeBuf官方

      1.身份識別與認證

      身份識別與認證是AI運用較為多的領域,除了現有的各種人臉圖像識別,語音聲波識別,異常行為檢測等AI應用之外,本部分將列舉“驗證碼破解”與“惡意用戶識別”兩例。

      身份認證——驗證碼破解

      2017年6月,騰訊守護者計劃安全團隊協助警方打掉市面上最大打碼平臺“快啊答題”,挖掘出一條從撞庫盜號、破解驗證碼到販賣公民信息、實施網絡詐騙的全鏈條黑產。在驗證時識別時,黑產運用 AI,極大提升了單位時間內識別驗證碼的數量, 2017年一季度打碼量達到259億次,且識別驗證碼的精準度超過 80%。

      在網絡黑產中,不法分子竊取網站數據庫后,需要確認帳號對應的密碼是否正確,用撞庫將有價值的數據通過驗證的方式篩選出來,在這一過程中,最核心的障礙就是驗證碼安全體系。打碼平臺的AI系統,能將一張驗證碼圖片作為一個整體,將單字識別轉換成單圖多標簽、端到端的識別出驗證碼中的所有字符。此外還會通過搜集反饋回來的失敗樣本,以及人工打碼的標定數據,來實時訓練和更新識別網絡,不斷迭代訓練進行優化,進一步提高神經網絡模型的識別能力。因此,在面對網站驗證時,還需要多種不同類型的驗證方式,如圖片選取,文字選擇,圖片填補等等,才能應對黑客日新月異的攻擊破解手段。

      行為分析——惡意用戶識別

      在分析用戶行為時,從用戶點擊流數據中分析惡意用戶的請求,特別地,可采用孤立森林(Isolation Forest)算法進行分類識別。在用戶點擊流數據中,包括請求時間、IP、平臺等特征。孤立森林模型首先隨機選擇用戶行為樣本的一個特征,再隨機選擇該特征取值范圍中的一個值,對樣本集做拆分,迭代該過程,生成一顆孤立樹;樹上葉子節點離根節點越近,其異常值越高。迭代生成多顆孤立樹,生成孤立森林,識別時,融合多顆樹的結果形成最終的行為分類結果。

      由于惡意用戶僅占總體用戶的少部分,具有異常樣本“量少”和“與正常樣本表現不一樣”的兩個特點,且不依賴概率密度,因此此異常檢測模型不會導致高維輸入的下溢出問題。該模型可識別異常用戶盜號、LBS/加好友、欺詐等行為。隨著樣本增加,惡意請求的uin、類型、發生時間通過分析端通過線下人工分析和線上打擊,達到良好的檢測效果。

      2.社會工程學

      社會工程學是指攻擊者利用某些手段使他人受騙的行為。除了現有的信用卡欺詐,信貸風險評估等AI應用,本部分將列舉“魚叉式網絡釣魚”與“欺詐電話識別”兩例。

      反釣魚——魚叉式網絡釣魚

      2017年5月,Google利用機器學習技術,其垃圾郵件和網絡釣魚郵件的識別率已經達到了 99.9%。Google建立了一個系統。該系統可通過延遲Gmail信息的時間以執行更詳細的網絡釣魚分析。當用戶在瀏覽郵件的過程中,有關網絡釣魚的信息會更快被檢測出來。利用 Google的機器學習,該系統還能隨著時間的推移實時更新算法,從而可對數據和信息進行更深入的分析。不過,該系統僅適用于0.05%的信息。

      區別于普通網絡釣魚,魚叉式網絡釣魚是針對特定目標進行定制的網絡釣魚攻擊。黑客會從社交媒體、新聞報道等資料中對攻擊目標的信息中,采用機器學習的方法進行前期的分析,包括姓名、郵箱地址、社交媒體賬號或者任何在網上參與過的內容等。攻擊對象通常不對于普通用戶,而是特定的公司或者組織的成員,竊取的資料也并非個人的資料,而是其他高度敏感性資料。面對魚叉釣魚,一方面企業會加強網站的數據保護,防各種爬蟲工具,通過逆向分析,并采用機器學習進行垃圾/釣魚郵件的檢測過濾,另一方面用戶自身提高安全意識注意個人隱私泄露,保持警惕性。

      反欺詐——欺詐電話識別

      這幾年,在通信詐騙方面的犯罪愈演愈烈,僅2015年的報案數據,如“猜猜我是誰”,“冒充公檢法”此類涉及電話詐騙的案件,全國用戶損失就約220億左右。在應對通信欺詐,通常分為事后處置與實時阻斷兩種解決方法,而由于事后處置的時效性太低,詐騙資金往往已被轉移,無法很好地起到保護公民財產的作用。因此實時阻斷十分必要,當用戶接打電話,通過機器學習,能夠實時發現是否屬于詐騙電話,并立刻發出實時告警。

      從號碼活躍特征數據、號碼的社交網絡、號碼的行為事件流、號碼的行為特征、號碼信用度、號碼異常度等方面來進行特征抽取,根據機器學習架構檢測。此外,再結合事件模型與行為模式的關聯分析,能更準確地對欺詐電話進行監測。

      3.網絡安全

      網絡安全是指網絡系統軟硬件受保護,網絡服務不中斷。除了現有的隱藏信號識別等AI應用,本部分將列舉“大數據DDoS檢測”與“偽基站短信識別”兩例。

      抗DDoS——大數據DDoS檢測

      近年來,基于機器學習算法的分布式拒絕服務(distributeddenial-of-service,簡稱DDoS)攻擊檢測技術已取得了很大的進展。在攻擊感知方面,可從宏觀攻擊流感知與微觀檢測方法兩個角度,分別基于IP流序列譜分析的泛洪攻擊與低速率拒絕服務(Low-rate Denial of Service,LDoS)方法進行感知。在此基礎上,將DDoS攻擊檢測轉化為機器學習的二分類問題。

      從概率點判別角度,基于多特征并行隱馬爾科夫模型(Multi-FeatureParallel Hidden Markov Model,MFP-HMM)的DDoS攻擊檢測方法,利用HMM隱狀態序列與特征觀測序列的對應關系,將攻擊引起的多維特征異常變化轉化為離散型隨機變量,通過概率計算來刻畫當前滑動窗口序列與正常行為輪廓的偏離程度。從分類超平面判別角度,基于最小二乘孿生支持向量機(LSTSVM)的DDoS攻擊分類超平面檢測方法,采用IP包五元組熵、 IP標識、TCP頭標志和包速率等作為LSTSVM模型的多維檢測特征向量,以體現DDoS攻擊存在的流分布特性。

      無線網絡攻擊——偽基站短信識別

      為了解決“犯罪分子通過冒充10086、95533等機構發送短信來獲得用戶的賬號、密碼和身份證等信息”這一問題。 2016年,360 手機依托 360公司研發的偽基站追蹤系統,率先在全球推出了偽基站詐騙短信識別功能,攔截準確度達 98%,可有力的確保用戶財產安全。360偽基站追蹤系統的核心價值就在于它解決上述偽基站打擊難題,依托海量的數據、高效的數據分析處理和數據可視化,可以為追查偽基站供精確的信息與準確的判斷。

      2015年12月,360手機在全球率先推出了偽基站垃圾、詐騙短信精準識別功能。由于垃圾和詐騙短信的識別和分類涉及到自然語言處理技術與機器學習模型, 360使用語言學規則與統計學方法相結合的方式來定義偽基站短信特征,可從海量數據中精確識別出偽基站短信,因而其識別精度可達 98%。對于360偽基站追蹤系統的發布、部署,以及其在360手機中的成功運用,有力遏制猖獗的偽基站詐騙活動,有助于維護廣大手機用戶及其他群眾的財產安全。

      4.Web安全

      安全網站檢測——惡意URL檢測

      在市面上,Google的Chrome已將檢測模型與機器學習相結合,支持安全瀏覽,向用戶警示潛在的惡意網址。結合成千上萬的垃圾郵件、惡意軟件、有啟發式信號的含勒索軟件的附件和發送者的簽名(已被標識為惡意的),對新的威脅進行識別和分類。

      目前大多數網站檢測方式是通過建立URL黑白名單的數據庫匹配進行排查,雖然具有一定的檢測效果,但有一定滯后性,不能夠對沒有記錄在案的URL進行識別。而基于機器學習,從 URL特征,域名特征, Web特征的關聯分析,使惡意URL識別具有高準確率,并具有學習推斷的能力。一些開源工具如Phinn提供了另個角度的檢測方法,如果一個頁面看起來非常像Google的登錄頁面,那么這個頁面就應該托管在Google域名。Phinn使用了機器學習領域中的卷積神經網絡算法來生成和訓練一個自定義的Chrome擴展,這個 Chrome擴展可以將用戶瀏覽器中呈現的頁面與真正的登錄頁面進行視覺相似度分析,以此來識別出惡意URL(釣魚網站)。

      注入攻擊檢測——Webshell檢測

      Webshell常常被稱為匿名用戶(入侵者)通過網站端口對網站服務器的某種程度上操作的權限。由于Webshell其大多是以動態腳本的形式出現,也有人稱之為網站的后門工具。在攻擊鏈模型中,整個攻擊過程分為:踩點、組裝、投送、攻擊、植入、控制、行動。在針對網站的攻擊中,通常是利用上傳漏洞,上傳Webshell,然后通過Webshell進一步控制web服務器。

      常見傳統的Webshell檢測方法主要有靜態檢測、動態檢測、語法檢測、統計學檢測等。隨著AI的興起,基于AI的Webshell文件特征檢測技術要較之傳統技術更勝一籌,通過詞袋&TF-IDF模型、Opcode&N-gram模型、Opcode調用序列模型等特征抽取方式,采用合適的模型,如樸素貝葉斯和深度學習的MLP、CNN等,實現Webshell的檢測。類似地,也可進行SQL注入、 XSS攻擊檢測等。

      5.安全漏洞與惡意代碼

      安全漏洞是指漏洞是在硬件、軟件、協議的具體實現或系統安全策略上存在的缺陷;惡意代碼是指具有安全威脅的代碼。除了現有的惡意軟件檢測與識別等AI應用,本部分將列舉“惡意代碼分類”與“系統自動化漏洞修補”兩例。

      代碼安全——惡意代碼分類

      早期反病毒軟件無論是特征碼掃描、查找廣譜特征、啟發式掃描,這三種查殺方式均沒有實際運行二進制文件,因此均可歸為惡意代碼靜態檢測的方法。隨著反惡意代碼技術的逐步發展,主動防御技術、云查殺技術已越來越多的被安全廠商使用,但惡意代碼靜態檢測的方法仍是效率最高,被運用最廣泛的惡意代碼查殺技術。

      2016年在Kaggle上微軟發起了一個惡意代碼分類比賽,冠軍隊采用了一種惡意代碼圖像繪制方法。將一個二進制文件轉換為一個矩陣(矩陣元素對應文件中的每一個字節,矩陣的大小可根據實際情況進行調整),該矩陣又可以非常方便的轉換為一張灰度圖。再基于N-gram,統計概率模型。最后代入分類決策樹與隨機森林進行訓練與測試。這個方法能夠發現一些靜態方法發現不了的變種,并且也可推廣應用到Android和IOS平臺的惡意代碼檢測中。

      漏洞修復——系統自動化漏洞修補

      2016年8月,DARPA在DEFCON黑客大會上舉辦Cyber Grand Challenge挑戰賽,要求參賽者在比賽中構建一套智能化的系統,不僅要檢測漏洞,還要能自動寫補丁、并且完成部署。當今的軟件漏洞平均發現周期長達312 天,發現后還需要對漏洞研究、開發補丁程序,到最后公布,在這期間,攻擊者很有可能已經利用這個漏洞發起網絡攻擊。因此系統自動化漏洞修復十分必要。

      2017年10月,MIT研究團隊研發了一個稱為“創世紀”的系統,能夠對以前的補丁進行自動學習,生成補丁模板,并對候選補丁進行評估。據研究者說,“創世紀是第一個自動推理補丁生成轉換或根據先前成功的補丁搜索候選補丁空間的系統”,它修復的 bug幾乎是最好的手編模板系統的兩倍,同時也更精確。這些模板是根據真實補丁的特定類型“訂制”而成,因此不會產生盡可能多的無用備選。

      6.入侵檢測與防御

      入侵檢測與防御是指對入侵行為的發現并采取相應的防御行動。除了現有的內網入侵檢測等AI應用,本部分將列舉“APT檢測與防范”與“C2鏈接分析”兩例。

      高級攻擊入侵檢測——APT檢測與防范

      進行APT攻擊的攻擊者從偵查目標,制作攻擊工具,傳遞攻擊工具,利用漏洞或者弱點來進行突防,拿下全線運行工具,后期遠端的維護這個工具,到最后達到了長期控制目標的目的。針對這種現在日益廣泛的APT 攻擊,威脅情報存在于整個攻擊的各個環節。

      威脅情報是基于證據的描述威脅的一組關聯的信息,包括威脅相關的環境信息,如具體的攻擊組織、惡意域名。惡意域名又包括遠控的IOC、惡意文件的HASH和URL以及威脅指標之間的關聯性,時間緯度上攻擊手法的變化。這些信息匯總在一起形成高級威脅情報。除此之外,所關注的情報,還包括傳統威脅種類的擴充,包括木馬遠控,僵尸網絡,間諜軟件, Web后門等。利用機器學習來處理威脅情報,檢測并識別出APT攻擊中的惡意載荷,提高APT攻擊威脅感知系統的效率與精確性,讓安全研究人員能更快實現 APT攻擊的發現和溯源。

      DGA域名檢測——C2鏈接分析

      DGA(域名生成算法)是一種利用隨機字符來生成C2域名,從而逃避域名黑名單檢測的技術手段。而有了DGA域名生成算法,攻擊者就可以利用它來生成用作域名的偽隨機字符串,這樣就可以有效的避開黑名單列表的檢測。偽隨機意味著字符串序列似乎是隨機的,但由于其結構可以預先確定,因此可以重復產生和復制。該算法常被運用于遠程控制軟件上。

      首先攻擊者運行算法并隨機選擇少量的域(可能只有一個),然后攻擊者將該域注冊并指向其C2服務器。在受害者端惡意軟件運行DGA并檢查輸出的域是否存在,如果檢測為該域已注冊,那么惡意軟件將選擇使用該域作為其命令和控制( C2)服務器。如果當前域檢測為未注冊,那么程序將繼續檢查其它域。因此,安全人員可以通過收集樣本以及對DGA進行逆向,來預測哪些域將來會被生成和預注冊并將它們列入黑名單中。

      二.基于機器學習的惡意代碼檢測

      1.傳統的惡意代碼檢測

      傳統的惡意代碼檢測包括基于簽名特征碼 ( signature )的檢測和基于啟發式規則(heuristic)的檢測,在應對數量繁多的未知惡意代碼時,正面臨越來越大的挑戰。

      (1) 基于簽名特征碼的檢測

      簽名特征碼檢測方法通過維護一個已知的惡意代碼庫,將待檢測代碼樣本的特征碼與惡意代碼庫中的特征碼進行比對,如果特征碼出現匹配,則樣本為惡意代碼。該方法需要耗費大量的人力、物力對惡意代碼進行研究并要求用戶及時更新惡意代碼庫,檢測效率和效果越來越力不從心,并且很難有效抵御未知惡意代碼。

      (2) 基于啟發式規則的檢測

      啟發式規則檢測方法通過專業的分析人員對現有的惡意代碼進行規則提取,并依照提取出的規則對代碼樣本進行檢測。但面對現階段惡意代碼爆炸式的增長趨勢,僅依賴人工進行惡意代碼分析,在實施上變得愈發困難。

      2.基于機器學習的惡意代碼檢測

      基于機器學習算法的防護技術為實現高準確率、自動化的未知惡意代碼檢測提供了行之有效的技術途徑,已逐漸成為業內研究的熱點。根據檢測過程中樣本數據采集角度的不同,可以將檢測分為:靜態分析與動態分析。

      靜態分析不運行待檢測程序,而是通過程序(如反匯編后的代碼)進行分析得到數據特征,而動態分析在虛擬機或仿真器中執行程序,并獲取程序執行過程中所產生的數據(如行為特征),進行檢測和判斷。

      根據 Cohen 對惡意代碼的研究結果,可知惡意代碼檢測的本質是一個分類問題,即把待檢測樣本區分成惡意或合法的程序。其核心步驟為:

      采集數量充分的惡意代碼樣本

      對樣本進行有效的數據處理,提取特征

      進一步選取用于分類的主要數據特征

      結合機器學習算法的訓練,建立分類模型

      通過訓練后的分類模型對未知樣本進行檢測

      3.機器學習在安全領域的特點及難點

      機器學習是個多元學科,其本質是在數據中進行學習,通過合適的算法建模,最終在無規則的情況下,實現分類、聚類或是預測。從第一部分的案例可以看出,機器學習在安全攻防最常應用于在于惡意代碼識別、社工安全防范,入侵攻擊檢測這三大方向。

      在惡意代碼識別方面:?區別傳統的黑白名單庫、特征檢測、啟發式等方法機器學習的安全應用從反病毒的代碼分類、惡意文件檢測、惡意URL的網頁代碼識別等

      在社工安全防范方面:?區別傳統的技術與業務經驗分析、安全宣傳、金融模型等評估方法,機器學習的安全應用從魚叉式網絡釣魚檢測,惡意用戶點擊流識別,欺詐電話與短信分析,到金融信用欺詐等

      在入侵攻擊檢測方面:?區別傳統的基于規則與策略、正則匹配等,機器學習的安全應用從DDoS防御,webshell檢測, DGA防范到APT檢測等等。

      總體上,即使機器學習在訓練模型后無法達到百分百的效果,但相比傳統手段,均有不同程度地檢測效果提升。

      雖然機器學習技術在安全領域已有諸多場景應用,為現有的用戶安全防護策略提供了新的視角。從上述的案例中不難看出,機器學習在安全與風控方面應用難點主要包括如:

      機器學習需要盡可能平衡的高質量數據集,而在安全領域,無論是風險欺詐、網絡釣魚、惡意軟件等,通常包含大量的正常樣本與極少量的安全隱患,因此惡意訪問、攻擊樣本的不充分,導致模型訓練后的檢測準確率有待提高。

      機器學習的模型一般均為黑盒分析,無法得到足夠的信息。不像其他AI應用(如商品推薦系統),在應用安全領域的模型分類錯誤具有極高的成本,并且在面對網絡威脅與隱患時,安全分析人員希望在網絡對抗中取得對形勢的了解與情報的掌握,以作出相應的人工干預。

      現階段所有需監督學習的機器學習模型,均需要輸入合理且高相關的特征集,即需要從源數據到特征空間映射的特征工程。在安全領域,會產生網絡監控到實際的檢測對象之間的抽象成本,如軟件缺陷與底層實現代碼與結構之間的對應關系有一個抽象、翻譯的難度。

      與此同時,機器學習作為新興的前沿技術,即使解決或克服傳統安全攻防技術的問題與難點,在一些場景與環境下,仍有無法避免的缺陷或者是即使解決了問題也無法滿足實際需求,即無法采用機器學習算法進行安全攻防的盲點。

      無法發現未知模式的惡意行為

      誤報大量測試異常的正常行為

      對數據數量與質量有強依賴性

      三.邏輯回歸識別網站惡意請求

      讀取正常請求和惡意請求數據集,預處理設置類標y和數據集x

      通過N-grams處理數據集,并構建TF-IDF特征矩陣,每個請求對應矩陣的一行數據

      數據集拆分為訓練數據和測試數據

      使用機器學習邏輯回歸算法對特征矩陣進行訓練,得出對應的模型

      使用訓練的模型對 未知URL請求進行檢測,判斷其是惡意請求或正常請求

      1.數據集

      在?https://github.com/foospidy/payloads?中收集了常見的網站惡意請求,如SQL注入、XSS攻擊等的Payload。實驗數據包括:

      正常請求:goodqueries.txt ,1265974條,來自http://secrepo.com網站日志請求

      惡意請求:badqueries.txt,44532條,XSS、SQL注入等攻擊的payload

      注意,資源和精力有限,數據集假定http://secrepo.com網站的日志請求全部都是正常的請求,有精力可以進行降噪處理,去除異常的標簽數據。

      該部分的核心代碼為:

      import os import urllib # 獲取文本中的請求列表 def get_query_list(filename): directory = str(os.getcwd()) print(directory) filepath = directory + "/" + filename data = open(filepath, 'r', encoding='UTF-8').readlines() query_list = [] for d in data: # 解碼 d = str(urllib.parse.unquote(d)) #converting url encoded data to simple string #print(d) query_list.append(d) return list(set(query_list)) # 主函數 if __name__ == '__main__': # 獲取正常請求 good_query_list = get_query_list('goodqueries.txt') print(u"正常請求: ", len(good_query_list)) for i in range(0, 5): print(good_query_list[i].strip('\n')) print("\n") # 獲取惡意請求 bad_query_list = get_query_list('badqueries.txt') print(u"惡意請求: ", len(bad_query_list)) for i in range(0, 5): print(bad_query_list[i].strip('\n')) print("\n") # 預處理 good_y標記為0 bad_y標記為1 good_y = [0 for i in range(0, len(good_query_list))] print(good_y[:5]) bad_y = [1 for i in range(0, len(bad_query_list))] print(bad_y[:5]) queries = bad_query_list + good_query_list y = bad_y + good_y

      2.N-grams和TF-IDF結合構造特征矩陣

      [python] 使用scikit-learn工具計算文本TF-IDF值

      TF-IDF(Term Frequency-InversDocument Frequency)是一種常用于信息處理和數據挖掘的加權技術。該技術采用一種統計方法,根據字詞的在文本中出現的次數和在整個語料中出現的文檔頻率來計算一個字詞在整個語料中的重要程度。它的優點是能過濾掉一些常見的卻無關緊要本的詞語,同時保留影響整個文本的重要字詞。計算方法如下面公式所示。

      其中,式中tfidf表示詞頻tf和倒文本詞頻idf的乘積。TF-IDF值越大表示該特征詞對這個文本的重要性越大。其基本思想是將文本轉換為特征矩陣,并且降低常用詞(如we、all、www等)的權重,從而更好地表達一個文本的價值。如下圖示例:

      # coding:utf-8 from sklearn.feature_extraction.text import CountVectorizer #語料 corpus = [ 'This is the first document.', 'This is the second second document.', 'And the third one.', 'Is this the first document?', ] #將文本中的詞語轉換為詞頻矩陣 vectorizer = CountVectorizer() #計算個詞語出現的次數 X = vectorizer.fit_transform(corpus) #獲取詞袋中所有文本關鍵詞 word = vectorizer.get_feature_names() print word #查看詞頻結果 print X.toarray() from sklearn.feature_extraction.text import TfidfTransformer #類調用 transformer = TfidfTransformer() print transformer #將詞頻矩陣X統計成TF-IDF值 tfidf = transformer.fit_transform(X) #查看數據結構 tfidf[i][j]表示i類文本中的tf-idf權重 print tfidf.toarray()

      無論是惡意請求數據集還是正常請求數據集,都是不定長的字符串列表,很難直接用邏輯回歸算法對這些不規律的數據進行處理,需要找到這些文本的數字特征,用來訓練我們的檢測模型。在這里,使用TD-IDF來作為文本的特征,并以數字矩陣的形式進行輸出。在計算TD-IDF之前,首先需要對每個文檔(URL請求)的內容進行分詞處理,也就是需要定義文檔的詞條長度,這里我們選擇長度為3的N-grams,可以根據模型的準確度對這個參數進行調整。

      該部分的核心代碼如下,詳見注釋:

      from sklearn.linear_model import LogisticRegression from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split # tokenizer function, this will make 3 grams of each query # www.foo.com/1 轉換為 ['www','ww.','w.f','.fo','foo','oo.','o.c','.co','com','om/','m/1'] def get_ngrams(query): tempQuery = str(query) ngrams = [] for i in range(0, len(tempQuery)-3): ngrams.append(tempQuery[i:i+3]) return ngrams # 主函數 if __name__ == '__main__': .... # 定義矢量化 converting data to vectors # TfidfTransformer + CountVectorizer = TfidfVectorizer vectorizer = TfidfVectorizer(tokenizer=get_ngrams) # 把不規律的文本字符串列表轉換成規律的 ( [i,j], tdidf值) 的矩陣X # 用于下一步訓練邏輯回歸分類器 X = vectorizer.fit_transform(queries) print(X.shape)

      3.訓練模型

      通過構建的特征矩陣作為訓練集,調用邏輯回歸進行訓練和測試,Python中機器學習兩個核心函數為fit()和predict()。這里,調用train_test_split()函數將數據集隨機劃分,核心代碼如下所示:

      from sklearn.linear_model import LogisticRegression from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split # 主函數 if __name__ == '__main__': .... # 使用 train_test_split 分割 X y 列表 # X_train矩陣的數目對應 y_train列表的數目(一一對應) -->> 用來訓練模型 # X_test矩陣的數目對應 (一一對應) -->> 用來測試模型的準確性 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=20, random_state=42) # 定理邏輯回歸方法模型 LR = LogisticRegression() # 訓練模型 LR.fit(X_train, y_train) # 使用測試值 對 模型的準確度進行計算 print('模型的準確度:{}'.format(LR.score(X_test, y_test))) print("\n")

      4.檢測新數據集是惡意請求還是正常請求

      模型訓練好之后,發現其精確度挺高的,真實的實驗還需要通過準確率、召回率和F值判斷。接下來調用Predict()函數對新的RUL進行判斷,檢測其是惡意請求還是正常請求

      。核心代碼如下:

      from sklearn.linear_model import LogisticRegression from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split # 主函數 if __name__ == '__main__': .... # 對新的請求列表進行預測 new_queries = ['www.foo.com/id=1', 'www.foo.com/name=admin\' or 1=1','abc.com/admin.php', '">', 'test/q=', '/jhot.php?rev=2 |less /etc/passwd'] # 矩陣轉換 X_predict = vectorizer.transform(new_queries) res = LR.predict(X_predict) res_list = [] # 結果輸出 for q,r in zip(new_queries, res): tmp = '正常請求' if r == 0 else '惡意請求' q_entity = html.escape(q) res_list.append({'url':q_entity,'res':tmp}) for n in res_list: print(n)

      最終輸出結果如下圖所示,可以發現其判斷較為準確。

      5.完整代碼

      https://github.com/eastmountyxz/NetworkSecuritySelf-study

      # coding: utf-8 import os import urllib import time import html from sklearn.linear_model import LogisticRegression from sklearn.feature_extraction.text import TfidfVectorizer from sklearn.model_selection import train_test_split # 獲取文本中的請求列表 def get_query_list(filename): directory = str(os.getcwd()) print(directory) filepath = directory + "/" + filename data = open(filepath, 'r', encoding='UTF-8').readlines() query_list = [] for d in data: # 解碼 d = str(urllib.parse.unquote(d)) #converting url encoded data to simple string #print(d) query_list.append(d) return list(set(query_list)) # tokenizer function, this will make 3 grams of each query # www.foo.com/1 轉換為 ['www','ww.','w.f','.fo','foo','oo.','o.c','.co','com','om/','m/1'] def get_ngrams(query): tempQuery = str(query) ngrams = [] for i in range(0, len(tempQuery)-3): ngrams.append(tempQuery[i:i+3]) return ngrams # 主函數 if __name__ == '__main__': # 獲取正常請求 good_query_list = get_query_list('goodqueries.txt') print(u"正常請求: ", len(good_query_list)) for i in range(0, 5): print(good_query_list[i].strip('\n')) print("\n") # 獲取惡意請求 bad_query_list = get_query_list('badqueries.txt') print(u"惡意請求: ", len(bad_query_list)) for i in range(0, 5): print(bad_query_list[i].strip('\n')) print("\n") # 預處理 good_y標記為0 bad_y標記為1 good_y = [0 for i in range(0, len(good_query_list))] print(good_y[:5]) bad_y = [1 for i in range(0, len(bad_query_list))] print(bad_y[:5]) queries = bad_query_list + good_query_list y = bad_y + good_y # 定義矢量化 converting data to vectors # TfidfTransformer + CountVectorizer = TfidfVectorizer vectorizer = TfidfVectorizer(tokenizer=get_ngrams) # 把不規律的文本字符串列表轉換成規律的 ( [i,j], tdidf值) 的矩陣X # 用于下一步訓練邏輯回歸分類器 X = vectorizer.fit_transform(queries) print(X.shape) # 使用 train_test_split 分割 X y 列表 # X_train矩陣的數目對應 y_train列表的數目(一一對應) -->> 用來訓練模型 # X_test矩陣的數目對應 (一一對應) -->> 用來測試模型的準確性 X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=20, random_state=42) # 定理邏輯回歸方法模型 LR = LogisticRegression() # 訓練模型 LR.fit(X_train, y_train) # 使用測試值 對 模型的準確度進行計算 print('模型的準確度:{}'.format(LR.score(X_test, y_test))) print("\n") # 對新的請求列表進行預測 new_queries = ['www.foo.com/id=1', 'www.foo.com/name=admin\' or 1=1','abc.com/admin.php', '">', 'test/q=', '/jhot.php?rev=2 |less /etc/passwd'] # 矩陣轉換 X_predict = vectorizer.transform(new_queries) res = LR.predict(X_predict) res_list = [] # 結果輸出 for q,r in zip(new_queries, res): tmp = '正常請求' if r == 0 else '惡意請求' q_entity = html.escape(q) res_list.append({'url':q_entity,'res':tmp}) for n in res_list: print(n)

      四.總結

      獨在異鄉為異客,每逢佳節倍思親。

      2022年加油,感恩能與大家在華為云遇見!

      希望能與大家一起在華為云社區共同成長。原文地址:https://blog.csdn.net/Eastmount/article/details/120385407

      (By:娜璋之家 Eastmount 2022-02-22 夜于武漢)

      該篇文章參考了以下文獻,非常推薦大家閱讀這些大牛的文章和視頻:

      機器學習在安全攻防場景的應用與分析 - 騰訊云FreeBuf官方

      入侵某網站引發的安全防御思考 - 騰訊云“我是小三”大神

      用機器學習玩轉惡意URL檢測 - 騰訊云FreeBuf官方

      https://github.com/exp-db/AI-Driven-WAF

      https://github.com/foospidy/payloads

      http://www.secrepo.com/

      https://github.com/eastmountyxz

      張思思, 左信, 劉建偉. 深度學習中的對抗樣本問題[J]. 計算機學報,2019(8).

      http://fsecurify.com/fwaf-machine-learning-driven-web-application-firewall/

      黑產用“未來武器”破解驗證碼,打碼小工都哭了 - FreeBuf

      [轉載] 機器學習科普文章:“一文讀懂機器學習,大數據/自然語言處理/算法全有了”

      AI 機器學習

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:怎么制作Excel表格的半圓圓環圖
      下一篇:測試大咖漫談測試人職業發展
      相關文章
      亚洲乱理伦片在线观看中字| 亚洲精品蜜桃久久久久久| 亚洲av日韩综合一区久热| 亚洲黄色三级视频| 亚洲天堂一区二区| 亚洲免费视频网站| 亚洲AV无码专区国产乱码电影| 亚洲精品自在在线观看| 亚洲精品亚洲人成在线观看| 国产亚洲精品高清在线| 中国亚洲女人69内射少妇| 永久亚洲成a人片777777| 在线观看亚洲精品国产| 美腿丝袜亚洲综合| 亚洲午夜久久久久久久久久| 亚洲日本乱码在线观看| 国产亚洲大尺度无码无码专线| 亚洲综合色自拍一区| 亚洲色中文字幕无码AV| 亚洲色WWW成人永久网址| 久久亚洲精品中文字幕三区| 日本亚洲视频在线| 亚洲精品无码不卡| 亚洲图片校园春色| 99热亚洲色精品国产88| 亚洲精品色播一区二区| 亚洲欧美在线x视频| 亚洲熟女乱综合一区二区| 国产亚洲情侣一区二区无码AV| 亚洲午夜福利在线观看| 婷婷久久久亚洲欧洲日产国码AV| 亚洲AV日韩AV天堂久久| 亚洲av无码成人黄网站在线观看 | 亚洲人成色777777在线观看| 精品亚洲综合在线第一区| 亚洲国产精品线在线观看| 亚洲导航深夜福利| 亚洲日韩AV一区二区三区四区| 亚洲AV无码成人精品区日韩 | 亚洲av片一区二区三区| 亚洲狠狠爱综合影院婷婷|