Web 应用程序的程序常见安全防范
前些时间去面试,谈到框架设计中做到的“安全”相关,紧张一时没想起来,也就没有答什么,回头想想,我读书的时候挺喜欢安全技术的,还给杂志投过稿我的文章还上过书本,怎么会对“安全”答不上来呢?现在写一写我对 Web 应用程序的程序几种常见的安全防范的认识。(工作中我发现这些安全知识很多开发人员不知道,导致他们写的代码里没有这一块的意识,懂了你就知道怎么写安全的代码了。)
1.防范CC攻击
所谓CC攻击,被恶意频繁地调用 “后端消耗资源大的接口”,造成服务器负载过高。
防范方法:进行必要的请求来路验证,这其实和 判断访客是机器人、爬虫还是 人类是一样的,方法在于要巧妙,让攻击从猜不到,自然就无法突破你的验证了。
2. 防范XSS这是一个细节问题,在编写代码时,一定要注意客户端提交过来字符串的Encode,你要认为:所以从外部提交过来的数据,都是不可信的,都需要检查。
XSS的危害是很大的,可以做很多的事情,比如XSS“蠕虫感染”、窃取管理员的Cookie从而窃取密码。
补充:
有些情况下,允许使用一定的HTML标签,这时候就需要服务器端去过滤了,保留合法标签,去掉危险的标签,很可能因为标签匹配规则的缺陷,导致非法标签被绕过(前些时间discuz就出了一个这样的漏洞,看了XSS利用代码,我惊叹于发现这个漏洞的人太厉害了)。
然而即使我们做好了全部的过滤,仍 有可能 攻击者精心构造的 XSS利用了 “字符集绕过” 这种方法,绕过了你的过滤,所以字符集问题我们也要考虑进去。
还有就是要考虑各个浏览器的情况,一一测试,如这段代码:
Hello,darklx </xss style="x:expression(alert('SHINE darklx'))">
它在IE8下没有效果,但是在IE7下,却是可以执行的:
出此之外,利用"< "<"全角半角之差异,可以绕过你的过滤,但是在有的浏览器下,他仍可以被解析为HTML标记。
3.文件包含
这个问题在php中是很常见的,根据客户端传来的参数,去包含对应的文件,一定要做好参数的判断和过滤,否则很可能被攻击者利用并提权。
4. 任意文件下载
有的论坛程、博客序提供附加下载功能 ,通过一个类似 fileRead.aspx?path=xxx这样的方式,一定要限定允许 fileRead.aspx 访问的目录,否则攻击者可以构造恶意参数(如.../..\类似这的跳级路径命令),下栽任意文件(比如下载 config 文件,查看里面的数据库连接字符串)。
5.Session 劫持
通过伪造 Wi-Fi 等手段嗅探内网的 http 请求后得到管理员的请求信息,从 Cookie 里得到 SessionId 就可以劫持了。
然后替换成管理员的用户名和密码md5,就能成为管理员身份了。
6. 对上传文件的处理
A.仅判断文件的类型是不够的,文件类型可以伪造HTTP头mime-type ,如果我们只对 文件类型( mime-type )进行验证,攻击者只需伪造HTTP头就可上传任意文件,如果上传的是一个 aspx 或者 php 文件,并且能够想办法得到上传后文件的 http 访问路径,就能够执行上传的文件里面的代码了。
所以我们还应对文件的扩展名进行验证。
最后还有一点,为了保证绝对的安全性,我们干脆将客户端传来的文件扩展名舍弃(即使是.jpg、.gif),在ASP.NET下,将扩展名都改为“.config”,这样攻击者无论使用何种手段,都不能直接地执行了。
B.限制客户端向服务器创建文件夹名称的格式
老问题,IIS6有一个目录解析的BUG,如果有一个abc.asp的文件夹,那么这个文件夹下的所有文件都会被当中asp执行。
7.SQL注入
老生常谈了,SQL 注入可以用工具几乎全自动化检测的,有的产业化的黑客团队还有系统平台自动化做入侵检测,自动化入侵、挂马,发布在公网上的系统一定要注意 SQL 注入问题,不要觉得是小网站没人会黑不以为意。
8.提取
先只获得了小的权限,然后利用程序的安全缺陷,获得进一步更高的权限。
比如获得了 WordPress 管理员权限后,通过修改主题文件的代码,就可以获得 webshell,通过 webshell 就可以获得数据库连接字符串信息等,然后通过 webshell 连接数据库,就可以整个脱裤了。如果数据库的密码是一个管理员的常用密码,那就更危险了。
所以现在知道怎么攻击的,就知道怎么去防范应对了。