BBSXP论坛程序Manage.asp页面过滤不严导致SQL注入漏洞


添加时间:
2008-10-05

系统编号:
WAVDB-01245

影响版本:
BBSxp 2008 For Access

程序介绍:

BBSXP是一个强大的论坛社区解决方案,使用它您可以轻易为您的网站创建论坛系统。

漏洞分析:

Manage.asp文件的ThreadID没有经过任何过滤便放入SQL语句中执行 导致注射漏洞发生

漏洞代码:

 
  1. <%  
  2. if CookieUserName=empty then error("您还未<a href=""javascript:BBSXP_Modal.Open('Login.asp',380,170);"">登录</a>论坛")  
  3.   
  4. if Request_Method <> "POST" then error("<li>提交方式错误!</li><li>您本次使用的是"& Request_Method"提交方式!</li>")  
  5.   
  6. ForumID=RequestInt("ForumID")  
  7. ThreadID=Request("ThreadID") // 这里不知道程序员是不是晚上床上劳累过度  
  8. If IsNumeric(ThreadID) then  
  9. ThreadID=int(ThreadID) //这里虽然进行数字型判断 但是我们有办法直接跳出这里 继续执行下面的SQL语句  
  10. ForumID=Execute("Select ForumID From ["&TablePrefix"Threads] where ThreadID="&ThreadID"")(0)  
  11. End If  
  12. if BestRole<>1 then  
  13. Moderated=Execute("Select Moderated From ["&TablePrefix"Forums] where ForumID="&ForumID" ")(0)  
  14. %><!– #include file="Utility/ForumPermissions.asp" –><%  
  15. end if  
  16. if BestRole=1 and ForumID<1 then  
  17. ForumIDSql=""  
  18. else  
  19. ForumIDSql=" and ForumID="&ForumID""  
  20. end if  
  21. select case Request("menu")  
  22. case "Top"  
  23. if BestRole = 1 then  
  24. for each ho in Request("ThreadID")  
  25. ho=int(ho)  
  26. Execute("update ["&TablePrefix"Threads] Set ThreadTop=2,StickyDate=DateAdd("&SqlChar"yyyy"&SqlChar", 3, "&SqlNowString") where ThreadID="&ho&ForumIDSql"")  
  27. next  
  28. succtitle="批量公告主题,主题ID:"&Request("ThreadID")""  
  29. else  
  30. error("您的权限不够")  
  31. end if  
  32. case "UnTop"  
  33. if BestRole = 1 then  
  34. for each ho in Request("ThreadID")  
  35. ho=int(ho)  
  36. Execute("update ["&TablePrefix"Threads] Set ThreadTop=0,StickyDate="&SqlNowString" where ThreadID="&ho&ForumIDSql"")  
  37. next  
  38. succtitle="批量取消公告,主题ID:"&Request("ThreadID")""  
  39. else  
  40. error("您的权限不够")  
  41. end if  
  42. ….这里省略部分代码  
  43. next  
  44. UpdateThreadStatic(ThreadID)  
  45. succtitle="批量删除帖子,帖子ID:"&Request.Form("PostID")""  
  46.   
  47. case "UnDelPost"  
  48. for each ho in Request.Form("PostID")  
  49. ho=int(ho)  
  50. Rs.open "select * from ["&TablePrefix"Posts] where ThreadID="&ThreadID" and PostID="&ho"",Conn,1,3  
  51. if not Rs.eof then  
  52. Rs("Visible")=1  
  53. Rs.update  
  54. if Rs("ParentID")=0 then Execute("update ["&TablePrefix"Threads] Set Visible=1 where ThreadID="&Rs("ThreadID")"")  
  55. end if  
  56. Rs.close  
  57. next  
  58. UpdateThreadStatic(ThreadID)  
  59. succtitle="批量还原帖子,帖子ID:"&Request.Form("PostID")""  
  60.   
  61. '''''''''''''''''''''''''''''''''''帖子管理 End''''''''''''''''''''''''''''''''''  
  62. end select  
  63. if succtitle="" then error("无效指令")  
  64.   
  65. Log(""&succtitle"")  
  66. Message="<li>"&succtitle"</li>"  
  67. succeed Message,""  
  68. %>  
  69.   
  70. 第231行到第235行代码如下  
  71. Rs.open "select * from ["&TablePrefix"Posts] where ThreadID="&ThreadID" and PostID="&ho"",Conn,1,3  
  72. if not Rs.eof then  
  73. Rs("Visible")=2  
  74. Rs.update  
  75. if Rs("ParentID")=0 then Execute("update ["&TablePrefix"Threads] Set Visible=2 where ThreadID="&Rs("ThreadID")"")  

可以看到ThreadID,没有经过任何过滤变放入查询 导致漏洞发生



解决方案:
厂商补丁:
BBSxp 2008
----------
目前厂商已经发布了升级补丁以修复这个安全问题,请到厂商的主页下载:
http://www.bbsxp.com/

信息来源:
<*来源:Bug.Center.Team http://www.cnbct.org/ *>