论坛,英文翻译是Forum,作为网络上必不可少的交流平台。在网站中有着举足轻重的地位,大家知道论坛的种类相当多。ASP、CGI、PHP、JSP甚至C++开发的,而品牌更是数以百计,正是这样,每个论坛都存在着这样那样的问题,其中安全问题又尤为突出。有不少网站就是因为论坛出了问题而导致服务器被渗透,在安全上怎么重视都不过份!由于我使用ASP论坛比较多,所以谈谈ASP论坛。
给开发者的建议
数据库问题
数据库似乎是每个使用者都比较头疼的问题,被下载、被泄密。其实开发者多下些工夫。数据库采用MD5加密(兼容行下降,自己平衡吧)。这样泄密问题就得到了很好的解决,不管是谁。通过什么途径看到数据,都是加密过的字符串,最大限度的解决了数据库泄密的问题,这点动网做得很好,值得其他论坛借鉴。然后就是防下载了。在数据库中加一个表,因为我不擅长描述,所以大家可以直接下载动网论坛V5.0 0519 sp3(URL:http://www.aspsky.net/download/list.asp?id=2178),里面有这样一个数据库,导入里面的那个notdownload表(大家可以自己研究构造,其实我自己也说不清楚,呵呵),然后就把数据库的扩展名改为.asp就可以防下载了,即使知道数据库路径,下载也是500错误。这个应该由开发者做的。
密码验证问题
密码是系统的首席看门官,大部分的攻击都是截获或猜解密码开始的,所以对于登陆的规定还有需要验证的地方的防范一定要做好。开发者应该限制密码的最小长度为8,最好加入随机验证码,限制登陆失败的次数,如果输入用户名、密码、随机验证码错误导致登陆失败3次后,就会自动关闭,另外,提示密码错误的消息不宜显示在HTML页面里,而应该由谈出消息框来显示出错信息,这几个措施都能有效的防止溯雪这一类工具暴力破解,这类工具的原理是判断页面源代码中的某一标签进行破解的,一般是先获取错误页面的的某个标签,然后提交数据,拿返回的数据和刚才获取的错误标签进行对比,如果遇到了和错误标签不同的标签。则视为正确的,只要了解原理了,就知道上面的三种措施是多么有效。还有尽量不要在页面显示密码。比如在快速回复的地方查看原代码。找到类似的 “密码 ”地方。其中“***********”就是密码了。这样用户登陆后。离开一下,别人马上查看原代码就可以看到密码了,非常不安全啊!其实通过Cookies和Session判断也是有一定缺陷的。Session完全保存在服务器端,是绝对安全的。所以只有开发者平衡一下了。选个折中的方法,还有也尽量少用type=hidden来隐藏信息。会HTML的人一看就知道了。不过如果像刚才所说的采用MD5加密,就不会看到真实的密码了。查看原代码的时候就只是value="f3b4sd5f47fh49ah3"。(此字符串已经改过)
UBB解析问题
相当多的留言本和论坛都存在这样的问题,比如
![](/images/load.gif)
![](/images/load.gif)
![](/images/load.gif)
document.write('');里面的单引号'' 和句点.要用ASCII转换,否则对稍有过滤的程序就不会生效。里面可以写任何代码。修改注册表、格式化硬盘……如果UBB过滤得好,就没事。
看懂的朋友觉得严重吗?下面付上一段处理脚本字符的代码。仅供参考。也许有错误和遗漏。
Function JScode(JSstr)
dim jsstr:jsstr=jsstrs
if jsstr="" or isnull(jsstr) then JScode"":exit function
if not isnull(JSstr) then
dim ts
dim re
dim reContent
Set re=new RegExp
re.IgnoreCase =true
re.Global=True
re.Pattern="(javascript)"
ts=re.Replace(JSstr,"javascript")
re.Pattern="(jscript:)"
ts=re.Replace(ts,"jscript:")
re.Pattern="(js:)"
ts=re.Replace(ts,"js:")
re.Pattern="(value)"
ts=re.Replace(ts,"value")
re.Pattern="(about:)"
ts=re.Replace(ts,"about:")
re.Pattern="(file:)"
ts=re.Replace(ts,"file:")
re.Pattern="(document.cookie)"
ts=re.Replace(ts,"documents.cookie")
re.Pattern="(vbscript:)"
ts=re.Replace(ts,"vbscript:")
re.Pattern="(vbs:)"
ts=re.Replace(ts,"vbs:")
re.Pattern="(on(mouse|exit|error|click|key))"
ts=re.Replace(ts,"on")
re.Pattern="()"
ts=re.Replace(ts,"")
JScode=ts
set re=nothing
end if
End Function
SQL Injection漏洞的问题
SQL Injection的原理是利用用户提交或可以修改的数据,把想要的SQL语句插入到系统实际SQL语言当中,从而达到入侵的目的,知道原理后,开发者就应该做好预防工作了,需要从根本上解决解决SQL Injection问题。还得从程序本身入手。过滤不能单纯的过滤URL所提交的参数,在表单里的也要过滤,value=后面的可以修改的数据,修改后可以提交到服务器,总之对所有的表单提交的数据以及用户可能对HTML源文件进行修改来控制的所有来自Web服务器外部的数据进行过滤或转换,(我不擅长表达,此话改自isno的一句话,谢谢isno)对单引号、双引号、分号“--”还有对数字键上面的所有特殊字符进行过滤,还有QUERY_STRING环境变量。我敢说仅仅这样还是不够的。就算有防火墙和IDS(入侵检测系统)对特殊字符进行过滤。我们还是可以用分组排列的方法,拆分命令字符串,存进一个临时变量,然后再引用,如下面的两句命令一样。就有可能饶过检测,我们学校就是用这个方法攻破的,许多商业公司都购买了IDS,并且在IDS中过滤xp_cmdshell等等一大串恶意的字符,我们如何提交自己命令呢,我们只要通过以下这种排列组合的方式我们可以突破IDS的检测:
declare @a sysname set @a='xp_'+'cmdshell' exec @a 'dir c:\'
declare @a sysname set @a='xp'+'_cm’+’dshell' exec @a 'dir c:\'
所以开发者就要想办法在数据提交前在程序里就处理掉。更多的SQL Injection资料请查看微软台湾站点(URL:http://www.microsoft.com/taiwan/SQL/SQL_Injection_G1.htm)
文件上传问题
曾经有过这样的一件事,一个动网论坛的管理员密码通过某方法被入侵者获取,然后入侵者设置允许上传ASP文件,结果利用一个cmdasp后门渗透整台服务器。所以,开发者最好不允许使用者设置可以上传ASP文件,即使设置也无效。也就是固定不允许上传ASP文件,如果一定要上传。最好加个对文件内容检测的功能。比如检测文本文件内容里是否存在危险命令,如果存在则禁止上传,有时上传的大都是大文件,而且是二进制的,判断非常麻烦,比较耗资源。但是安全重要还是资源重要?开发者可以自己决定!或者投票调查。下面给出ypy的一段代码:这是主要代码。开发者自己去完善吧。在此特别感谢ypy。
set MyFile = server.CreateObject ("Scripting.FileSystemObject")
set MyText = MyFile.OpenTextFile (sFile, 1) ' 读文本文件
sTextAll = lcase(MyText.ReadAll): MyText.close
'判断用户文件中的危险操作
sStr ="8|.getfolder|.createfolder|.deletefolder|.createdirectory|
.deletedirectory"
sStr = sStr & "|.saveas|wscript.shell|script.encode"
sNoString = split(sStr,"|")
for i = 1 to sNoString(0)
if instr(sTextAll, sNoString(i)) 0 then
sFile = Upl.Path & sFileSave: fs.DeleteFile sFile
Response.write ""& sFileSave &"文件中含有与操作目录等有关的命令"&_
""& mid(sNoString(i),2) &",为了安全原因,不能上传。"&_
""
Response.end
end if
next
头像问题
看过我网站上的那篇《由一个恶作剧网页联想到的安全问题》的都知道,如果写好一个有HTML代码的页面,当然也可以有javascript代码,把扩展名改为.jpg、.gif、.png,在低版本的IE中,照样执行,还有大家熟悉的BMP木马,这样,只要用户浏览就有被格式化硬盘的危险,因此,我的建议是最好不要让用户自己定制头像,不允许上传和引用,对于选择论坛自带头像的时候,只允许用户选择编号,而不让用户看到图片地址,看到地址就意味着有可能修改源代码来达到引用的目的,这点LeadBBS做得不错。其实帖图功能也差不多,不过这毕竟要浏览帖子才中招,安全和功能是成反比的。这点由开发者自己平衡一下,或者最干脆的方法是不要头像,还有帖子里显示的是一个图片的URL。
功能上的问题
可能我的看法有些极端,但作为安全技术爱好者,我知道安全上怎么重视都不过份,所以我还是把我的看法和大家交流一下,论坛产生的原因就是为了满足网友们有个互动式交流平台的需要,仅仅是交流。因此论坛不管如何扩展功能,装插件,都是比不上社区的,何况相当多的娱乐功能