赞
踩
代码审计是企业安全运营以及安全从业者必备的基础能力。代码审计在很多场景中都需要用到,比如企业安全运营、渗透测试、漏洞研究等。目前已经有不少公司在推广微软的软件SDL(security development lifecycle,安全开发周期),它涵盖需求分析—>设计—>编码—>测试—>发布—>维护,安全贯穿整个软件开发周期,其中设计、编码和测试是整个SDL的核心,安全问题大多数实在这里所被解决掉。其中在安全设计这块儿,必须要非常了解漏洞形成的原理,纵观全局。而在代码实现也就是编码阶段,安全依靠的是编程人员的技术基础以及前期安全设计的完善性。然后是测试,测试包括白盒测试、黑盒测试以灰盒测试。黑盒测试也叫功能测试,是指在不接触代码的情况下,测试系统的功能是否有bug,如果发现有bug则返回修复,直到没有bug才允许软件发布上线。渗透测试人员掌握代码审计是非常重要的,因为我们在渗透过程中经常需要针对目标环境对payload进行调试。此外,如果通过扫描器扫描到web目录下的一个源码备份包,通常攻击者都会利用源码包找一些配置文件,因为里面有数据库、API等一类配置。如果环境有限制,比如目标站数据库限制连接IP等,那么工具小子可能在源码包进行的漏洞利用也就到此为止。对于懂代码审计的人,结果完全不一样,他可以对源码包进行安全审计,发现网站代码里存在的漏洞,然后利用挖掘到的漏洞进行渗透。
代码审计对编程语言的基础有一定要求,至少要能看得懂代码,这里说的看懂代码不是简单地理解几个if…else 语句和for循环,而是能看懂代码的逻辑,即使有很多函数没见过,也是可以到Google去查。都说编程再语言这块儿是一通百通,只要我们对编程思想理解得非常透彻,重新接触一种编程语言也是非常快就能上手的。
我们需要准备如下:多个系统(Windows+Linux)、phpstudy、seay、rips、burp suite等。
通常做代码审计都是检查敏感函数的参数,然后回溯变量,判断变量是否可控并且没有经过严格的过滤,这是一个逆向追踪的过程。而代码审计并非这一种手段,还可以先找出哪些文件在接受外部传入的参数,然后跟踪变量的传递过程,观察是否有变量传入到高危函数里,或者传递的过程中是否有代码逻辑漏洞,这是一种正向追踪的方式,这样的挖掘方式比逆向追踪挖掘得更全。还有一种方式是直接挖掘功能点漏洞,根据自身得经验判断该类应用通常在哪些功能中会出现漏洞,直接全篇阅读该功能代码。因为代码审计是一门很专的技术活,要学好PHP代码审计,需要掌握以下几点;
代码在不同环境下执行的结果也会大有不同,可能就因为一个配置问题,导致一个非常高危的漏洞能够利用:也可能你已经找到的一个漏洞就因为你的配置问题,导致你捣鼓了很久都无法构造成功的漏洞利用代码。然而,在不同的PHP版本中配置指令也有不一样的地方,新的版本可能会增加或者删除部分命令,改变指令默认设置或者固定设置指令,因此我们在代码审计之前必须要非常熟悉PHP各个版本中配置文件的核心指令,才能更高效地挖掘到高质量的漏洞。我们需要先了解几个PHP定义值,即 PHP_INI_* 常量的定义。
| | |
| | |
常量 | 含义 |
---|---|
PHP_INI_USER | 该配置选项可在用户的PHP脚本或Windows注册表中设置 |
PHP_INI_PERDIR | 该配置选项可在php.ini. .htaccess或者httpd.conf中设置 |
PHP_INI_SYSTEM | 该配置选项可在php.ini 或httpd.conf中设置 |
PHP_INI_ALL | 该配置选项可在任何地方设置 |
PHP_INI_ONLY | 该配置选项可仅可在php.ini中配置 |
PHP配置文件指令中影响PHP脚本安全的配置列表以及核心列表选项:
1)register_globals(全局变量注册开关) ( PHP5.4.0 废弃 )
2)allow_url_include (是否允许包含远程文件)
当该配置为on的情况下,它可以直接包含远程文件,当存在include(
v
a
r
)
且
var)且
var)且var可控的情况下,可以直接控制$var变量来执行PHP代码。allow_url_include在PHP5.2.0默认设置为off,配置范围是PHP_INI_ALL。与之类似的还有allow_url_fopen,配置是否允许远程文件,不过该参数对安全的影响没有allow_url_include大。
配置allow_url_include为on,可以直接包含远程文件。测试代码如下:
<?php
include $_GET['a'];
3)magic_quotes_gpc(魔术引号自动过滤)
这个在安全方面做了很大的贡献,只要它被开启,在不存在编码或者其他特殊绕过的情况下,可以使得很多漏洞无法被利用,他也是让渗透测试人员很头疼的一个东西。当该选项设置为on时,会自动在GET、POST、COOKIE变量中的单引号(’)双引号(")反斜杠(\)空字符(NULL)的前面加上反斜杠(),但是在PHP5中的magic-quotes_gpc并不会过滤$_SERVER变量,导致很多类似client-ip、referer一类的漏洞能够利用。在PHP5.3之后的不推荐使用magic_quotes_gpc、PHP5.4之后干脆被取消。
Ver<4.2.3 配置范围是:PHP_INI_ALL;
Ver>4.2.3 配置范围是:PHP_INI_PERDIR;
测试代码为:
<?php
echo $_GET['seay'];
4)magic_quotes_runtime(魔术引号自动过滤)magic_quotes_runtime也是自动在单引号(’)双引号(")反斜杠(\)空字符(NULL)的前面加上反斜杠()。它跟magic_quotes_gpc的区别是,处理的对象不一样,magic_quotes_runtime只对从数据库或者文件中获取的数据进行过滤,他的作用也非常大,因为很多程序员只对外部输入的数据进行过滤,却没有想过从数据库获取的数据库同样也会有特殊字符的存在,所以攻击者的做法是先将攻击代码写入数据库,在程序读取、使用到被污染的数据后即可触发攻击。同样,magic_quotes_runtime在PHP5.4之后也被取消,配置范围是PHP_INI_ALL.如下函数:
5)magic_quotes_sybase(魔术引号自动过滤)
magic_quotes_sybase指令用于自动过滤特殊字符,当设置为on时,它会覆盖掉magic_quotes_gpc=on 的配置,也就是说,即使配置了gpc=on也是无效的。在这个指令和gpc的共同点是处理的对象一致,即都对GET、POST、COOKIE进行处理。
6)safe_mode(安全模式)
安全模式是PHP内嵌的一种安全机制,当safe_mode=on时,联动可以配置的指令有safe_mode_include_dir、safe_mode_exec_dir、safe_mode_allowed_env_vars、safe_mode_protected_env_vars。safe_mode指令的配置范围为PHP_INI_SYSTEM,PHP 5.4之后也被取消。
7)open_basedir (PHP可访问目录)
限制PHP只能访问哪些目录,通常设置web文件目录即可。注意:使用open_basedir是指定的限制实际上是前缀,而不是目录名。例如,如果配置 open_basedir=/www/a,那么目录/www/a和/www/ab都是可以访问的。如果要访问仅限制在指定的目录内,请用斜线结束路径名当open_basedir配置目录后,执行脚本访问其他文件都需要验证文件路径,因此在执行效率上也会有一定的影响。
当PHP<5.2.3,是 PHP_INI_SYSTEM
当PHP>=5.2.3,是 PHP_INI_ALL
8)disable_functions(禁用函数)
使用该函数来禁用一些敏感函数的使用。当你想用本指令禁止一些危险函数时,切记要把**dl()**函数也禁用进来。因为攻击者可以利用dl()函数来加载自定义的PHP扩展以突破disable-functions指令的限制。本指令配置的范围是php.ini only。配置禁用函数时使用逗号(,)分隔函数名。例如:disable_functions=phpinfo,eval,passthru,exec,system
9)display_errors和error_reporting错误显示display_errrors表明是否显示PHP脚本内部错误的选项,在调试PHP的时候,通常都把PHP错误显示打开,但是在生产环境中,建议关闭PHP错误回显,即设置display_errors=off,以避免带来一些安全隐患。在设置display_errors=on时,还可以配置的一个指令就是error_reporting,这个选项用来配置错误显示的级别,可使用数字也能使用内置的常量配置,数字格式和常量格式的详细信息如表所示:
这两个指令的配置范围都是PHP_INI_ALL
总结:会影响到安全的指令大致就介绍到这里,下表列出一些常用指令以及对应的说明。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。