给论坛开发者和使用者的几点建议
给开发者的建议
数据库问题
数据库似乎是每个使用者都比较头疼的问题,被下载、被泄密。其实开发者多下些工夫。数据库采用MD5加密(兼容行下降,自己平衡吧)。这样泄密问题就得到了很好的解决,不管是谁。通过什么途径看到数据,都是加密过的字符串,最大限度的解决了数据库泄密的问题,这点动网做得很好,值得其他论坛借鉴。然后就是防下载了。在数据库中加一个表,因为我不擅长描述,所以大家可以直接下载动网论坛V5.0 0519 sp3(URL:http://www.aspsky.net/download/list.asp?id=2178),里面有这样一个数据库,导入里面的那个notdownload表(大家可以自己研究构造,其实我自己也说不清楚,呵呵),然后就把数据库的扩展名改为.asp就可以防下载了,即使知道数据库路径,下载也是500错误。这个应该由开发者做的。
密码验证问题
密码是系统的首席看门官,大部分的攻击都是截获或猜解密码开始的,所以对于登陆的规定还有需要验证的地方的防范一定要做好。开发者应该限制密码的最小长度为8,最好加入随机验证码,限制登陆失败的次数,如果输入用户名、密码、随机验证码错误导致登陆失败3次后,就会自动关闭,另外,提示密码错误的消息不宜显示在HTML页面里,而应该由谈出消息框来显示出错信息,这几个措施都能有效的防止溯雪这一类工具暴力破解,这类工具的原理是判断页面源代码中的某一标签进行破解的,一般是先获取错误页面的的某个标签,然后提交数据,拿返回的数据和刚才获取的错误标签进行对比,如果遇到了和错误标签不同的标签。则视为正确的,只要了解原理了,就知道上面的三种措施是多么有效。还有尽量不要在页面显示密码。比如在快速回复的地方查看原代码。找到类似的 “密码 <input maxlength=20 type=password name=Pass value="***********" size="20">”地方。其中“***********”就是密码了。这样用户登陆后。离开一下,别人马上查看原代码就可以看到密码了,非常不安全啊!其实通过Cookies和Session判断也是有一定缺陷的。Session完全保存在服务器端,是绝对安全的。所以只有开发者平衡一下了。选个折中的方法,还有也尽量少用type=hidden来隐藏信息。会HTML的人一看就知道了。不过如果像刚才所说的采用MD5加密,就不会看到真实的密码了。查看原代码的时候就只是value="f3b4sd5f47fh49ah3"。(此字符串已经改过)
UBB解析问题
相当多的留言本和论坛都存在这样的问题,比如可以显示一张图片,但如果代码转换不好,就可能被执行跨站脚本,最简单的测试方法就是提交这样的信息,(标签视程序而定),如果弹出一个对话框就说明存在此漏洞,有的虽然已经过滤了。但可能把提交的信息转换为ASCII代码,还是有可能执行跨站脚本的,跨站脚本的危害不定,可以弹出一些信息来,如果HTML代码不过滤好。可以修改主页的格局;更有攻击者,写个窃取用户的COOKIES资料的脚本引导用户访问,最惨的还可能格式化浏览者的硬盘。下面又是一个简单的例子。
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$2")
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 "<center><br><big>"& sFileSave &"文件中含有与操作目录等有关的命令"&_
"<br><font color=red>"& mid(sNoString(i),2) &"</font>,为了安全原因,<b>不能上传。<b>"&_
"</big></center></html>"
Response.end
end if
next
头像问题
看过我网站上的那篇《由一个恶作剧网页联想到的安全问题》的都知道,如果写好一个有HTML代码的页面,当然也可以有javascript代码,把扩展名改为.jpg、.gif、.png,在低版本的IE中,照样执行,还有大家熟悉的BMP木马,这样,只要用户浏览就有被格式化硬盘的危险,因此,我的建议是最好不要让用户自己定制头像,不允许上传和引用,对于选择论坛自带头像的时候,只允许用户选择编号,而不让用户看到图片地址,看到地址就意味着有可能修改源代码来达到引用的目的,这点LeadBBS做得不错。其实帖图功能也差不多,不过这毕竟要浏览帖子才中招,安全和功能是成反比的。这点由开发者自己平衡一下,或者最干脆的方法是不要头像,还有帖子里显示的是一个图片的URL。
功能上的问题
可能我的看法有些极端,但作为安全技术爱好者,我知道安全上怎么重视都不过份,所以我还是把我的看法和大家交流一下,论坛产生的原因就是为了满足网友们有个互动式交流平台的需要,仅仅是交流。因此论坛不管如何扩展功能,装插件,都是比不上社区的,何况相当多的娱乐功能根本用不着。还有一些用户参数。比如魅力、金钱、威望、等级这些东西,本来交流就是人人平等的,关注这些数据还不如去完RPG游戏,有些插件也有着这样那样的问题,本着实用、够用的原则,就如中国Linux论坛(URL:http://www.linuxforum.net/forum/categories.php),强烈建议大家去参观一下。还有,作为论坛开发者,应该为使用者多着想,后台功能应尽量做的强大,完善,就像动网、VBB那样,外国的论坛这方面都做得不错,而前台只要功能完整就可以了,就像中国Linux论坛那样,不要给论坛用户过多的操作。也许作为技术爱好者的我不能理解娱乐性论坛的需求,请大家不要介意。
其他
CGI和PHP论坛我接触不多,CGI论坛我2年前用过,所以我也不发表什么看法了,我认为动网论坛是最好的ASP论坛,经过前段时间众多高手的安全检测,修正了大多数致命漏洞。任何论坛都是经过检测安全性才会进一步提高,动网已经是走在相当前面了。
给使用者的建议
其实,使用者最突出的问题就是安全意识太低,这种情况在搞安全站点的人里面不多见,但普遍存在与非技术网站,比如论坛补丁不及时打,对论坛的功能、性能、速度和美观的关注程度大于安全性,甚至说对安全性不屑一顾,在动网官方论坛上常见到这样的帖子“我被黑啦”……每碰到这样的帖子我就会去看,大多数是娱乐性网站,说了这么多,我给大家的建议就是仔细设置好论坛,给用户最小的权限,论坛的权限、用户组的权限,按需分配,本着实用、够用的原则,不同的论坛,有不同的安全标准,或者说是安全级别,对于一个站点来说,论坛就像一个操作系统。如果出现了漏洞,而官方又没有出补丁,最好的补救办法是改变论坛的目录,仅仅关闭是不够的,因为出问题的文件仍存在。更多的建议请看我写的《打造最强劲的论坛》。上面很详细的介绍了关于论坛的安全配置和优化。
Tags:
作者:郁郁小蝎评论内容只代表网友观点,与本站立场无关!
评论摘要(共 0 条,得分 0 分,平均 0 分)
查看完整评论