第1部分 代码审计前的准备(1-2)

代码审计

代码审计的概念 (前言)

代码审计是指对源代码进行检查,寻找代码中的bug(漏洞)。

代码审计需要多方面的技能:

  • 对编程的掌握
  • 对漏洞形成原理的理解
  • 对系统和中间件的熟悉

黑盒测试、白盒测试和灰盒测试 (前言)

黑盒测试也叫功能测试,是指不接触代码的情况下,测试系统的功能是否有bug,是否满足设计要求。

灰盒测试是介于白盒测试与黑盒测试之间的一种测试,灰盒测试多用于集成测试阶段,不仅关注输出、输入的正确性,同时也关注程序内部的情况。(书上没有)

白盒测试就是我们所说的代码审计,以开放的形式从代码层面上寻找bug,如果发现有bug则返回修复,直到没有bug才允许软件发布上线。

代码审计常见思路 P46

逆向追踪,检查敏感函数的参数,回溯变量;正向追踪,跟踪变量传递过程;直接挖掘功能点漏洞

代码审计工具的实现都是基于代码审计经验开发出来的优化工作效率的工具,我们要学好代码审计就必须要熟悉代码审计的思路,只有在了解了这些思路之后,我们才知道如何下手,如何最高效地挖掘到最有质量的漏洞,常见的代码审计思路有以下四种:

  1. 根据敏感关键字回溯参数传递过程
  2. 查找可控变量,正向追踪变量传递过程
  3. 寻找敏感功能点,通读功能点代码
  4. 直接通读全文代码

常见Web漏洞

  • SQL注入
  • XSS 跨站脚本攻击
  • CSRF 跨站请求伪造
  • 文件操作
  • 代码/命令执行
  • 变量覆盖
  • 逻辑处理

PHP核心配置详解 (1.2)

以下五个配置的功能与作用:

1.register_globals(全局变量注册开关)P6-7

该选项在设置为on的情况下,会直接把用户GET、POST等方式提交上来的参数注册成全局变量并初始化值为参数对应的值,使得提交参数可以直接在脚本中使用。

register_globals在PHP版本小于等于4.2.3时设置为PHP_INI_ALL,从PHP 5.3.0起被废弃,不推荐使用,在PHP 5.4.0中移除了该选项。

2.allow_url_include(是否允许包含远程文件)P7

这个配置指令对PHP安全的影响不可小觑。在该配置为on的情况下,它可以直接包含远程文件,当存在include($var)且$var可控的情况下,可以直接控制$var变量来执行PHP代码。

文件包含函数是可以加载远程文件的,这种漏洞被称为远程文件包含漏洞。利用远程文件包含漏洞可以直接执行任意命令。在实际渗透攻击过程中,攻击者可以在自己的Web服务器上放一个可执行的恶意文件,通过目标网站存在的远程文件包含漏洞来加载文件,从而实现执行任意命令的目的。

allow_url_include在PHP 5.2.0后默认设置为off,配置范围是PHP_INI_ALL。与之类似的配置有allow_url_fopen,配置是否允许打开远程文件,不过该参数对安全的影响没有allow_url_include大,故这里不详细介绍。

3.magic_quotes_gpc(魔术引号自动过滤)P7-8

magic_quotes_gpc在安全方面做了很大的贡献,只要它被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被利用,它也是让渗透测试人员很头疼的一个东西。

当该选项设置为on时,会自动在GET、POST、COOKIE变量中的单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\),但是在PHP 5中magic_quotes_gpc并不会过滤$_SERVER变量,导致很多类似client-ip、referer一类的漏洞能够利用。

在PHP 5.3之后的不推荐使用magic_quotes_gpc,PHP 5.4之后干脆被取消,所以你下载PHP 5.4之后的版本并打开配置文件会发现找不到这个配置选项。在PHP版本小于4.2.3时,配置范围是PHP_INI_ALL;在PHP版本大于4.2.3时,是PHP_INI_PERDIR。

4.magic_quotes_runtime(魔术引号自动过滤)P9

magic_quotes_runtime也是自动在单引号(')、双引号(")、反斜杠(\)及空字符(NULL)的前面加上反斜杠(\)。它跟magic_quotes_gpc的区别是,处理的对象不一样,magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤,它的作用也非常大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据同样也会有特殊字符存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发攻击。

同样,magic_quotes_runtime在PHP 5.4之后也被取消,配置范围是PHP_INI_ALL。

有一个点要记住,只有部分函数受它的影响,所以在某些情况下这个配置是可以绕过的,受影响的列表包括:

get_meta_tags()、file_get_contents()、file()、fgets()、fwrite()、fread()、fputcsv()、stream_socket_recvfrom()、exec()、system()、passthru()、stream_get_contents()、bzread()、gzfile()、gzgets()、gzwrite()、gzread()、exif_read_data()、dba_insert()、dba_replace()、dba_fetch()、ibase_fetch_row()、ibase_fetch_assoc()、ibase_fetch_object()、mssql_fetch_row()、mssql_fetch_object()、mssql_fetch_array()、mssql_fetch_assoc()、mysqli_fetch_row()、mysqli_fetch_array()、mysqli_fetch_assoc()、mysqli_fetch_object()、pg_fetch_row()、pg_fetch_assoc()、pg_fetch_array()、pg_fetch_object()、pg_fetch_all()、pg_select()、sybase_fetch_object()、sybase_fetch_array()、sybase_fetch_assoc()、SplFileObject:fgets()、SplFileObject:fgetcsv()、SplFileObject:fwrite()

5.magic_quotes_sybase(魔术引号自动过滤)P9-10

magic_quotes_sybase指令用于自动过滤特殊字符,当设置为on时,它会覆盖掉magic_quotes_gpc=on的配置,也就是说,即使配置了gpc=on也是没有效果的。

这个指令与gpc的共同点是处理的对象一致,即都对GET、POST、Cookie进行处理。而它们之前的区别在于处理方式不一样,magic_quotes_sybase仅仅是转义了空字符和把单引号(')变成了双引号('')。

与gpc相比,这个指令使用得更少,它的配置范围是PHP_INI_ALL,在PHP 5.4.0中移除了该选项。

代码审计工具 (2.2)

代码审计工具是一类辅助我们做白盒测试的程序,它可以分很多类,例如安全性审计以及代码规范性审计,等等。当然,也可以按它能审计的编程语言分类,目前商业性的审计软件大多支持多种编程语言,也有个人或团队开发的免费开源审计软件,像笔者的“Seay源代码审计系统”就是开源程序。使用一款好的代码审计软件可以极大地降低审计成本,可以帮助审计师快速发现问题所在,同时也能降低审计门槛,但也不能过分依赖审计软件。目前常用的代码安全审计软件还有Fortify SCA、RIPS、FindBugs、Codescan等。下面介绍几款常用代码安全审计工具。

Seay源代码审计工具 P21

这是笔者基于C#语言开发的一款针对PHP代码安全性审计的系统,主要运行于Windows系统上。这款软件能够发现SQL注入、代码执行、命令执行、文件包含、文件上传、绕过转义防护、拒绝服务、XSS跨站、信息泄露、任意URL跳转等漏洞,基本上覆盖常见PHP漏洞。另外,在功能上,它支持一键审计、代码调试、函数定位、插件扩展、自定义规则配置、代码高亮、编码调试转换、数据库执行监控等数十项强大功能。

Seay源代码审计系统主要特点 ★

  1. 一键自动化白盒审计,新建项目后,在菜单栏中打开“自动审计”即可看到自动审计界面。点击“开始”按钮即可开始自动化审计。当发现可疑漏洞后,则会在下方列表框显示漏洞信息,双击漏洞项即可打开文件跳转到漏洞代码行并高亮显示漏洞代码行
  2. 代码调试,代码调试功能极大地方便了审计师在审计过程中测试代码。可以在编辑器中选中代码,然后点击右键选择“调试选中”即可将代码在调试界面打开。
  3. 正则编码,Seay源代码审计系统集成了实时正则调试功能,考虑到特殊字符无法直接在编辑框进行输入,在实时正则调试功能中还支持对字符串实时解码后调试。另外,支持MD5、URl、Base64、Hex、ASCII、Unicode等多种编码解码转换功能。
  4. 自定义插件及规则,Seay源代码审计系统支持插件扩展,并且插件的开发非常简单,只需要将插件的dll文件放入到安装目录下的plugins文件夹内即可自动加载插件。目前自带插件包括黑盒+白盒的信息泄露审计以及MySQL数据库执行监控。

除了上述功能外,它还支持自定义审计规则,在规则配置界面中即可添加或修改以及禁用、删除规则,还可针对审计过程做很多审计习惯优化,使得程序简单容易上手。