安全测试简介

image.png

image.png

(一)安全测试介绍

1. 什么是安全测试

安全测试是指,在软件产品的生命周期中,检验产品是否符合安全需求定义的过程。简言之,安全测试其实就是一个发现软件安全漏洞的过程,旨在保护软件系统的数据与功能。

一个完整的 WEB 安全体系测试可以从部署与基础结构,输入验证,身份验证,授权,配置管理,敏感数据,会话管理,加密,参数操作,异常管理,审核和日志记录等几个方面入手。

2. 为什么要做安全测试

目前 WEB 应用越来越广泛, WEB 安全威胁也就更明显。

安全测试对于系统或者软件来说非常重要,因为充分的安全测试可以发现系统中存在或潜在的安全漏洞,并对系统的漏洞进行加固,使之不被非法入侵。

(二)常见安全漏洞

漏洞可以被定义为任何系统的弱点( Vulnerability ),入侵者或 Bug 可以通过该系统进行攻击。如果系统没有严格执行安全性测试,那么漏洞的机会就会增加。

1. 登陆中的漏洞

1)弱密码

  • 如果存在类似 “123456” 这样的弱密码,则可以通过暴力破解的方式获取简单的弱密码,从而得以成功登陆系统。

2)登陆信息提示过于精准

  • 登陆失败时应提示“用户名或密码错误”,而不是精确提示“用户名错误”或“密码错误”。

3)没有限制登陆失败次数

  • 登陆失败后需要自动刷新验证码,达到一定失败次数后需要限制登陆(防止爆破操作获取密码)。

4)没有 Session 值检查

  • 登入登出前后,Session 值应该发生变化。

5)验证码

  • 登陆失败后验证码应自动刷新。
  • 检查超过有效时限和已经使用过的验证码是否过期。
  • 尽量使用图形验证码。
  • 验证码和用户名、密码应放在一起校验。

2. 跨站脚本攻击( Cross-site scripting,XSS )

1)漏洞原理

攻击者在 WEB 页面中插入恶意的 Script 代码,当用户浏览该页面时,插入的 Script 代码会被执行,从而达到了攻击的目的。

2)分类

  • 存储型 XSS :指修改系统提交的文本框中的数据,并将其保存到数据库。当页面再次加载时,页面或js会解析这份数据,执行脚本。
  • 反射型 XSS :指修改GET请求中的参数,把正常的参数改为带有攻击脚本的参数,页面在处理请求后可能会对参数进行解析,从而执行脚本。
  • DOM 型 XSS :通过修改页面的 DOM 节点,对其进行动态的操作如插入、修改页面内容等而形成的 XSS 漏洞。

3)以上三种类型的区别

  • 存储型 XSS :恶意代码存在服务器上,经过后端,不经过数据库。属于服务端的安全漏洞。
  • 反射型 XSS :恶意代码存在 URL 里,经过后端,经过数据库。属于服务端的安全漏洞。
  • DOM 型 XSS :不经过后端,基于文件对象,取出和执行恶意代码由浏览器端完成。属于前端 JavaScript 自身的安全漏洞。

4)预防措施

通过前面的介绍可以得知, XSS 攻击有两大要素:攻击者提交恶意代码、浏览器执行恶意代码。

所以需要从输入到输出都要进行过滤和转义:

  • 输入验证:使用标准输入验证机制,验证所有输入数据的长度、类型、语法以及业务规则。
  • 输出编码:对 HTML ,JavaScript ,CSS ,URL 进行转义。

总的来说,要结合目前的业务需求,从业务风险角度定义每个 XSS 漏洞,针对不同的场景使用不同的方法。

3. 跨站请求伪造( Cross Site Request Forgery,CSRF )

1)漏洞原理[^1]

攻击者(黑客,钓鱼网站)盗用了你的身份,以你的名义发送恶意请求,这些请求包括发送邮件、发送消息、盗取账号、购买商品、银行转账,从而使你的个人隐私泄露和财产损失。

要完成一次CSRF攻击,受害者必须依次完成以下两个步骤:

  • 登录受信任网站A,并在本地生成 Cookie 。
  • 在不登出A的情况下,访问危险网站B。

2)防御措施

  • 验证 HTTP Referer 字段
  • 添加 Token 验证
  • 添加验证码
  • 尽量使用 Post ,限制 Get 请求
  • 双重 Cookie 验证

4. SQL 注入

1)漏洞原理

将 SQL 命令插入到 WEB 表单中进行提交,达到欺骗服务器执行恶意 SQL 的目的。

2)举例说明

比如有一个查询用户信息的功能,但是只有查询部分用户的权限,正常的 SQL 如下:

select * from table_user where username = ``'xxx'``;

但是我想查询其他用户的信息,可以通过构造以下 SQL 达成目的:

select * from table_user where username = ``'xxx'` `or ``'1'``=``'1'``;

由于'1'='1'返回的结果永远是 true ,所以这条sql语句绕过了 username ,执行了全部查询的操作。

5. 越权漏洞

1)漏洞原理

一个正常的用户A通常只能够对自己的一些信息进行增删改查。但是由于程序员的疏忽,对信息进行增删改查的时候没有进行权限的判定,判断所需要操作的信息是否属于对应的用户,导致用户A可以操作其他人的信息。

2)分类

越权分为水平越权,垂直越权 和交叉越权。

  • 水平越权:通过拦截请求,修改id等操作,越权访问了其他 具有相同权限的用户数据。

  • 垂直越权:通过拦截请求,修改id等操作,越权访问了当前用户没有权限访问的地址,权限低的用户可以访问到权限较高的用户。

  • 交叉越权:即有水平越权,也有垂直越权。

[^2]

3)预防措施

  • 双重验证机制:前后端需要同时对用户输入信息进行校验。
  • 鉴权:执行关键操作前必须验证用户身份及是否具备操作数据的权限。
  • 与用户交互:特别敏感操作可以让用户再次输入密码或其他的验证信息。
  • 输入验证:对可控参数进行严格的检查与过滤,永远不要相信来自用户的输入。

6. 文件上传/下载漏洞

1)漏洞原理

  • 文件上传:系统对上传的文件的后缀名没有校验,或者服务器存在执行文件中的代码的漏洞。攻击者可以上传 Shell 脚本或带有 Shell 脚本的图片,使脚本被服务器执行,隐蔽的在服务中为所欲为。
  • **文件下载:**查看文件下载的链接,如果链接中直接显示了文件名,如 http://xxx/xxx/filename=abc ,可以修改文件名abc为其他配置文件,如 .../.../WEB-INF/web.xml 。

2)预防措施

  • **文件上传的目录设为不可执行:**只要 WEB 容器无法解析该目录下面的文件,即使攻击者上传了脚本文件,服务器本身也不会受到影响。
  • **判断文件类型:**在判断文件类型时,可以结合使用 MIME Type 、后缀检查等方式。在文件类型检查中,强烈推荐白名单方式此外,对于图片的处理,可以使用压缩函数或者 Resize 函数,在处理图片的同时破坏图片中可能包含的 HTML 代码。
  • **用随机数改写文件名和路径:**文件上传如果要执行代码,则需要用户能够访问到这个文件。在某些环境中,用户能上传,但不能访问。如果应用了随机数改写了文件名和路径,将极大地增加攻击的成本。

(三)我们能做什么

常见安全漏洞的种类非常多,涉及面比较全,相对应的安全测试方法也很多。安全其实是一个比较抽象的概念,越抽象的概念描述的范围越广。

那我们如何入手进行日常版本中的安全测试?如何提升我们产品的安全系数?如何提升我们自身的安全测试意识和能力?

以下给出了一些建议,可以供大家参考。

1、版本测试过程中培养 主动分析安全隐患 的意识

正常版本的功能测试通常会模拟普通用户的操作来测试软件,而安全测试则需要模拟恶意用户的操作来测试软件。

以发布商品为例:

  • 正常流程是供应商成功发布了关联某个协议的协议商品。

  • 而恶意用户的操作可能会操作发布 关联了非当前供应商的协议 的协议商品;可能会修改其他供应商的协议商品的某个属性值 或 价格;可能会通过调用审核接口 将非法发布的商品直接审核通过;可能会查看并对比其他供应商的价格,造成信息泄漏;可能会恶意冻结其他供应商的协议商品 等等;

  • 还有某些校验场景如果只有前端校验没有后端校验,那恶意用户可能会通过接口绕过前端校验 产生异常数据。

以上只是特定的例子,其他场景还需具体问题具体分析。我们可以培养这种 主动分析安全隐患 的意识,将现有能分析出来的安全问题尽快解决。如果觉得有安全隐患,可以了解下开发的代码实现,更能帮助我们分析隐患是否存在及其严重性。

随着公司业务的扩大,安全问题会逐步显现,应该得到大家的重视。

2、WEB 安全性测试

一个完整的WEB安全性测试可以从部署与基础结构、输入验证、身份验证、授权、配置管理、敏感数据、会话管理、加密、参数操作、异常管理、审核和日志记录等几个方面入手。

  1. 部署与基础结构[^3]
    
  • 网络是否提供了安全的通信
  • 部署拓扑结构是否包括内部的防火墙
  1. 输入验证
    
  • 是否清楚入口点
  • 是否清楚信任边界
  • 是否验证Web页输入
  1. 身份验证
    
  • 是否区分公共访问和受限访问
  • 如何验证调用者身份
  1. 敏感数据
    
  • 是否存储机密信息
  • 如何存储敏感数据
  1. 参数操作
    
  • 是否验证所有的输入参数
  • 是否在参数过程中传递敏感数据
  1. 异常管理
    
  • 是否使用结构化的异常处理
  • 是否向客户端公开了太多的信息

3、使用专用的测试工具

在了解安全漏洞的种类后,我们在具体做安全测试的时候会发现,模拟恶意用户的行为并没有那么容易,因为系统的前端会给我们很多的屏障,已经前置校验住了。但是恶意用户可不总都是乖乖从系统前门进去的。

我们可以在系统界面上执行功能测试的用例,用这些工具来获取http请求,篡改后发送给后台服务器。这时候,使用一些工具,比如 OWASP ZAP 、Burp Suite 等是非常有帮助的。有了这些实用又比较容易上手的工具,就可以模拟很多恶意用户的操作场景了。

还有一些扫描的工具,可以自动扫描出现的漏洞,一般都是经典漏洞,业务场景的安全隐患还是需要大家利用上述工具去发现的。

参考资料:

www.jianshu.com/p/855395f96… zhuanlan.zhihu.com/p/130919069 cloud.tencent.com/developer/n…

推荐阅读

Guava Cache实战—从场景使用到原理分析

详解 HTTP2.0 及 HTTPS 协议

微信公众号

文章同步发布,政采云技术团队公众号,欢迎关注

image.png