背景
说来惭愧,6 年的 web 编程生涯,一直没有真正系统的学习 web 安全知识(认证和授权除外),这个月看了一本《
Web
安全设计之道》,书中的内容多是从微软官方文档翻译而来,这本书的含金量不高,不过也不能说没有收获,本文简单记录一下我学习 Web 安全方面的笔记。
本文不涉及 IIS、Windows 和 SqlServer 的安全管理与配置,尽量只谈编程相关的安全问题。
最简单的 Web 物理架构
浏览器和服务器的通信采用无状态的HTTP 协议。
通过控制 HTTP 的请求头,可以控制:客户端缓存、Cookie、请求编码、相应编码等。
请求内容向服务器提交数据(POST 和 GET),响应内容向浏览器发送数据。
Cookie 包含在每个请求和响应中,因此客户端和服务器都可以访问到。
一般使用 Cookie 来维护一个浏览器会话(也有其他方式)。
攻击方式总览
Web 软件安全攻击防护
一、浏览器安全攻击
Cookie 假冒
定义
场景
服务器将用户的授权信息存储在 Cookie 中,然后客户端用这些 Cookie 决定导航的显示与否。如果有程序恶意的修改了Cookie,会导致权限提升
攻击方式
注入的 Javascript 代码
使用浏览器调试工具
本机病毒等
防护措施
尽量将 Cookie 设置为 HttpOnly,浏览器伪造不了这种 Cookie
防止 Javascript 注入
隐藏变量修改
定义
非期望的修改隐藏变量
场景
订单的折扣计算完全依赖客户端的某个变量,这个变量是从服务器生成的,所有逻辑都在客户端计算,服务器只是接受最后的计算结果。如果有程序恶意的修改了变量,会绕过某些业务逻辑
攻击方式
注入的 Javascript 代码
使用浏览器调试工具
保护措施
防止 Javascript 注入
关键的功能不要依靠客户端控制,要采用服务器控制
跨站脚本攻击
定义
场景
在博客的评论功能中,如果用户恶意的提交 Javascript 代码,假如这些 Javascript 没有被过滤,极端的情况下,这些代码会劫持所有访问此页面用户的会话,访问和修改任意数据。
攻击方式
注入的 Javascript 代码
使用浏览器调试工具
保护措施
在服务器端验证和过滤恶意输入
开启 ValidateRequest="true"
对输出使用 this.Server.HtmlEncode
二、服务器安全攻击
缓冲区溢出
定义
某些可能输入会导致服务器堆栈溢出,这直接致使服务器不可用。
场景
程序提供了某项计算密集型的功能,此功能没有限制用户输入,用户在有意或无意之间输入了一个非法的值,导致了缓冲区溢出。
攻击方式
非法输入
保护措施
在服务器端验证和过滤恶意输入
采用防伪式编程
认证逃避
定义
某些 URL 没有出现在主页导航界面,系统只对导航页面进行了认证和授权管理,这些没有出现在导航中的 URL 可能被恶意用户给分析出来,直接进行访问。
场景
用户管理分为三个页面:List.aspx、New.aspx,程序只对 List.aspx 进行认证和授权了,某些用户直接访问 New.aspx 执行添加操作。
攻击方式
直接地址访问
保护措施
梳理网站的整体结构,对所有页面进行认证和授权管理
非法输入
(举例说明)
定义
病从口入,祸从口出。很多攻击方式都是因为非法输入导致的
场景
程序只在客户端对输入进行了验证,服务器未做任何验证,恶意的程序可以绕过客户端逻辑直接向服务器提交非法输入,这很容易导致各种安全问题
攻击方式
注入的 Javascript 代码
使用浏览器调试工具
保护措施
在服务器端验证和过滤恶意输入
防止 Javascript 注入
授权逃避
定义
某些 URL 没有出现在主页导航界面,系统只对导航页面进行了认证和授权管理,这些没有出现在导航中的 URL 可能被恶意用户给分析出来,直接进行访问。还有一种可能是:系统只在客户端进行了授权管理,服务器代码并没有进行授权验证,恶意用户很容易就可以逃避授权
场景
当用户没有 Create 权限的时候,系统只是禁用了浏览器按钮,并没有做服务器授权,然后用户使用浏览器调试工具启用了按钮,就可以执行 Create 了
攻击方式
直接地址访问
修改客户端代码
保护措施
梳理网站的整体结构,对所有页面进行认证和授权管理
在服务器进行授权管理
SQL 注入
定义
对于和后台数据库产生交互的网页,如果没有对用户输入数据的合法性进行全面的判断,就会使应用程序存在安全隐患。用户可以在可以提交正常数据的URL或者表单输入框中提交一段精心构造的数据库查询代码,使后台应用执行攻击着的SQL代码,攻击者根据程序返回的结果,获得某些他想得知的敏感数据,如管理员密码,保密商业资料等
场景
服务器程序使用字符串拼接的方式来构造 SQL 语句,这就会导致 SQL 注入攻击的可能
攻击方式
恶意的提交 SQL 片段
保护措施
在服务器端验证和过滤恶意输入
不要拼凑 SQL 参数,采用 DbParameter 设置参数
最小化 SQL Server 访问账户的权限
异常敏感信息泄露
定义
未处理异常直接显示到浏览器,这会导致敏感信息被泄露,对最终用户来说,也会让他们感觉系统不够安全和易用
场景
因为开发原因,在某些场景下浏览器将后端的异常直接显示给浏览器了,如:NullReferenceException等
攻击方式
在调用的最上层,为处理掉全部异常
在调用的下层,为封装合适的异常信息
保护措施
定义合理的异常处理策略
异常一定不能跨越边界直接显示到浏览器
上传攻击
定义
用户恶意的上传外挂、木马和其它程序等
场景
你做了一个上传功能,结果对上传的文件没有做好足够的控制,比如:某些恶意的用户会上传一些恶意的脚本,然后执行这些脚本
攻击方式
上传恶意文件
保护措施
在服务器端验证和过滤恶意输入,如:后缀名限制
对上传后的文件进行扫描和杀毒
抵赖
定义
某些用户由于某些原因,不愿意承认自己执行过某些操作,当然,某些操作可能是他们没有意识的情况下执行的
场景
用户一不小心执行的删除操作,然后立即发现自己操作错误了,然后他打电话给售后,说系统有问题
攻击方式
界面引导不够友好,容易导致误操作,为了推卸责任,进行抵赖
用户恶意的执行操作,然后抵赖
保护措施
提高界面的易用性
关键操作的提醒要足够明显
所有操作要留下操作日志
三、数据库安全攻击
连接字符串暴露
定义
数据库连接字符串中包含用户名和密码,这些信息以明文的形式存储在配置文件中,运维和开发人员都能看得到,随着团队人员的流动,这些敏感信息也会暴露
场景
直接将连接字符串配置在 Web.Config 中,而这个文件没有被加密
攻击方式
未加密连接字符串
未加密配置文件
保护措施
加密连接字符串
加密配置文件
存储数据泄露和篡改
定义
某些敏感信息最终需要被存储在数据库中,如果这些信息被存储为明文,会有很多人员可以看到这些信息,极端情况下,某些黑客攻陷了服务器,也可以看到这些数据
场景
为加密密码、关键财务信息,税务局来查账了
攻击方式
未加密敏感数据
加密方法过于简单
保护措施
加密敏感数据
对某些数据采用不可逆加密,如:密码
对某些数据采用可逆加密,如:财务数据
四、网络安全攻击
拒绝服务攻击
定义
恶意用户试图攻击服务器、网络和系统,最终的目的是让系统不可用,停止对外服务
场景
恶意用户在尝试并发的无限制的向服务器发送请求,试图让服务器的负载达到最大,最终让系统停止对外服务
攻击方式
攻击网络
攻击服务器
攻击系统
保护措施
在程序级别,识别并拦截恶意的请求
购买第三方安全软件
传输数组泄露、篡改
定义
恶意的代理服务器或路由器拦截用户的请求,读取或修改敏感数据
场景
您在咖啡馆发现了一个免费的 WIFI,然后偷偷的接入了,您还暗自高兴,当您使用这个免费的 WIFI 进行网上冲浪的时候,您的各种信息都会被 WIFI 给拦截,如果是恶意的用户,结果可想而知
攻击方式
绑架路由器
免费 WIFI 骗局
为加密的传输协议
未加密的传输数据
保护措施
加强客户端路由的安全管理
慎重的选择代理服务器
使用安全的传输协议,如:SSL
备注
这篇算是安全方面的 Hello,World了,今后好好好学习一下安全方面的知识,目前找到了两个好的资源,如:
Security in the .NET Framework
.NET Security Overview
领取专属 10元无门槛券
私享最新 技术干货