警惕的Lida:安全测试自动化

下午好,亲爱的读者们。 我叫Victor Burov,我是ISPsystem的一名开发人员。 在上一篇文章中,我谈到了用于创建自动测试的工具 ,今天,我将分享自动化安全测试的经验。



最初,产品的漏洞是由另一名员工搜索的。 手动测试花费了很多时间,并不能保证会发现所有漏洞。 确定了测试的基本规律后,我们得出结论,它可以自动化。 然后,我们决定编写一个实用程序,该实用程序将简化测试人员的生活,节省其时间,并允许您在每次更改后检查产品。 由于测试人员叫Lida,我们以她的名字命名了新应用程序。 通常,在我们公司中,以测试人员的名字来调用测试工具已成为一种传统。

在分析了漏洞搜索实用程序后,我得出的结论是,它们都需要指定要调用的函数和所使用的参数。 我们再次决定利用统一界面并制定了Lida的要求。

启动要求:


  1. 自动生成功能列表。
  2. 自动完成选项。
  3. 发出API请求。
  4. 执行功能后分析数据输出。
  5. 搜索数据中的漏洞。
  6. 形成报告。
  7. 灵活的设置。

要实现所有这些并不容易。

实作


绕过表格和列表


要查找功能中的漏洞,必须通过传递必要的参数来执行。 我们的界面是基于列表和表单构建的,因此您可以通过处理描述界面元素结构的xml文档来自动执行数据收集。

我决定从主菜单开始抓取,然后递归进入所有嵌套列表。 “ Lida”打开第一级的列表。 通常,它具有几个调用某些功能的按钮。

如果按钮打开表单,则调用的结果将是一个xml文档,其节点包含有关以下字段的信息:名称,验证器,有效值范围。 根据此信息,生成字段值。 例如,将为int生成一个数字。 如果没有验证器,则会生成一个随机字符串。 填写表格的所有字段后,发送请求。

如果该函数是列表,则它将打开,并且将为其元素调用与按钮关联的函数。

检查列表时会出现问题-所有列表必须具有一组记录,以确保列表中的所有按钮都是可单击的。

SQL注入搜索


SQL注入可能是包括我们在内的应用程序最常见的问题之一。 许多函数调用会生成各种DBMS查询。 当将来自外部的参数“按原样”替换到请求正文中时,将发生错误。 此类错误的后果可能令人悲伤:从未经授权的数据接收到删除表。

为了开始搜索SQL注入,我将所有SQL查询的输出组织到一个文件中。 执行该函数后,应用程序在结果SQL查询中搜索传递的参数的值。

您可以使用SQL Server本身的日志。 但是在我们的情况下,只有一种方法可以执行查询并向其中添加日志记录并不困难。 多亏了这一点,我们才确切知道是什么挑战导致了这个或那个请求。

找到传递的参数的值后,实用程序会将包含单引号的值传递给该参数。 如果以相同的顺序找到引号,则不会转义该参数-我们找到了SQL注入的地方。

系统调用分析


当我们进行任何系统调用时,都会发生类似的问题。 我决定使用strace查找它们,并为其选择最佳的启动参数。 启动ISPmanager的示例:

strace -f -s 1024 -e trace=file,process bin/core ispmgr 

与SQL注入一样,Lida执行函数并分析strace输出以在open,unlink,rmdir,chmod chown,chflags,mknod,mkfifo,fcntl,symlink,link,execve,mkdir函数中查找传递的参数值。

如果找到该参数,则实用程序将向其传递一个值,例如,该值包含具有到以上目录的过渡的路径。 如果按原样获得,则将发现潜在的漏洞。

事实证明,对execve函数的分析非常有用。 它允许您确定在哪些函数参数中运行可执行文件不会被转义。 该错误的代价非常高,因为通过此错误,您只需更改密码即可获得对服务器的root访问权限。

当用户在我们的产品中发现漏洞时,公司将支付现金奖励,金额取决于漏洞的类别。 这种方法可能比自己查找错误要便宜(测试人员可能找不到错误并获得薪水)。

另一个有趣的测试:检查调用stat函数和其他函数的顺序。 通常,先通过stat检查访问权限,然后再进行一些不安全的操作,从而有机会进行替换。 但是我们没有实现此自动化。

检查是否有异物进入


我们从用户下方检查对其他用户和管理员实体的异物访问。 在这种模式下,我们检查读取,修改和查看外部用户元素列表的能力。

Lida绕过代表所有者或管理员可用的所有功能,并记住其元素。 然后,它将使用另一个用户下的元素调用相同的功能。 在理想情况下,答案应该是错误,例如访问或丢失。 因此,如果未收到此类错误,则很有可能您可以读取其他用户的数据。

在某些情况下,没有错误并不意味着您可以直接访问其他用户的对象。 在此类功能的开头,我们添加了元素权限检查。 这不仅检查安全性,还检查服务器响应的正确性。

API验证


验证我们的API是漏洞检查功能的额外好处。 通过分析Lida的工作报告,我们学会了返回正确的错误类型,从而使我们的API更加方便和合乎逻辑。 结果,与磁带录音机一样,我们不仅收到了安全检查,还再次检查了我们的API的“一致性”。

难点


误报


该实用程序可以与我们所有的产品一起使用,因此,它检查许多不同的功能。 基本上,在检查对异物的访问方式中出现了误报。 这是由于按钮和功能的特征。

误报是Lida面临的最大问题。 似乎已经完全调试,但是在不同面板上进行检查时,出现了新的误报。 结果,有几个阶段的校正。

实体创作


面板中的大多数操作都是在任何实体(域名,数据库等)上执行的。 为了实现最大程度的自动化,Lida必须自动创建这些实体。 但是实际上这很难实现。 有时验证是通过代码执行的,因此并非总是能够自动替换参数值。 第二个原因是从属实体。 例如,要创建邮箱,您需要创建一个邮件域。

因此,我们决定不为完全自动化而战。 在开始之前,测试人员将手动创建实体并拍摄机器快照,因为实体将在验证后更改。 这样,在创建实体失败的情况下,您可以不跳过检查一组功能。

调用破坏性函数


几乎每个列表都具有删除或关闭实体的功能。 如果按顺序执行它们,则在执行其他功能之前将删除该实体。 我定义了此类功能并在其他功能之后执行。 另外添加了一个禁止执行此类功能的键。

某些功能会重新引导服务器。 必须跟踪它们并将其添加到忽略列表中。

由于操作逻辑的性质,某些功能会重新启动面板。 在安全测试期间,这将导致面板启动而不会跟踪SQL查询或strace-进一步的验证变得毫无意义。 您必须对此进行跟踪,然后以跟踪模式重新启动面板。

检查相关参数


在表单上,​​存在用于输入文本,复选框,下拉列表的字段,其他字段的值取决于这些字段的值。 从属字段的每个值都可以有一个单独的代码段,因此,这些部分可能保持未经验证。

为了解决此问题,我添加了用于分析从属字段并检查从属控件的所有组合的算法。

检查界面中不可用的功能


服务功能不可用于过渡,但可能包含漏洞。 为了识别和验证它们,我们有一个特殊的函数,该函数返回所有已注册函数的列表。 我们将此列表与经过测试的功能列表进行比较。 服务功能没有元数据,因此无法验证其中处理的参数,为了以某种方式验证这些功能,我将标准参数elid,plid等传递给它们。

结论


我们在詹金斯(Jenkins)的每个晚上建造中都包括了Lida。 根据其工作结果,将生成验证报告,并使用所有参数显示其中的可疑功能信息。

现在,不仅由测试人员检查,而且由Lida检查由开发人员关闭的任务。 测试人员将处理收到的报告:将可疑功能的参数复制到浏览器,并分析行为和日志面板。 如果漏洞被确认,该错误将记录到开发人员中。

Source: https://habr.com/ru/post/zh-CN426969/


All Articles