<dd id="sga4y"><optgroup id="sga4y"></optgroup></dd>
<nav id="sga4y"><code id="sga4y"></code></nav>
  • <optgroup id="sga4y"></optgroup>

    原文地址:http://drops.wooyun.org/tips/12751

    0x00 簡介


    之前看了seay寫的PHP代碼審計的書,全部瀏覽了一遍,作為一個代碼審計小白,希望向一些和我一樣的小白的人提供一下我的收獲,以及一個整體的框架和常見漏洞函數。這也算是這本書的一個學習筆記吧,可以結合我捋順的思路來看這本書。: )

    0x01 整體


    學習代碼審計的目標是能夠獨立完成對一個CMS的代碼安全監測。其通用的思路有:

    0x02 各種洞洞


    a.文件操作漏洞

    1.文件包含漏洞:

    (1) 本地文件包含:

    p1

    p2

    (2) 遠程文件包含:

    (3) 文件包含截斷:

    2.文件讀取(下載)漏洞:

    搜索關鍵函數:

    file_get_contents(),highlight_file(),fopen(),read file(),fread(),fgetss(), fgets(),parse_ini_file(),show_source(),file()

    3.文件上傳漏洞:

    搜索關鍵函數:

    move_uploaded_file() 接著看調用這個函數的代碼是否存在為限制上傳格式或者可以繞過。

    (1) 未過濾或本地過濾:服務器端未過濾,直接上傳PHP格式的文件即可利用。

    (2) 黑名單擴展名過濾:

    p3

    不被允許的文件格式.php,但是我們可以上傳文件名為1.php(注意后面有一個空格)

    (3) 文件頭 content-type驗證繞過:

    (4) 防范:

    4.文件刪除漏洞:

    搜索關鍵函數:

    Metinfo的任意文件刪除漏洞:

    p4

    $action = delete即可刪除.sql的文件,如果文件不是sql直接刪除提交的文件名

    target.com/recovery.php?&action=delete&filename=../../index.php

    b.代碼執行漏洞

    1.代碼執行函數:

    搜索關鍵函數:eval(), assert(), preg_replace(), call_user_func(), call_user_func_array(), array_map()

    (1) preg_replace()函數:

    mixed preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int &$count ]] )

    當$pattern處存在e修飾符時,$replacement 會被當做php代碼執行。

    (2)mixed call_user_func( callable $callbank [ , mixed $parameter [ , mixed $…)

    第一個參數為回調函數,第二個參數是回調函數的參數

    p5

    p6

    (3)eval()assert()

    當assert()的參數為字符串時 可執行PHP代碼

    【區分】:

    eval(" phpinfo(); ");【√】 eval(" phpinfo() ");【X】
    assert(" phpinfo(); ");【√】 assert(" phpinfo() ");【√】
    

    2.動態函數執行:

    動態函數后門:

    #!php
    <?php
    $_GET['a']($_GET['b']);
    ?>
    

    p7

    3.命令執行函數:

    搜索關鍵函數:system(), exec(), shell_exec(), passthru() ,pcntl_exec(), popen(),proc_open()

    (1) popenproc_open()

    #!php
    <?php 
    popen( 'whoami >> /Users/bingdaojueai/Desktop/1.txt', 'r' ); 
    ?>
    

    所在路徑就會出現一個1.txt 里面的內容為命令執行后的結果

    (2) 反引號命令執行:

    雙引號時,可以直接解析變量,造成代碼執行漏洞,過狗繞過。

    c.變量覆蓋漏洞

    1.函數使用不當:

    2.$$變量覆蓋:

    p8

    p9

    d.邏輯漏洞

    需要思考的問題:

    1.等于與存在判斷繞過:

    (1) in_array(): 比較之前會自動轉換類型

    p10

    p11

    (2)is_numeric():當傳入參數為hex時 直接通過并返回true 并且MYSQL可以直接使用hex編碼代替字符串明文 可以二次注入 并且可能造成XSS漏洞

    (3)雙等于==和三等于===

    2.賬戶體系中的越權問題:

    (1) 未exit/return/die

    #!php
    <?php
    if(file_exists('install.lock)){
        header("Location:xxx.com");
        //exit();
    }
    echo "test";
    ?>
    

    test 依舊會被輸出,替換成安裝流程,PHP依舊會進行。

    (2) 支付漏洞:

    可能導致漏洞函數: str_replace()

    p12

    #!php
    <?php
    $a = addslashes($_GET['a']);
    $b = addslashes($_GET['b']);
    echo "$a<br>$b<br>";
    $c = str_replace($a,'',$b);
    echo trim($c);
    ?>
    

    p13

    e.會話認證漏洞

    f.二次漏洞

    1.類型:

    p14

    p15

    2.技巧:

    (1) 鉆GPC等轉義的空子:

    (2)字符串問題:

    0x03 End


    自己走上安全這條路既是興趣也是偶然,選擇白盒完全是因為喜歡php,畢竟是初識代碼審計,seay的書確實幫了我不少,抱作者大腿(我是萌妹紙),希望這篇文章能夠幫助像我一樣小白的人,花了兩天總結的,如果有什么缺陷也等著大家指出。

    不會開發的談審計都是耍流氓!:)

    97av