[原创]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:那位有时间去通知下官方。 “有心”的朋友可是写个利用程序,去投给杂志社或者挂上自己的名字当原创 [quote]<?PHP
if (!defined('VALIDREQUEST')) die ('Access Denied.');
function convert_ubb ($str, $advanced=0, $inrss=0) {
global $logstat, $template, $mbcon, $lnc;
$str=plugin_walk('ubbanalyse', $str);
$basicubb_search=array('[hr]', '<br>');
$basicubb_replace=array('<hr/>', '<br/>');
$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('\\1', '\\2', '\\3', '\\4', {$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('\\4')",$str);
}
$str=preg_replace("/\[sfile\]\s*(\S+?)\s*\[\/sfile\]/ise", "makedownload('\\1', 1, $inrss)", $str);
$str=preg_replace("/\[file\]\s*(\S+?)\s*\[\/file\]/ise", "makedownload('\\1', 0, $inrss)", $str);
//Auto add url link
if ($mbcon['autoaddlink']==1) $str=preg_replace("/(?<=[^\]a-z0-9-=\"'\\/])((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.([^\[\"']+?)\](.+?)\[\/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('\\1', '\\2')",
"maketable('\\5','\\1','\\2','\\3','\\4')",
"<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('\\1')",
"makeurl('\\1')",
"<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('\\1')"
);
$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('\\1', '\\4', '\\2', '\\3')", $str) : preg_replace("/\[(wmp|swf|real|flv)=([^\[\<]+?),([^\[\<]+?)\]\s*([^\[\<\r\n]+?)\s*\[\/(wmp|swf|real|flv)\]/is", "<br/>{$lnc[267]}<br/>", $str);
$str=plugin_walk('ubbanalyseadvance', $str);
}
return $str;
}
function makeurl($url) {
global $mbcon;
$urllink="<a href=\"".(substr(strtolower($url), 0, 4) == 'www.' ? "http://$url" : $url).'" target="_blank">';
if($mbcon['shortenurl']=='1' && strlen($url) > $mbcon['urlmaxlen']) {
$url = substr($url, 0, $mbcon['urlmaxlen']).'...';
}
$urllink .= $url.'</a>';
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('wmp'=>'Windows Media Player', 'swf'=>'Flash Player', 'real'=>'Real Player', 'flv'=>'Flash Video Player');
$mediapic=array('wmp'=>'wmp.gif', 'swf'=>'swf.gif', 'real'=>'real.gif', 'flv'=>'swf.gif');
$url=($mediatype=='flv') ? urlconvert ($url, $config['blogurl'].'/') : $url;
$str="<div class=\"quote\"><div class=\"quote-title\"><img src=\"{$template['images']}/{$mediapic[$mediatype]}\" alt=\"\"/>{$typedesc[$mediatype]}{$lnc[268]}</div><div class=\"quote-content\"><a href=\"javascript: playmedia('player{$id}', '{$mediatype}', '{$url}', '{$width}', '{$height}');\">{$lnc[269]}</a><div id='player{$id}' style='display:none;'></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(' align=', '', strtolower($aligncode));
if ($align=='l') $show=' align="left"';
elseif ($align=='r') $show=' align="right"';
else $alignshow='';
$width=str_replace(' width=', '', strtolower($widthcode));
if (!empty($width)) $show.=" width=\"{$width}\"";
$height=str_replace(' height=', '', strtolower($heightcode));
if (!empty($height)) $show.=" height=\"{$height}\"";
if ($inrss==1) $src=(substr(strtolower($src), 0, 4) == 'http') ? $src : $config['blogurl'].'/'.$src;
$onloadact=($inrss==0 && !empty($mbcon['autoresizeimg'])) ? " onload=\"if(this.width>{$mbcon['autoresizeimg']}) {this.resized=true; this.width={$mbcon['autoresizeimg']};}\"" : '';
$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) == 'http') ? $src : $config['blogurl'].'/'.$src;
$str="<br/><img src=\"{$config['blogurl']}/{$template['images']}/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<'4.2.0') return "<div class=\"code\" style=\"overflow: auto;\">$str</div>";
$hlt = highlight_string($str, true);
if (PHP_VERSION>'5') return "<div class=\"code\" style=\"overflow: auto;\">$hlt</div>";
$fon = str_replace(array('<font ', '</font>'), array('<span ', '</span>'), $hlt);
$ret = preg_replace('#color="(.*?)"#', 'style="color: \\1"', $fon);
return "<div class=\"code\" style=\"overflow: auto;\">$ret;</div>";
}
function makedownload ($url, $sfile, $inrss) {
global $logstat, $template, $lnc, $mbcon;
if ($mbcon['countdownload']=='1') $downloadtime=" ({$lnc[280]} ".getdownloadtime(md5($url))." {$lnc[281]})";
else $downloadtime='';
$url=($mbcon['countdownload']=='1') ? "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['images']}/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['images']}/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(' width=', '', strtolower($widthcode));
if ($ifpercentage=='%') $width.='%';
if (!empty($width)) $show.=" width=\"{$width}\"";
$show.=" cellpadding=\"0\" cellspacing=\"0\">\n<tr>\n";
$bgcolor=str_replace(' bgcolor=', '', strtolower($bgcolorcode));
$bordercolor=str_replace(' border=', '', 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(',', "</td>\n<td bgcolor=\"{$bgcolor}\">", $tablebody);
$tablebody=str_replace('<br/>', "</td></tr>\n<tr><td bgcolor=\"{$bgcolor}\">", $tablebody);
$tablebody=str_replace('<br />', "</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/ 文件夹下覆盖。 官方只知道处理color,没处理font,
[code]
[font=expression(alert())]lib3rt3[/font][/code]
这样还是可以的。。。还有什么是只影响浏览器,expression造成的IE延时很好解决,而且盗个cookie又不是不可以。。。
这次偶通知官方了 希望邪八的管理以后移动帖子发个短信告知一声,移到核心区我也看不到。还以为帖子出什么问题了呢,那个PW跨站补丁应该已经出来了 楼上,BOB的BLOG已经好象有发补丁了
[url]http://www.bo-blog.com/weblog/post/patch-20070516.php[/url] 最新发现的一个小BUG,因为不是什么大漏洞就不当作原创单发了
BoBlog爆路径漏洞
在display_errors为ON的情况下,访问:
editor/custom/editordef.php
editor/quicktags/editordef.php
editor/tinymce/editordef.php
会爆出物理路径,解决方法:
在文件开头加上if (!defined('VALIDADMIN')) die ('Access Denied.');就可以避免了
PS:已通知官方。 偶手上有优酷的多处跨站,PP就不给大家看了,喜欢就去找,心情不好,不通知官方。。。。。。。 其实现在许多bobloger都把防垃圾引用和留言开了
这漏洞只针对留言不需要审核的有用 哈哈有意思呀!
页:
[1]