PHP語言代碼漏洞審計技巧筆記分享

PHP代碼審計,安全漏洞挖掘簡要記錄


1 全局變量


    PHP中的許多預定義變量都是“超全局的”,這意味着它們在一個腳本的全部作用域中
    都可用。在函數或方法中無需執行 global $variable; 就可以訪問它們。
    超全局變量都如下:

    $GLOBALS
        $GLOBALS 超級全局變量數組可以認爲是超級全局變量的超集,包含全局作用域
        內的所有變量。$GLOBALS這種全局變量用於在PHP腳本中的任意位置訪問全局變
        量(從函數或方法中均可),PHP在名爲$GLOBALS[index] 的數組中存儲了所有
        全局變量。變量的名字就是數組的鍵。執行下面的代碼可以查看$GLOBALS中所有
        的變量。
        print ' <pre>' ;
        print_r ($GLOBALS);
        print ' </pre>' ;

    $_SERVER
        $_SERVER 這種超全局變量保存關於報頭、路徑和腳本位置的信息。比如:
        $_SERVER['PHP_SELF']     返回當前執行腳本的文件名。
        $_SERVER['GATEWAY_INTERFACE']     返回服務器使用的 CGI 規範的版本。
        $_SERVER['SERVER_ADDR']     返回當前運行腳本所在的服務器的 IP 地址。
        $_SERVER['SERVER_NAME'] 返回當前運行腳本所在的服務器的主機名(比如 www.xxx.com)。
        $_SERVER['SERVER_SOFTWARE']     返回服務器標識字符串(比如 Apache/2.2.24)。
        $_SERVER['SERVER_PROTOCOL'] 返回請求頁面時通信協議的名稱和版本(例如,“HTTP/1.0”)。
        $_SERVER['REQUEST_METHOD']     返回訪問頁面使用的請求方法(例如 POST)。

    $_GET
        $_GET 也可用於收集提交 HTML 表單 (method="get") 之後的表單數據。
        $_GET 也可以收集 URL 中的發送的數據。

    $_POST
        $_POST 廣泛用於收集提交 method="post" 的 HTML 表單後的表單數據。
        $_POST 也常用於傳遞變量。

    $_FILES
        $_FILES超級全局變量包含通過POST方法向服務器上傳的數據的有關信息。

    $_COOKIE
        $_COOKIE超級全局變量存儲了通過HTTP cookie傳遞到腳本的信息。

    $_SESSION
        $_SESSION 超級全局變量包含與所有會話有關的信息。註冊會話信息能爲
        你提供便利,這樣就能在整個網站中引用這些會話信息,而無需通過GET
        或POST顯示的傳遞數據。

    $_REQUEST
        $_REQUEST 用於收集 HTML 表單提交的數據。

    $_ENV
        $_ENV超級全局變量提供PHP解析所在服務器環境的有關信息。此數組中的變
        量包括:
        $_ENV[ 'HOSTNAME' ]  服務器的主機名
        $_ENV[ 'SHELL' ]  系統 shell

    regeister_globals=off

        register_globals 是php中的一個控制選項,可以設置成off或者on ,默認爲off
        決定是否將 EGPCS(Environment,GET,POST,Cookie,Server)變量註冊爲全局變量。

        如果 register_globals打開的話, 客戶端提交的數據中含有GLOBALS變量名,就會覆蓋服務器上的

        $GLOBALS變量.所以這段代碼, 就是判斷, 如果提交的數據中有GLOBALS變量名, 就終止程序。

        由此引起的安全問題成爲PHP的“自動全局變量漏洞”,所以我們要堅決把register_globals關掉。

        並且使用 $_GET, $_POST, $_COOKIE 而非 $_REQUEST 。


    gpc[$_GET,$_POST,$_COOKIE]

        magic_quotes_gpc函數在php中的作用是判斷解析用戶提示的數據,如包括有:
        post、get、cookie過來的數據增加轉義字符“\”,以確保這些數據不會引起程
        序,特別是數據庫語句因爲特殊字符引起的污染而出現致命的錯誤

2 危險函數


    extract()
        extract(array,extract_rules,prefix)
        extract函數用來將一個數字分解成多個變量直接使用。PHP extract() 函數從
        數組中把變量導入到當前的符號表中。對於數組中的每個元素,鍵名用於變量
        名,鍵值用於變量值。第二個參數type用於指定當某個變量已經存在,而數組

        中又有同名元素時,extract() 函數如何對待這樣的衝突。EXTR_OVERWRITE 默認。

        如果有衝突,則覆蓋已有的變量。

        如何防止這種漏洞,可以在使用的時候加上參數EXTR_SKIP,這個參數表示如果有
        衝突,不覆蓋已有的變量或者還有EXTR_PREFIX_SAME - 如果有衝突,在變量名

        前加上前綴 prefix。


    parse_str()
        parse_str() 函數把查詢字符串解析到變量中,主要用於頁面之間傳值,參數。

        它在註冊之前不進行驗證當前變量是否已經存在,因此將會出現變量覆蓋漏洞。


    import_request_variables()
        import_request_variables 函數可以在register_global = off 時,把 GET/POST/
        Cookie變量導入全局作用域中。不管當前變量是否已經存在,因此可能出現變量

        覆蓋漏洞。


    stripslashes()
        stripslashes() 函數刪除由 addslashes() 函數添加的反斜槓。

        函數可用於清理從數據庫中或者從 HTML 表單中取回的數據。


    iconv()/mb_convert_encoding()
        這兩個函數都能夠完成各種字符集間的轉換,是php編程中不可缺少的基礎函數庫。

        編碼轉換之後,如果還有沒有過濾的字符可能會存在注入,執行,泄露等漏洞。


    magic_quotes_gpc=on
        PHP中一個特殊的函數魔術函數,它在引用的過程中只有在傳遞$_GET,$_POST,
        $_COOKIE時纔會發生作用。可以不對輸入和輸出數據庫的字符串數據作
        addslashes()和stripslashes()的操作,數據也會正常顯示。
        如果此時你對輸入的數據作了addslashes()處理,

        那麼在輸出的時候就必須使用stripslashes()去掉多餘的反斜槓。


    magic_quotes_gpc=off
        必須使用addslashes()對輸入數據進行處理,但並不需要使用stripslashes()
        格式化輸出.因爲addslashes函數並未將反斜槓一起寫入數據庫,只是幫助

        mysql完成了sql語句的執行。


    eval()
        val() 函數把字符串按照 PHP 代碼來計算。
        該字符串必須是合法的 PHP 代碼,且必須以分號結尾。
        如果沒有在代碼字符串中調用 return 語句,則返回 NULL。

        如果代碼中存在解析錯誤,則 eval() 函數返回 false。


    preg_replace()
        該函數代碼執行,需要參數/e函數主要用於處理字符串,因此出現最多的漏洞就是

        在字符串處理中。參數過濾不嚴容易出現漏洞。


    assert()

        函數本身就是把字符串參數當做代碼動態解析執行。參數過濾不嚴容易出現漏洞。


    call_user_func()
        該函數的功能是調用函數,多用於框架裏面調用函數。所以小的程序

        出現的機率小,大框架程序出現的多一些。參數過濾不嚴容易出現漏洞。


    call_user_func_array()

        函數本身就是把字符串參數當做代碼動態解析執行。參數過濾不嚴容易出現漏洞。


    create_function()
        在php中,函數create_function主要用來創建匿名函數,有時候匿名函數可以發揮它
        的作用。如果沒有嚴格對參數傳遞進行過濾,攻擊者可以構造特殊字符串傳遞給

        create_function()執行任意命令。


    session_destroy()
        刪除當前用戶對應的session文件以及釋放sessionid,內存中的$_SESSION變量內容
        依然保留。session的生命週期從用戶連上服務器後開始,在用戶關掉瀏覽器或是

        註銷時用戶session_destroy函數刪除session數據時結束。主要預防session劫持漏洞。


    rand() vs mt_rand()

        rand() 函數默認使用 libc隨機數發生器。在某些平臺下(例如 Windows)RAND_MAX只有 32768。

        如果需要的範圍大於 32768,那麼指定 min 和 max 參數就可以生成大於 RAND_MAX 的數了,或者

        考慮用 mt_rand() 來替代它。mt_rand()函數是非正式用來替換它的。該函數用了Mersenne Twister

        中已知的特性作爲隨機數發生器,mt_rand() 可以產生隨機數值的平均速度比 libc 提供的 rand() 快四倍。


    unset()
        PHP unset()函數是用來銷燬變量的,但很多時候,這個函數只把變量給銷燬了,
        內存中存放的該變量的值仍然沒有銷燬,也就是沒能達到我們想要的釋放內存
        的效果。可以用$變量=null 的方法來釋放其內存 或者 將兩個變量都 unset();

3 數據檢查


    命令參數

        對於用戶可能存在的命令執行代碼或者函數進行參數檢查,嚴格過濾。


    配置文件

        檢查php環境搭建時候的相關配置文件是否正確和安全,清理刪除。


    數據索引

        數據範圍是否越界,代碼安全編寫校驗。


    環境變量

        php環境下面的大量全局變量進行檢測。


    臨時文件
        php搭建後得配置文件和系統記錄的關鍵文件,防止泄露。

4 工具檢查  


    1.CodeScan
        http://www.codescan.com
        這個比較老牌了。市面上流出的版本好像就是1.6和1.9的crack,
        商業軟件。不過GUI界面操作起來很方便。這裏也不多說什麼,

        主要是Include的提示設置,裝過軟件自己看看就知道了。


    2.RIPS
        http://rips-scanner.sourceforge.net/
        PHP寫的,需要環境,直接解壓到wwwroot就好了。不適合掃描整個文件夾項目,或者要

        修改PHP配置,把代碼執行超時的時間設置大一點。總體來說還是很不錯。


    3.PHPXref
        http://phpxref.com
        嚴格的說PHPxref也是做開發的好幫手,它能將某一個程序(如Wordpress)中所有的函數、
        變量、常量等分類記錄,生成一個HTML網頁列表,你可以輕鬆地在這個列表中找到某個
        函數在什麼位置被定義,在什麼位置被引用。所以說非常適合大型項目。

        同時還是最主要的,It’s free.


    4. RATS
        http://www.fortify.com/security-resources/rats.jsp
        工具採用的就是詞法分析技術。通過詞法分析的工作原理,會發現該技術存在較爲
        嚴重的缺陷。第一,它只能檢測較少的已知問題,僅僅對 API 中的一些潛在的危險
        函數進行檢查,並不檢測其他的安全問題。第二,它僅僅是對己知問題函數進行匹配,

        沒有對這些問題進行進一步的確認。


    5. xssdetect
        http://tel1.hackol.com/2010/hackol.com-4910-XSSDetectSetup.rar
        一款微軟公司爲開發人員提供針對跨站腳本攻擊的靜態分析工具SSDetect是
        精簡版的.NET代碼分析工具,原本供微軟內部人員尋找應用軟件的安全漏洞

        之用,大概是受開源思想影響,現在已經可以免費下載了。


    6. yasca

        http://www.scovetta.com/yasca.html
        用來尋找安全漏洞,在程序的源代碼中檢測代碼質量、性能以及一致性的軟件。
        它集成了其它開源項目,其中包括FindBugs,PMD的,JLint,JavaScript的林特
        PHPLint,Cppcheck,並掃描某些文件類型,以及自定義掃描書面的Yasca。這是
        一個命令行工具,與報告中生成的HTML,CSV格式,XML的,的SQLite和其他格式。



發佈了117 篇原創文章 · 獲贊 70 · 訪問量 92萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章