邪恶八进制信息安全团队技术讨论组's Archiver

net-owl 2007-5-16 21:10

[原创]Boblog跨站漏洞

文章作者:lib3rt3
信息来源:邪恶八进制信息安全团队([url]www.eviloctal.com[/url])& NSSPC([url]www.nsspc.org[/url]

[b]漏洞发现者是lib3rt3,我帮他待发罢了。[/b]

BoBlog跨站漏洞
今天抽空看了下Boblog的代码,发现了个跨站漏洞,影响最新版,目前官方没出补丁(呵呵,貌似偶有点不厚道), 看下ubb.php的代码:
[code]$regubb_search = array(
.......
"/\[color=([^\[\<]+?)\](.+?)\[\/color\]/i",
"/\[font=([^\[\<]+?)\](.+?)\[\/font\]/i",
.......
);
$regubb_replace = array(
.......
"<span style=\"color: \\2\\1;\">\\2</span>",
"<span style=\"font-family: \\2\\1;\">\\2</span>",
.......
);
$str=preg_replace($regubb_search, $regubb_replace, $str);[/code]

哈哈,没有对style里的东东过滤,在评论或留言处写:
[code][color=expression(alert())]lib3rt3[/color] [/code]
至于跨站的具体利用,我想大家都比我明白:)
PS:那位有时间去通知下官方。

net-owl 2007-5-16 21:12

“有心”的朋友可是写个利用程序,去投给杂志社或者挂上自己的名字当原创

pixy 2007-5-17 10:05

[quote]<?PHP

if (!defined(&#39;VALIDREQUEST&#39;)) die (&#39;Access Denied.&#39;);

function convert_ubb ($str, $advanced=0, $inrss=0) {
  global $logstat, $template, $mbcon, $lnc;
  $str=plugin_walk(&#39;ubbanalyse&#39;, $str);
  $basicubb_search=array(&#39;[hr]&#39;, &#39;<br>&#39;);
  $basicubb_replace=array(&#39;<hr/>&#39;, &#39;<br/>&#39;);
  $str=str_replace($basicubb_search, $basicubb_replace, $str);

  //[IMG]
  if ($advanced==1) {
    $str=preg_replace("/\[img( align=L| align=M| align=R)?( width=[0-9]+)?( height=[0-9]+)?\]\s*(\S+?)\s*\[\/img\]/ise","makeimg(&#39;\\1&#39;, &#39;\\2&#39;, &#39;\\3&#39;, &#39;\\4&#39;, {$inrss})",$str);
  } else {
    $str=preg_replace("/\[img( align=L| align=M| align=R)?( width=[0-9]+)?( height=[0-9]+)?\]\s*(\S+?)\s*\[\/img\]/ise","makeimginrss(&#39;\\4&#39;)",$str);
  }

  $str=preg_replace("/\[sfile\]\s*(\S+?)\s*\[\/sfile\]/ise", "makedownload(&#39;\\1&#39;, 1, $inrss)", $str);
  $str=preg_replace("/\[file\]\s*(\S+?)\s*\[\/file\]/ise", "makedownload(&#39;\\1&#39;, 0, $inrss)", $str);

  //Auto add url link
  if ($mbcon[&#39;autoaddlink&#39;]==1) $str=preg_replace("/(?<=[^\]a-z0-9-=\"&#39;\\/])((https?|ftp|gopher|news|telnet|rtsp|mms|callto|ed2k):\/\/|www\.)([a-z0-9\/\-_+=.~!%@?#%&;:$\\()|]+)/i", "[url]\\1\\3[/url]", $str);

  
  $regubb_search = array(
        "/\[size=([^\[\<]+?)\](.+?)\[\/size\]/ie",
        "/\[tbl( width=[0-9]+)?(%)?( bgcolor=[^ ]*)?( border=[^ ]*)?\](.+?)\[\/tbl\]/ise",
        "/\s*\[quote\][\n\r]*(.+?)[\n\r]*\[\/quote\]\s*/is",
        "/\s*\[quote=(.+?)\][\n\r]*(.+?)[\n\r]*\[\/quote\]\s*/is",
        "/\s*\[code\][\n\r]*(.+?)[\n\r]*\[\/code\]\s*/ie",
        "/\[url\]([^\[]*)\[\/url\]/ie",
        "/\[url=www.([^\[\"&#39;]+?)\](.+?)\[\/url\]/is",
        "/\[url=([^\[]*)\](.+?)\[\/url\]/is",
        "/\[email\]([^\[]*)\[\/email\]/is",
        "/\[acronym=([^\[]*)\](.+?)\[\/acronym\]/is",
        "/\[color=([a-zA-Z0-9#]+?)\](.+?)\[\/color\]/i",
        "/\[font=([^\[\<]+?)\](.+?)\[\/font\]/i",
        "/\[p align=([^\[\<]+?)\](.+?)\[\/p\]/i",
        "/\[b\](.+?)\[\/b\]/i",
        "/\[i\](.+?)\[\/i\]/i",
        "/\[u\](.+?)\[\/u\]/i",
        "/\[strike\](.+?)\[\/strike\]/i",
        "/\[sup\](.+?)\[\/sup\]/i",
        "/\[sub\](.+?)\[\/sub\]/i",
        "/\s*\[php\][\n\r]*(.+?)[\n\r]*\[\/php\]\s*/ie"
  );
  $regubb_replace = array(
        "makefontsize(&#39;\\1&#39;, &#39;\\2&#39;)",
        "maketable(&#39;\\5&#39;,&#39;\\1&#39;,&#39;\\2&#39;,&#39;\\3&#39;,&#39;\\4&#39;)",
        "<div class=\"quote\"><div class=\"quote-title\">{$lnc[265]}</div><div class=\"quote-content\">\\1</div></div>",
        "<div class=\"quote\"><div class=\"quote-title\">{$lnc[266]} \\1</div><div class=\"quote-content\">\\2</div></div>",
        "makecode(&#39;\\1&#39;)",
        "makeurl(&#39;\\1&#39;)",
        "<a href=\"http://www.\\1\" target=\"_blank\">\\2</a>",
        "<a href=\"\\1\" target=\"_blank\">\\2</a>",
        "<a href=\"mailto:\\1\">\\1</a>",
        "<acronym title=\"\\1\">\\2</acronym>",
        "<span style=\"color: \\1;\">\\2</span>",
        "<span style=\"font-family: \\1;\">\\2</span>",
        "<p align=\"\\1\">\\2</p>",
        "<strong>\\1</strong>",
        "<em>\\1</em>",
        "<u>\\1</u>",
        "<del>\\1</del>",
        "<sup>\\1</sup>",
        "<sub>\\1</sub>",        
        "xhtmlHighlightString(&#39;\\1&#39;)"
  );
  $str=preg_replace($regubb_search, $regubb_replace, $str);

  //Multimedia Objects, dangerous, so visitors shall never be allowed to post such an object directly
  if ($advanced==1) {
    $str =($inrss==0) ? preg_replace("/\[(wmp|swf|real|flv)=([^\[\<]+?),([^\[\<]+?)\]\s*([^\[\<\r\n]+?)\s*\[\/(wmp|swf|real|flv)\]/ies", "makemedia(&#39;\\1&#39;, &#39;\\4&#39;, &#39;\\2&#39;, &#39;\\3&#39;)", $str) : preg_replace("/\[(wmp|swf|real|flv)=([^\[\<]+?),([^\[\<]+?)\]\s*([^\[\<\r\n]+?)\s*\[\/(wmp|swf|real|flv)\]/is", "<br/>{$lnc[267]}<br/>", $str);
    $str=plugin_walk(&#39;ubbanalyseadvance&#39;, $str);
  }
  return $str;
}

function makeurl($url) {
  global $mbcon;
  $urllink="<a href=\"".(substr(strtolower($url), 0, 4) == &#39;www.&#39; ? "http://$url" : $url).&#39;" target="_blank">&#39;;
  if($mbcon[&#39;shortenurl&#39;]==&#39;1&#39; && strlen($url) > $mbcon[&#39;urlmaxlen&#39;]) {
    $url = substr($url, 0, $mbcon[&#39;urlmaxlen&#39;]).&#39;...&#39;;
  }
  $urllink .= $url.&#39;</a>&#39;;
  return $urllink;
}

function makefontsize ($size, $word) {
  $word=stripslashes($word);
  $sizeitem=array (0, 8, 10, 12, 14, 18, 24, 36);
  $size=$sizeitem[$size];
  return "<span style=\"font-size: {$size}px;\">{$word}</span>";
}

function makemedia ($mediatype, $url, $width, $height) {
  global $template, $lnc, $config;
  $mediatype=strtolower($mediatype);
  $id=rand(1000, 99999);
  $typedesc=array(&#39;wmp&#39;=>&#39;Windows Media Player&#39;, &#39;swf&#39;=>&#39;Flash Player&#39;, &#39;real&#39;=>&#39;Real Player&#39;, &#39;flv&#39;=>&#39;Flash Video Player&#39;);
  $mediapic=array(&#39;wmp&#39;=>&#39;wmp.gif&#39;, &#39;swf&#39;=>&#39;swf.gif&#39;, &#39;real&#39;=>&#39;real.gif&#39;, &#39;flv&#39;=>&#39;swf.gif&#39;);
  $url=($mediatype==&#39;flv&#39;) ? urlconvert ($url, $config[&#39;blogurl&#39;].&#39;/&#39;) : $url;
  $str="<div class=\"quote\"><div class=\"quote-title\"><img src=\"{$template[&#39;images&#39;]}/{$mediapic[$mediatype]}\" alt=\"\"/>{$typedesc[$mediatype]}{$lnc[268]}</div><div class=\"quote-content\"><a href=\"javascript: playmedia(&#39;player{$id}&#39;, &#39;{$mediatype}&#39;, &#39;{$url}&#39;, &#39;{$width}&#39;, &#39;{$height}&#39;);\">{$lnc[269]}</a><div id=&#39;player{$id}&#39; style=&#39;display:none;&#39;></div></div></div>";
  return $str;
}

function makecode ($str) {
  return "<div class=\"code\">{$str}</div>";
}

function makeimg ($aligncode, $widthcode, $heightcode, $src, $inrss=0) {
  global $lnc, $mbcon, $config;
  $align=str_replace(&#39; align=&#39;, &#39;&#39;, strtolower($aligncode));
  if ($align==&#39;l&#39;) $show=&#39; align="left"&#39;;
  elseif ($align==&#39;r&#39;) $show=&#39; align="right"&#39;;
  else $alignshow=&#39;&#39;;
  $width=str_replace(&#39; width=&#39;, &#39;&#39;, strtolower($widthcode));
  if (!empty($width)) $show.=" width=\"{$width}\"";
  $height=str_replace(&#39; height=&#39;, &#39;&#39;, strtolower($heightcode));
  if (!empty($height)) $show.=" height=\"{$height}\"";
  if ($inrss==1) $src=(substr(strtolower($src), 0, 4) == &#39;http&#39;) ? $src : $config[&#39;blogurl&#39;].&#39;/&#39;.$src;
  $onloadact=($inrss==0 && !empty($mbcon[&#39;autoresizeimg&#39;])) ? " onload=\"if(this.width>{$mbcon[&#39;autoresizeimg&#39;]}) {this.resized=true; this.width={$mbcon[&#39;autoresizeimg&#39;]};}\"" : &#39;&#39;;
  $code="<a href=\"{$src}\" target=\"_blank\"><img src=\"{$src}\" class=\"insertimage\" alt=\"{$lnc[231]}\" title=\"{$lnc[231]}\" border=\"0\"{$onloadact}{$show}/></a>";
  return $code;
}

function makeimginrss($src) {
  global $config, $lnc, $template;
  $src=(substr(strtolower($src), 0, 4) == &#39;http&#39;) ? $src : $config[&#39;blogurl&#39;].&#39;/&#39;.$src;
  $str="<br/><img src=\"{$config[&#39;blogurl&#39;]}/{$template[&#39;images&#39;]}/viewimage.gif\" alt=\"\"/><a href=\"{$src}\" target=\"_blank\">{$lnc[231]}</a><br/>[url]{$src}[/url]<br/>";
  return $str;
}

function xhtmlHighlightString($str) {
  $str=base64_decode($str);
  if (PHP_VERSION<&#39;4.2.0&#39;) return "<div class=\"code\" style=\"overflow: auto;\">$str</div>";
  $hlt = highlight_string($str, true);
  if (PHP_VERSION>&#39;5&#39;) return "<div class=\"code\" style=\"overflow: auto;\">$hlt</div>";
  $fon = str_replace(array(&#39;<font &#39;, &#39;</font>&#39;), array(&#39;<span &#39;, &#39;</span>&#39;), $hlt);
  $ret = preg_replace(&#39;#color="(.*?)"#&#39;, &#39;style="color: \\1"&#39;, $fon);
  return "<div class=\"code\" style=\"overflow: auto;\">$ret;</div>";
}

function makedownload ($url, $sfile, $inrss) {
  global $logstat, $template, $lnc, $mbcon;
  if ($mbcon[&#39;countdownload&#39;]==&#39;1&#39;) $downloadtime=" ({$lnc[280]} ".getdownloadtime(md5($url))." {$lnc[281]})";
  else $downloadtime=&#39;&#39;;
  $url=($mbcon[&#39;countdownload&#39;]==&#39;1&#39;) ? "attachment.php?f=".urlencode($url) : $url;
  if ($inrss==0) {
    if ($logstat==1 || $sfile!=1) $str="<div class=\"quote\"><div class=\"quote-title\"><img src=\"{$template[&#39;images&#39;]}/download.gif\" alt=\"\"/>{$lnc[232]}{$downloadtime}</div><div class=\"quote-content\"><a href=\"{$url}\">{$lnc[233]}</a></div></div>";
    else $str="<div class=\"quote\"><div class=\"quote-title\"><img src=\"{$template[&#39;images&#39;]}/download.gif\" alt=\"\"/>{$lnc[232]}{$downloadtime}</div><div class=\"quote-content\">{$lnc[234]} <a href=\"login.php?job=register\">{$lnc[79]}</a> {$lnc[235]} <a href=\"login.php\">{$lnc[89]}</a> </div></div>";
  } else {
    if ($sfile==1) $str="{$lnc[234]} <a href=\"login.php?job=register\">{$lnc[79]}</a> {$lnc[235]} <a href=\"login.php\">{$lnc[89]}</a>";
    else $str="<a href=\"{$url}\">{$lnc[233]}</a>";
  }
  return $str;
}

function getdownloadtime($urlmd5) {
  $filedownload="data/downloadcounter.php";
  $allcounts=readfromfile($filedownload);
  if (!strstr($allcounts, "{$urlmd5}|")) return 0;
  else {
    $compare_str="/({$urlmd5})\|([0-9]+?)>/ise";
    preg_match($compare_str, $allcounts, $fs);
    return ($fs[2]);
  }
}

function maketable ($tablebody, $widthcode, $ifpercentage, $bgcolorcode, $bordercolorcode) {
  $tablebody=stripslashes($tablebody);
  $show="<table";
  $width=str_replace(&#39; width=&#39;, &#39;&#39;, strtolower($widthcode));
  if ($ifpercentage==&#39;%&#39;) $width.=&#39;%&#39;;
  if (!empty($width)) $show.=" width=\"{$width}\"";
  $show.=" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n";
  $bgcolor=str_replace(&#39; bgcolor=&#39;, &#39;&#39;, strtolower($bgcolorcode));
  $bordercolor=str_replace(&#39; border=&#39;, &#39;&#39;, strtolower($bordercolorcode));
  if (!$bordercolor) $bordercolor="#000000";
  if (!$bgcolor) $bgcolor="#ffffff";
  $show.="<td bgcolor=\"{$bordercolor}\">\n";
  $show.="<table width=\"100%\" cellpadding=\"5\" cellspacing=\"1\">\n<tr><td bgcolor=\"{$bgcolor}\">";
  $tablebody=str_replace(&#39;,&#39;, "</td>\n<td bgcolor=\"{$bgcolor}\">", $tablebody);
  $tablebody=str_replace(&#39;<br/>&#39;, "</td></tr>\n<tr><td bgcolor=\"{$bgcolor}\">", $tablebody);
  $tablebody=str_replace(&#39;<br />&#39;, "</td></tr>\n<tr><td bgcolor=\"{$bgcolor}\">", $tablebody);
  $show.=$tablebody;
  $show.="</td></tr>\n</table>\n</td></tr>\n</table>";
  return $show;
}
[/quote]
说明:
2.0.3 sp 1(含)以前的所有版本,UBB解释均存在一处过滤不严,可造成浏览器跨站攻击。

危害:
访客可通过留言或评论添加有害的html代码,影响访问者的浏览器。
不影响blog数据。

补丁:
请下载下面的补丁,将 inc/ubb.php 上传到 inc/ 文件夹下覆盖。

lib3rt3 2007-5-17 10:46

官方只知道处理color,没处理font,
[code]
[font=expression(alert())]lib3rt3[/font][/code]
这样还是可以的。。。还有什么是只影响浏览器,expression造成的IE延时很好解决,而且盗个cookie又不是不可以。。。

这次偶通知官方了

net-owl 2007-5-17 19:39

希望邪八的管理以后移动帖子发个短信告知一声,移到核心区我也看不到。还以为帖子出什么问题了呢,那个PW跨站补丁应该已经出来了

juey 2007-5-18 08:10

楼上,BOB的BLOG已经好象有发补丁了
[url]http://www.bo-blog.com/weblog/post/patch-20070516.php[/url]

net-owl 2007-5-18 21:46

最新发现的一个小BUG,因为不是什么大漏洞就不当作原创单发了
BoBlog爆路径漏洞


在display_errors为ON的情况下,访问:

editor/custom/editordef.php
editor/quicktags/editordef.php
editor/tinymce/editordef.php

会爆出物理路径,解决方法:

在文件开头加上if (!defined(&#39;VALIDADMIN&#39;)) die (&#39;Access Denied.&#39;);就可以避免了

PS:已通知官方。

tianjishu596 2007-6-6 15:41

偶手上有优酷的多处跨站,PP就不给大家看了,喜欢就去找,心情不好,不通知官方。。。。。。。

神舞 2007-6-6 21:19

其实现在许多bobloger都把防垃圾引用和留言开了
这漏洞只针对留言不需要审核的有用

mozio1 2007-6-7 13:26

哈哈有意思呀!

页: [1]
© 1999-2008 EvilOctal Security Team