<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[阿Tim日志]]></title> 
<link>https://atim.cn/index.php</link> 
<description><![CDATA[专业的php开发者.开发团队的带队人]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[阿Tim日志]]></copyright>
<item>
<link>https://atim.cn/post/1027/</link>
<title><![CDATA[phpwind的加密漏洞 discuz也存在该漏洞]]></title> 
<author>bkkkd &lt;partybase@gmail.com&gt;</author>
<category><![CDATA[开发应用]]></category>
<pubDate>Thu, 03 Nov 2011 17:46:19 +0000</pubDate> 
<guid>https://atim.cn/post/1027/</guid> 
<description>
<![CDATA[ 
	今天从 @HorseLuke 里看到一个 phpcms 2008的sys_auth()函数的漏洞,现在已经更正了.而他的加密方法与phpwind的StrCode()几乎同出一彻,虽然有少许不同,但还是能很容易被破解出来.只要有一个你知道被加密的内容且超过18个字节长的内容即可破解出全部pw的加密内容.<br/>下面是破解的方法:<br/><div class="code"><br/>&lt;?php<br/>$string=&#039;abcdefghijklmnopqrstuvwsyzABCDEFGHIJKLMNOPQRSTUVWSYZ123456789012&#039;;<br/>$code=StrCode($string,&#039;ENCODE&#039;);<br/>$key =substr(pw_decode($code,$string),0,18);//获取最后用于加密的钥匙<br/>var_dump(pw_decode(StrCode(&quot;timestamp&#92;t&quot;,&#039;ENCODE&#039;),$key));//得到密钥后,尝试破解其它的加密内容.<br/><br/>/**<br/>* 破解方法<br/>* @param string $code 加密过后的内容<br/>* @param string $string 原始内容<br/>* @return 返回解密内容<br/>**/<br/>function pw_decode($code,$string)&#123;<br/>&nbsp;&nbsp;$txt = base64_decode($code);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$len&nbsp;&nbsp;&nbsp;&nbsp;= strlen($string);<br/>&nbsp;&nbsp;&nbsp;&nbsp;$key&nbsp;&nbsp;&nbsp;&nbsp;= &#039;&#039;;<br/>&nbsp;&nbsp;$txt_len=strlen($txt);<br/>&nbsp;&nbsp;&nbsp;&nbsp;for($i=0; $i&lt;$txt_len; $i++)&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$k&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;= $i % $len;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$key .= chr(ord($txt&#91;$i&#93;) ^ ord($string&#91;$k&#93;));<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return substr($key,0,18);<br/>&#125;<br/>/**<br/> * 加密、解密字符串<br/> *<br/> * @global string $db_hash<br/> * @global array $pwServer<br/> * @param $string 待处理字符串<br/> * @param $action 操作，ENCODE&#124;DECODE<br/> * @return string<br/> */<br/>function StrCode($string, $action = &#039;ENCODE&#039;) &#123;<br/>&nbsp;&nbsp;$action != &#039;ENCODE&#039; &amp;&amp; $string = base64_decode($string);<br/>&nbsp;&nbsp;$code = &#039;&#039;;<br/>&nbsp;&nbsp;$key = substr(md5(&#039;123456&#039;), 8, 18);<br/>&nbsp;&nbsp;debug(TaString::ordstring($key,&#039;&#124;&#039;));<br/><br/>&nbsp;&nbsp;$keyLen = strlen($key);<br/>&nbsp;&nbsp;$strLen = strlen($string);<br/>&nbsp;&nbsp;for ($i = 0; $i &lt; $strLen; $i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$k = $i % $keyLen;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$code .= $string&#91;$i&#93; ^ $key&#91;$k&#93;;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;return ($action != &#039;DECODE&#039; ? base64_encode($code) : $code);<br/>&#125;<br/>?&gt;</div><br/><br/>破解原来源自: http://www.80vul.com/phpcms/phpcms_sys_auth.txt<br/><br/>我再研究dz的加密函数.这个原理是无法对他进行破解.下面是我对dz的authcode的分析,建议使用pw这些加密方式的同学改用dz的加密方法.我都在代码里进行的注释.<br/><div class="code"><br/>function authcode($string, $operation = &#039;DECODE&#039;, $key = &#039;&#039;, $expiry = 0) &#123;<br/>&nbsp;&nbsp;$ckey_length = 4;<br/>&nbsp;&nbsp;$key = md5($key != &#039;&#039; ? $key : &#039;abcdefg!@#$&#039;);<br/>&nbsp;&nbsp;$keya = md5(substr($key, 0, 16));<br/>&nbsp;&nbsp;$keyb = md5(substr($key, 16, 16));<br/>&nbsp;&nbsp;/*<br/>&nbsp;&nbsp; * 这里的$ckey_length?:;判断是一个骗人的算法.应该是防止某些人抄代码写上去的.(phpcms v9就是抄了这么代码)<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;$keyc = $ckey_length ? ($operation == &#039;DECODE&#039; ? substr($string, 0, $ckey_length): substr(md5(microtime()), -$ckey_length)) : &#039;&#039;;<br/><br/>&nbsp;&nbsp;$cryptkey = $keya.md5($keya.$keyc);<br/>&nbsp;&nbsp;$key_length = strlen($cryptkey);//64位<br/><br/>&nbsp;&nbsp;/*<br/>&nbsp;&nbsp; * 如果在加密时,将会添加 10个字节长度的过期时间和由hash生成的md5字符串.这个字符串很重要,会让人别人在没有hash的情况下无法破解<br/>&nbsp;&nbsp; */<br/>&nbsp;&nbsp;$string = $operation == &#039;DECODE&#039; ? base64_decode(substr($string, $ckey_length)) : sprintf(&#039;%010d&#039;, $expiry ? $expiry + time() : 0).substr(md5($string.$keyb), 0, 16).$string;<br/>&nbsp;&nbsp;$string_length = strlen($string);<br/><br/>&nbsp;&nbsp;$result = &#039;&#039;;<br/>&nbsp;&nbsp;$box = range(0, 255);<br/><br/>&nbsp;&nbsp;$rndkey = array();<br/>&nbsp;&nbsp;//将crptkey的值重复地填满$rndkey<br/>&nbsp;&nbsp;for($i = 0; $i &lt;= 255; $i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$rndkey&#91;$i&#93; = ord($cryptkey&#91;$i % $key_length&#93;);//这里都是一些扰乱视听的写法.<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;//将进算出$j的值与当前$i键的box值互换,从而得到新的值<br/>&nbsp;&nbsp;$_box=array();<br/>&nbsp;&nbsp;for($j = $i = 0; $i &lt; 256; $i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$j = ($j + $box&#91;$i&#93; + $rndkey&#91;$i&#93;) % 256;//这里都是一些扰乱视听的写法.<br/>&nbsp;&nbsp;&nbsp;&nbsp;$tmp = $box&#91;$i&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$box&#91;$i&#93; = $box&#91;$j&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$box&#91;$j&#93; = $tmp;<br/>&nbsp;&nbsp;&#125;<br/><br/>&nbsp;&nbsp;$_s = array();<br/>&nbsp;&nbsp;for($a = $j = $i = 0; $i &lt; $string_length; $i++) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$a = ($a + 1) % 256;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$j = ($j + $box&#91;$a&#93;) % 256;//这里都是一些扰乱视听的写法.<br/>&nbsp;&nbsp;&nbsp;&nbsp;$tmp = $box&#91;$a&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$box&#91;$a&#93; = $box&#91;$j&#93;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;$box&#91;$j&#93; = $tmp;<br/>&nbsp;&nbsp;&nbsp;&nbsp;/*<br/>&nbsp;&nbsp;&nbsp;&nbsp; * 按照上面破解原理,需要得到 ($box&#91;($box&#91;$a&#93; + $box&#91;$j&#93;) % 256&#93;) 个的值.<br/>&nbsp;&nbsp;&nbsp;&nbsp; */<br/>&nbsp;&nbsp;&nbsp;&nbsp;$result .= chr(ord($string&#91;$i&#93;) ^ ($box&#91;($box&#91;$a&#93; + $box&#91;$j&#93;) % 256&#93;));<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;if($operation == &#039;DECODE&#039;) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;if((substr($result, 0, 10) == 0 &#124;&#124; substr($result, 0, 10) - time() &gt; 0) &amp;&amp; substr($result, 10, 16) == substr(md5(substr($result, 26).$keyb), 0, 16)) &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return substr($result, 26);<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return &#039;&#039;;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125; else &#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;return $keyc.str_replace(&#039;=&#039;, &#039;&#039;, base64_encode($result));<br/>&nbsp;&nbsp;&#125;<br/><br/>&#125;<br/></div><br/><hr/><br/>昨晚太晚睡了.今天早上有点不愿起床.<br/>早上起床后,一直在想dz的密码能不能被.按道理是还是能被破解的.只要有282位已知的原始内容,即可得到加密的钥匙.查得到282位的已知内容.相对难度较大.<br/><a href="https://atim.cn/attachment.php?fid=29" target="_blank"><img src="https://atim.cn/attachment.php?fid=29" class="insertimage" alt="点击在新窗口中浏览此图片" title="点击在新窗口中浏览此图片" border="0"/></a><br/>Tags - <a href="https://atim.cn/tags/phpwind/" rel="tag">phpwind</a> , <a href="https://atim.cn/tags/%25E6%25BC%258F%25E6%25B4%259E/" rel="tag">漏洞</a> , <a href="https://atim.cn/tags/%25E5%258A%25A0%25E5%25AF%2586/" rel="tag">加密</a> , <a href="https://atim.cn/tags/discuz/" rel="tag">discuz</a>
]]>
</description>
</item><item>
<link>https://atim.cn/post/1027/#blogcomment4889</link>
<title><![CDATA[[评论] phpwind的加密漏洞 discuz也存在该漏洞]]></title> 
<author>horseluke &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 08 Nov 2011 05:50:04 +0000</pubDate> 
<guid>https://atim.cn/post/1027/#blogcomment4889</guid> 
<description>
<![CDATA[ 
	http://bbs.phpchina.com/forum.php?mod=redirect&amp;goto=findpost&amp;ptid=113075&amp;pid=1452503上面的连接中，有人指出dz加密函数基于rc4算法：http://baike.baidu.com/view/904005.htm
]]>
</description>
</item>
</channel>
</rss>