上期我们介绍了如何爆破零点CMS3.21,近日又偷闲到了捷派官方网站(),发现已经采用ASP.net编写,并且发布了2.0版。既然是一脉相承,那么就继续分析此版本吧。不看倒还罢了,一看便疑虑重重,是否存在漏洞暂且不提,仅用记事本打开“member/member_reg.aspx”文件时,其中严密的正则表达式就令人不得不怀疑捷派是否有意在零点CMS3.21中设了局,如图1所示。要知道零点CMS3.21就是因为正则表达式存在缺陷而被爆破的。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图1

都说天下没有“免费的午餐”,可谁让我们都是穷人呢?生活还得继续,安全也得常谈嘛。好了,言归正传,在享用捷派.net V2.0这盘大餐前,让我们先仔细检验一番吧,顺便也熟悉一下.net。

 

检测

首先搭建IIS,IP设为127.0.0.1,Windows 2003需要在“Web服务扩展”中手工“允许”(默认“禁止”)ASP.net,如图2所示,然后注册test用户,如图3所示。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图2

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图3

捷派.net V2.0应该不会犯低级错误的,正常页面链接检测忽略,直接用WinSockExpert监听test用户登录,如图4所示。很显然,捷派.net V2.0使用Session验证用户,看来Cookie也没得用了。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图4

按照《零点爆破》的方法检测登录页面(详细过程略),结果无功而返。再试着通过外部提交进行注册,另存注册页面(Member/Member_Reg.aspx)为html文件,修改“action=""”为“action="http://127.0.0.1/Member/Member_Reg.aspx"”,同时删除“立即注册”按钮的事件“onclick="return CheckRegisterMember();"”,然后注册“test and 1=1”用户,耶?竟然注册成功!?如图5所示。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图5

再测试“test and 1=2”,同样可以注册成功,而且可以正常登录!可见and条件不起作用!查看数据库JT_Member表,发现单引号被写入,如图6所示,由此可以断定注册时用户名中的单引号已经被替换成双引号,成为用户名中的字符了。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图6

既然单引号可以被写入,那么我们就试试跨站吧。注册“<Script>alert(/CSS/)</Script>”,刷新首页,成功跨站!如图7所示。至于如何深度利用,这里就不探讨了,相信大家都比较熟悉了。如果我们注册“<Script>”(或其他标签)后,将直接影响到首页的页面框架,那么直接挂马呢?问题应该是严重的。真可谓无需注入,无需破解,更无需进后台,注册一个用户就足以“黑”掉捷派!

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图7

结论:捷派.net V2.0注册页面存在漏洞,可以外部提交注册,但是用户名中的单引号被替换为双引号,使得单引号成为用户名中的字符!

我们继续浏览页面。在投票时,捷派限制每个用户(默认)只允许投票1次。当我们使用“test and 1=1”登录时会受此限制,而使用“test and 1=2”登录后则不受限制!OK!可见and条件有效了——极有可能存在注入!下面我们详细分析一下。

 

分析

捷派.net V2.0基于ASP.net编写,并将源码编译成DLL(bin目录中),所以必须进行反编译。我们使用的工具有Reflector和Reflector.FileDisassembler.dll。运行Reflector后,选择菜单“View->Add-Ins”,添加Reflector.FileDisassembler.dll文件,再依次打开bin目录中的5个DLL文件,用“Tools->File Disassembler”进行反编译!如图8和图9所示。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图8

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图9

下面我们就从投票页面文件VoteResult.aspx开始分析,代码如下。

 

<%@ Register Assembly="JustCmsKenel" Namespace="Just.CmsKenel.WebControls" TagPrefix="Just" %>

//第1行代码。Register指明要引用一个自定义的控件,Assembly指定命名程序集,Namespace指定命名空间,Tagprefix指定别名。这行指明将引用程序集JustCmsKenel(即JustCmsKenel .DLL文件)中的Just.CmsKenel.WebControls控件(别名为“Just”)中的类。

……

<Just:JcVoteInfo runat="server" SkinName="Default">

//第19行代码。这行指明引用“Just” 命名空间中的JcVoteInfo类。

 

根据上面的代码,我们打开“binJustCmsKenel_SourceJust.CmsKenel.WebControlsJcVoteInfo.cs”文件(使用Reflector 反编译*.DLL文件后,源码默认存放在“*_Source”目录中),从页面OnLoad事件中可以得知,当表单提交的VoteThemeID非空时,将调用JcVoteThemeRecord.Vote方法,如图10所示。使用DreamWeaver查找“JcVoteThemeRecord”,打开“binJustCmsKenel_SourceJust.CmsKenel.DAL.VoteJcVoteThemeRecord.cs”文件,找到Vote方法中关于投票次数限制的代码(第174行),如图11所示。

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图10

捷派风波—捷派网站管理系统.net V2.0漏洞分析

图11

完整的SQL语句如下,iVoteThemeID的值由JcVoteThemeRecord.GetCurrentThemeID方法获得,不能利用!JcMemberRecord.GetLoginInfo().MemberID的值应该是我们当前登录的用户名了,那么肯定没有过滤!

 

Select count(*) from JT_VoteCollection Where ThemeID=" + iVoteThemeID.ToString() + " and MemberID=" + JcMemberRecord.GetLoginInfo().MemberID + ""