Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1202975
  • 博文数量: 272
  • 博客积分: 3899
  • 博客等级: 中校
  • 技术积分: 4734
  • 用 户 组: 普通用户
  • 注册时间: 2012-06-15 14:53
文章分类

全部博文(272)

文章存档

2012年(272)

分类: 网络与安全

2012-06-26 10:19:45

今天准备炮轰Blacklist

做安全的大多知道黑名单和白名单两种思想,也知道白名单会比黑名单更安全。

最近的两个例子正好再次说明了这一点.

首先是前两天HD Mooreblog提到的PHP safe mode的问题

PHP Safe Mode
如果开启的话,会禁止一系列的有危害PHP函数的执行,是一个黑名单的机制,类似被禁止的函数有 system()passthru() 等很多。官方的思路是希望在共享环境下解决一些安全问题,对黑客来说,如果safemode开启,一些函数被禁止,PHP Webshell就更难写了。

但是一直以来,我们看到了层出不穷的PHP Bypass Safe Mode 的方法

PHP的开发者近日也承认,尝试在PHP层面用Safe Mode解决这个问题是不太靠谱的,因为很多东西都和系统关系太紧密了。一些模块的函数可能导致从系统层面绕过Safe Mode.

Safe Mode 使用的黑名单机制,导致只要有一个bug,整个安全机制就会完全失效。

The PHP safe mode is an attempt to solve the shared-server security problem. It is architecturally incorrect to try to solve this problem at the PHP level, but since the alternatives at the web server and OS levels aren't very realistic, many people, especially ISP's, use safe mode for now. 

所以,在PHP 6.0.0 里,已经移除了 Safe Mode


此外今天黑哥在群里又推荐了篇blog,提到urlscan最近更新了,因为作者发现了一种绕过urlscan的方法

就是在SQL 语法中插入 %

%
后面如果跟正确的16进制数,会被ASP正确的decode,如果后面跟的不是,则会丢弃掉%

ASP drops a percent sign from the query string if it isn't followed by two valid hex characters(0-9, A-F) when it actually interprets it via Request.QueryString. This means that any filter that inspects raw headers using Request.ServerVariables is going to miss "DEC%LARE" if it is looking for "DECLARE" but, on the other hand, the ASP app that actually consumes that string using Request.QueryString("abc") is going to get it without the percent sign.

这个特性就导致了攻击者使用 DEC%LARE 这种方式来绕过一些 filter ,但是在ASP程序里又会去掉% 这也是一个系统层级之间对数据理解的差异性导致的安全问题,类似字符集漏洞。

又是一个bug就绕过了黑名单!所以urlscan更新了。

基于黑名单的安全应用会把黑名单变的越来越长,因为需要考虑到越来越多的情况。长的黑名单更容易影响到性能。

由此看来,黑名单,是一块典型的鸡肋。

比较好的做法是一开始就使用白名单机制,规范好数据,甚至是把数据拆分到元数据,在展示时候再次进行组装。

白名单需要担心的一个问题就是对用户的行为规定太死,可能会影响到用户的正常需求。如果白名单可以随意扩充,则会越写越长,到最后大家都在白名单里,出现了万恶的通配符 *,惨剧也就会随之而来。

所以好的安全设计,一定要做到 secure by default, 在开始,就做好最坏的打算,尽量用好白名单,不要用黑名单,免得以后改起来还伤筋动骨。

阅读(973) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~