• 
    

    
    

      99热精品在线国产_美女午夜性视频免费_国产精品国产高清国产av_av欧美777_自拍偷自拍亚洲精品老妇_亚洲熟女精品中文字幕_www日本黄色视频网_国产精品野战在线观看

      ?

      基于污點分析的PHP漏洞檢測

      2019-04-12 01:46:38曹凱何晶范文慶黃瑋
      關鍵詞:基本塊污點數據流

      曹凱,何晶,范文慶,黃瑋

      (中國傳媒大學 理工學部,北京 100024)

      1 引言

      PHP語言在網站服務端使用廣泛,但由于固有的脆弱性,在編程過程中易產生各種漏洞。其中較為常見的有SQL注入漏洞和跨站腳本漏洞。根據OWASP(Open Web Appliation Security)[1]2017年最新公布的數據顯示,在排名前十的Web應用安全漏洞中,注入類攻擊排名第一位,跨站腳本攻擊排名第三位。這兩種漏洞的成因主要是對用戶輸入數據的有效性未能進行合理驗證,因此這種類型的漏洞又被稱為污染數據傳播漏洞,也可稱為污點型漏洞。本文對PHP漏洞檢測主要也是針對于SQL注入漏洞和跨站腳本漏洞。

      對于Web漏洞的分析,開發(fā)人員通常會采用兩種分析方法。即動態(tài)分析和靜態(tài)分析。動態(tài)分析使用較為容易,用于發(fā)現程序運行時出現的錯誤。而靜態(tài)分析的檢測,則不需要代碼的運行。隨著技術的不斷進步,更高效的算法被研究出來,靜態(tài)分析方法也變得越來越成熟。

      目前業(yè)界PHP靜態(tài)分析工具有:Pixy,RIPS,PHP-Sat,WAP及Foritfy SCA等。Pixy[2]是使用Java語言開發(fā)的一款開源的PHP靜態(tài)檢測工具。其通過數據流分析的方法檢測漏洞,其機制非常有效,但Pixy只支持PHP4的語法,對于PHP5以后的語法特性并不支持,而且主要針對的漏洞為跨站腳本漏洞,對于其他漏洞檢測效果并不理想。RIPS[3]是用PHP語言開發(fā)的一款檢測PHP的工具,是基于token流的靜態(tài)分析工具。它通過PHP的內置函數token_get_all()來對PHP代碼進行詞法分析從而獲得token,然后進一步將代碼轉換為便于分析的中間格式,進而采用污點分析方法檢測漏洞。WAP[4],全稱Web Application Protection,是一款采用Java語言編寫的PHP漏洞檢測工具,該工具采用污點分析的方法分析源碼,優(yōu)點是可以自動化修補被確認的漏洞。Balzarotti[5]等人結合字符串分析方法,基于Pixy工具實現了一種動靜結合的PHP代碼分析方法。Rimsa[6]等人使用e-SSA作為中間表示形式,以此對PHP進行污點分析。Y.Zheng和X.Zhang[7]提出了路徑和上下文相關的過程間分析方法來檢測漏洞。但以上工具仍存在一些問題,比如中間表示形式不夠完備,導致丟失了很多重要信息;對文件包含處理不夠完善;對新版本的PHP語法特性不能完全兼容;漏報和誤報相對較高。

      本文在總結前人的經驗的基礎上,采用PHP-Parser對PHP代碼進行語法和詞法分析,可以兼容最新的和應用更為廣泛的PHP5和PHP7的新特性,產生信息非常完整的抽象語法樹,然后構建控制流圖,再在生成的控制流圖上進行污點傳播分析,進而檢測出可能存在的漏洞。通過測試,采用本文方法確實可以檢測出相應漏洞。

      2 詞法和語法分析

      為了進行污點分析,PHP源碼必須被轉換為一種利于分析的中間表示形式,本文采用控制流圖(Control Flow Graph,CFG)作為中間表示形式,但CFG的生成依賴于抽象語法樹(Abstract Syntax Tree,AST),抽象語法樹反映了程序的結構,因此需要先對PHP源碼進行詞法和語法分析來生成抽象語法樹。

      對于生成抽象語法樹的方式有多種。有的采用HHVM[8],一種用來執(zhí)行PHP語言的PHP虛擬機來生成抽象語法樹;有的基于ANTLR[9],一款根據輸入自動生成語法樹的語法解析器。本文對PHP的詞法和語法分析采用PHP語法處理器PHP-Parser[10],PHP-Parser是一個由PHP編寫的支持PHP5.2到PHP7.1的語法解析器。主要用來產生抽象語法樹,對于PHP代碼的靜態(tài)分析具有很大的幫助。例如,將以下代碼傳遞給解析器:

      echo 'Hi','World';

      ?>

      將會產生一個數組格式的抽象語法樹:

      array(

      0:Stmt_Echo(

      exprs:array(

      0:Scalar_String(

      value:Hi

      )

      1:Scalar_String(

      value:World

      )

      )

      )

      以上輸出的抽象語法樹包含一個輸出語句節(jié)點,節(jié)點內包含一個數組,數組內容為兩個常量字符串。 PHP的語法繁多,大概包含140種不同的節(jié)點,為了便于解析將其分為以下幾類:

      (1)PHPParserNodeStmt,即語句節(jié)點。沒有任何返回值的結構,如賦值語句,函數定義等。

      (2)PHPParserNodeExpr,即表達式節(jié)點。有返回值的結構,如單個變量,函數調用等。

      (3)PHPParserNodeScalar,即常量節(jié)點。用來表示任何常量,如字符串,整型,常量表達式等。

      (4)還包括一些不屬于以上三種類型的節(jié)點,如參數節(jié)點等。

      3 控制流圖生成算法

      當獲得PHP源代碼后,首先使用PHP-Parser將源碼轉換為一個數組形式抽象語法樹,若直接進行數據流分析,由于編程語言中會有分支、循環(huán)、跳轉以及條件表達式等結構,當中隱含了不連續(xù)的控制流,所以抽象語法樹與數據流分析并不能完全兼容。因此本文將抽象語法樹轉換為控制流圖,然后再進行污點分析。

      成果表包括界樁登記表、三交點界樁登記表、界樁成果表、界址點成果表、三交點成果表和界線協(xié)議書附圖備考表。參考1998年陜西省各鄉(xiāng)鎮(zhèn)聯(lián)合勘界相關成果,對邊界線上的界線名稱、邊界點名稱、編號、坐標及行政歸屬等內容形成不同制式表格模板,方便信息錄入、管理與查詢。

      本文通過遞歸的方法來構造CFG。首先遍歷AST中的所有節(jié)點,將節(jié)點集合作為輸入,遍歷過程中對集合中的節(jié)點進行判斷處理,比如是否為跳轉,分支,結束等語句,要按照節(jié)點的類型來構造CFG。此處如果遇到循環(huán)語句和分支語句的跳轉條件,則將其存儲在CFG的邊上,以便后續(xù)的數據流處理。本文中對于CFG邊的處理要包含以下信息:邊的來源,邊的目的,邊上攜帶的條件,邊上攜帶的凈化信息和編碼信息。此外對于部分節(jié)點還要生成基本塊摘要,以便在后續(xù)污點分析中使用。基本塊摘要中包含一些關鍵信息(主要包含常量,全局變量,返回值,全局變量的注冊以及數據流信息等)。

      具體的CFG生成算法如下:

      1.首先創(chuàng)建一個輸入基本塊,并為其構造一個輸出邊,連接到當前基本塊,并作為當前基本塊的輸入邊。

      2.獲取AST中的節(jié)點,若是只有一個節(jié)點,則將其加入基本塊,生成相應的基本塊摘要。如果包含多個節(jié)點,則對其進行遍歷處理。

      3.如果遇到函數定義類型節(jié)點類型則不對其進行分析。

      4.如果節(jié)點是跳轉類型的語句,則生成當前基本塊摘要,并對每個分支建立其對應的基本塊。首先創(chuàng)建一個新的基本塊,然后獲取分支節(jié)點進行遍歷處理,通過遞歸處理構造分支節(jié)點的CFG。并以新基本塊作為當前基本塊。

      5.如果節(jié)點類型是循環(huán)語句,則加入循環(huán)體構建基本塊摘要。首先將循環(huán)條件加入到基本塊中,接下來處理循環(huán)體,創(chuàng)建新的基本塊,然后遞歸處理構造CFG。并以新基本塊作為當前基本塊。

      6.如果節(jié)點是return語句,則將節(jié)點加入當前基本塊,并構造基本塊摘要,返回當前基本塊。

      7.如果節(jié)點是結束語句,則跳出循環(huán),構造基本塊摘要。

      8.如果節(jié)點是其他類型的語句,則統(tǒng)一處理,將節(jié)點加入當前基本塊。

      9.如果當前基本塊不是結束語句,則為當前基本塊構造一條輸出邊,作為下一基本塊的輸入邊,直至遍歷完所有節(jié)點后,構造一個輸出基本塊。

      運用該算法生成CFG控制流圖,將AST生成便于數據流分析的中間表示,用于后續(xù)的污點分析。

      4 污點分析過程

      污點分析是數據流分析技術的一種實踐方法,在過去的幾十年中數據流分析技術一直是信息安全領域的重要研究方向,其中有大量的工作研究制定數據流策略。

      本文的污點分析是始于生成CFG的過程中。如果在生成CFG時發(fā)現了敏感函數的調用,則獲取其中包含的危險參數,通過變量回溯的方法進行向上追蹤,判斷該參數是否來源于污點源中,并追蹤其是否經過了凈化處理來判斷是否會產生漏洞。

      4.1 識別污點源和污點匯聚點

      污點源source,代表系統(tǒng)直接引入不可信的數據,多數時候是由用戶輸入獲得的,用戶的直接輸入可以由超全局變量獲取,超全局變量包括$_GET、$_POST、$_COOKIE等。當程序的敏感函數獲取了用戶輸入的不可信的數據,就可能會導致污點型漏洞的出現。

      污點匯聚點表示產生安全敏感操作或者泄露隱私數據到外界,也就是漏洞最終被利用的結果。如XSS漏洞泄漏了COOKIE,SQL注入漏洞泄露了數據庫信息等。這些信息泄漏往往都是由于一些敏感函數的操作引起的,因此要對PHP敏感函數進行建模,敏感函數是導致漏洞的關鍵之處。本文針對PHP的漏洞檢測所設置的污點匯聚點即是一些可能導致漏洞的敏感函數。其中跨站腳本漏洞的敏感函數點有‘echo’,‘print’,‘print_r’,‘exit’,‘die’,‘printf’,‘vprintf’等。SQL語句執(zhí)行函數點包含‘dba_open’,‘odbc_do’,‘fbsql_query’,‘mysql_query’,‘pg_query’,‘sqlite_query’等,本文共統(tǒng)計并配置了五十余個函數,在此不一一贅述。

      此外,在PHP代碼審計過程中,若是發(fā)現了可控的危險參數,我們會立即去查看開發(fā)者是否對該變量進行了有效的處理,如過濾、轉義或者編碼等。如果沒有處理,我們認為該處存在漏洞,如果經過了有效處理,則認為該處是安全的。在本文的靜態(tài)檢測方法中,也是遵循上述思路。為了降低系統(tǒng)的誤報率,在設計過程中除了污點源和污點匯聚點外,我們還統(tǒng)計并配置了PHP中的安全函數。本文對PHP內置的安全函數進行了歸類,如防止XSS的函數htmlspecialchars等,防止SQL注入的函數addslashes等。此外還有一些通用的防止漏洞的函數如intval等。如果危險參數在污點分析的過程中經過了安全的函數處理,就被視為經過了有效的凈化。

      4.2 文件包含處理

      采用PHP語言編寫的各種應用程序中,其源代碼會分成許多的源文件,程序運行時,通過文件包含方法來組合這些源文件。PHP的文件包含方式主要通過以下四個函數實現:include();require();include_once();require_once()。使用上述函數包含其他文件時,會獲取到指定文件中包含的文本,代碼和標記等,并會復制到使用include或require的文件中,包含的文件會作為PHP代碼運行。因此在進行數據流分析的時候我們要考慮到文件包含的問題,進行多文件間的處理。我們在進行多文件間分析之前還要收集文件的信息生成文件摘要,文件摘要主要包含賦值語句的信息,以及相關的凈化和編碼信息等數據流信息。

      本文對于文件包含處理的大致思路如下:

      1.首先獲取當前文件包含的所有文件名,獲取其路徑。

      2.遍歷包含的這些文件的文件摘要,檢測是否有相關的數據流信息,如果有獲取其變量名。

      3.判斷該變量是否是污點變量。

      4.以此文件為當前文件,繼續(xù)進行文件包含的處理。

      4.3 污點分析流程

      本文的污點分析流程如圖1所示,若在程序分析的過程中發(fā)現了敏感函數的調用,即通過回溯方法獲得危險參數節(jié)點,由此進行污點分析。簡單來說,就是判斷該危險參數是否會導致觸發(fā)漏洞。獲得危險參數后,分析整體步驟如下:

      圖1 污點分析流程

      1.首先檢查該危險參數在當前基本塊中的賦值情況,查詢數據流信息中右節(jié)點是否有用戶的輸入的污點源,例如$_GET,$_POST等超全局變量。然后通過判斷不同類型漏洞的插件類確認該節(jié)點是否安全。

      2.若在當前基本塊中未能檢測到用戶輸入源,則進行多基本塊之間的分析。首先對當前基本塊的前驅基本塊進行查找,在獲取了前驅基本塊后開始危險變量的分析。同步驟1),判斷危險參數是否經過了凈化處理,并判斷其是否來源于污點源,如果是則報告漏洞。若當前基本塊沒有前驅基本塊,則結束算法。

      3.若在上述基本塊間分析過程中未能發(fā)現漏洞,則進入多文件間分析。獲取當前基本塊之前的文件摘要的集合,然后對這些文件摘要進行遍歷,并由此做出判斷。

      4.在執(zhí)行以上過程中,若發(fā)現漏洞,則通過漏洞報告模塊報告漏洞。若沒有發(fā)現漏洞,則系統(tǒng)繼續(xù)往下分析代碼。

      5 測試與評估

      本文的測試集采用DVWA(Damm Vulnerable Web App)[11],DVWA是基于PHP和MySQL開發(fā)的Web應用程序,是一個漏洞實驗平臺,包含SQL注入,跨站腳本等,其漏洞數量是確定的,所以可以精準的確定誤報和漏報。本文專對包含SQL注入和跨站腳本的12個程序進行檢測,共分為三組,一組包含XSS漏洞,一組包含普通的SQL注入漏洞,一組包含SQL盲注類型的漏洞,每組四個程序,根據安全防護級別不同將其分為low、medium、high、impossible四個等級,其中l(wèi)ow防護級別最低,medium次之,high防護級別較高但仍包含漏洞,impossible防護級別最高,不包含漏洞。實際檢測效果如表1所示,其中Y代表檢出漏洞,N代表未檢出漏洞。

      表1 實驗結果

      從上述結果可以看出,本文設計的工具對于SQL注入類型的漏洞檢測效果較好,在包含SQL注入的8個文件中檢測出6個確定的漏洞。但是對于XSS漏洞只檢測出一個,產生了兩個漏報。根據分析,對于Medium程序中使用了str_replace()函數直接將獲得的

      米泉市| 英吉沙县| 肥西县| 井陉县| 昌黎县| 文安县| 冷水江市| 出国| 哈尔滨市| 定南县| 中宁县| 伊金霍洛旗| 石渠县| 肃北| 衡南县| 景洪市| 长乐市| 应城市| 神池县| 昆明市| 赫章县| 龙里县| 合江县| 桃江县| 龙山县| 渝中区| 乌鲁木齐市| 乌兰察布市| 连城县| 湄潭县| 隆子县| 阳东县| 桃园县| 贵阳市| 镇平县| 荣昌县| 博湖县| 阜南县| 宿迁市| 子长县| 仁怀市|