PHP代码审计————通用代码审计思路

血红的双手。 提交于 2019-12-02 11:37:45

前言

本小节我们就来总结一下在PHP代码审计中常用到的代码审计思路

敏感函数回溯参数过程

         根据敏感函数的来逆向追踪参数的传递过程,是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。另外非函数使用不当的漏洞,如sql注入,也有一些特征,比如select、insert等,再结合from和where等关键字,我们就可以判读是否是一条SQL语句,通过对字符串的识别分析,就能判读这个sql语句里面的参数有没有使用单引号过滤,或者根据我们的经验来判断。就像是HTTP头里面的HTTP_CLIENT_IP和HTTP_X_FORWARDFOR等获取到的IP地址经常没有安全过滤就直接拼接到了SQL语句中,并且由于它们是在$_SERVERE变量中不受GPC的影响,那我们就可以去查找HTTP_CLIENT_IP和HTTP_X_FORWARDFOR关键字来快速寻找漏洞。

        这种方式的优点是只需要搜索相关敏感关键字,即可以快速第挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。

        缺点是由于没有通读代码对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

通读全文代码

        前面提到的根据敏感关键字来回溯传入的参数,是一种逆向追踪的思路,我们也提到了这种方式的优点与缺点,实际上在需要快速寻找漏洞的情况下用回溯参数的方式是非常有效的,当这种方式斌不适合运用在企业中做安全运营时的场景,在企业中做自身产品的代码审计时,我们需要了解整个应用的业务逻辑,才能挖掘到更多有价值的漏洞。

        通读全文代码也有一定的技巧,并不是随便找个文件逐个读完就可以了,这样你是很难真正读懂这套web程序的,也很难理解代码的业务逻辑。

方法:

        首先我们要看程序的大体代码结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,处理关注有哪些文件,还要注意文件的大小、创建时间。我们根据这些文件的命名就可以大致了解这个程序实现了哪些功能,核心文件时哪些。

下图是discus的程序主目录:


在看程序目录的时候我们要特别注意以下几个文件:

(1)函数集文件,通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。寻找这些文件一个非常好用的技巧就是打开index.php或者一些功能性文件,在头部一般都会找得到的。

(2)配置文件,通常命名中包括config关键字,配置文件包括web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件中可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是单引号还是双引号括起来,如果是双引号,则很可能会存在代码执行漏洞。

(3)安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有filter、safe、check等关键字,这类文件主要是对参数进行过滤,比较常见的是针对sql注入和XSS过滤,还有文件路径、执行的系统命令参数、其他的则相对较少见。目前大多数引用独对在程序的入口循环对所有参数使用addslshes()函数进行过滤。

(4)index文件,index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些。而不同目录的index文件也有不同的实现方式,建议最好先将几个核心目录的index文件都简单的读一遍。

    上面介绍我们应该注意的部分文件,可以帮助我们更有方向的去读全部的代码,实际上在我们真正做代码审计的时候经常会遇到各种框架,这时候就会被搞得晕头转向,所以在学习代码审计的前期建议不要去读开源框架或者使用开源框架的应用,先去chinaz\admin5之类的源码下载网站读一些小程序,并且一定要多找几套程序通读全文代码,这样我们才能总结经验,等总结了一定的经验,对PHP也比较熟悉了之后再去读那些框架(thinkphp、Yii、Zend Frameword)等开源框架,才能快速的挖掘出高质量的漏洞。

    通读代码的好处显而易见,可以更好的了解程序的架构以及业务逻辑,能够挖掘到更多、更高质量的逻辑漏洞,一般老手都会比较喜欢这种方式。而缺点就是花费的时间长,如果程序比较大,读起来也比较累。

根据功能点定向审计

      在有了一定的代码审计经验之后,一定会知道哪些功能点通常会有哪些漏洞,在我们想要快速挖掘漏洞的时候就可以这样来做,首先安装好并且运行程序,到处点点,浏览一下,看一下程序有哪些功能,这些功能的程序文件分别是怎样的,是独立的模块还是以插件的形式存在,或者是写一个通用类里面,然后多处调用。在了解了这些功能的存在形式之后,可以先寻找经常会出现问题的功能点,简单黑盒测试一下,如果没有发现很普通、很常见的漏洞,再去读这个功能的代码,这样我们读起来就可以略过一些刚才黑盒过的测试点,提高审计速度。

     根据经验,下面简单的介绍几个功能点经常会出现的漏洞,如下:

(1)文件上传功能:这里说的文件上传功能在很多功能点都会出现,比如像文章的编辑、资料编辑、头像上传、附件上传,这个功能最常见的漏洞就是任意文件上传了,后端程序没有严格限制上传文件的格式、导致可以直接上传或者存在绕过的情况,而除了文件上传功能之外,还经常发生SQL注入漏洞。因为一般程序员都不会注意到对文件名进行过滤,但是有需要把文件名保存到数据库中,所以就会存在sql注入漏洞。

(2)文件管理功能。在文件管理功能中,如果程序将文件名或者文件路径直接在参数中传递,则很有可能会存在任意文件操作的漏洞,比如任意文件读取等等,利用的方式是在路径中使用../或者..\跳转目录。

(3)登录认证功能。登录认证功能不是指一个登录过程,而是整个操作过程中的认证,目前的认证方式大多是基于Cookie和Session,不少程序会把当前登录的用户账号等认证信息放到Cookie中,或许是加密方式,是为了保持用户可以长时间登录,不会一退出浏览器或者Session超时就退出账户,进行操作的时候直接从Cookie中读取出当前用户信息,这里就存在一个算法可信的问题,如果这段Cookie信息没有加salt一类的东西,就可以导致任意用户登录漏洞,只要知道用户的部分信息,即可生成认证令牌,甚至有的程序会直接把用户明文放到Cookie中,操作的时候直接取这个用户名的数据,这也是常说的越权漏洞。

(4)找回密码功能。找回密码虽然看起来不像任意文件上传这种可以危害到服务器安全的漏洞,但是如果可以重置管理员的密码,也是可以间接控制业务权限甚至拿到服务器权限的。而找回密码功能的漏洞很多利用场景,最常见的是验证码爆破,目前特别是APP应用中,请求后端验证码的时候大多是4位,并且没有限制验证码错误的次数和有效时间,于是就出现了爆破的漏洞。除此之外,还有验证码凭证的算法,这需要在代码中才能看到,所以我们做代码审计的时候可以看看这个算法是否可信。

前言

本小节我们就来总结一下在PHP代码审计中常用到的代码审计思路

敏感函数回溯参数过程

         根据敏感函数的来逆向追踪参数的传递过程,是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。另外非函数使用不当的漏洞,如sql注入,也有一些特征,比如select、insert等,再结合from和where等关键字,我们就可以判读是否是一条SQL语句,通过对字符串的识别分析,就能判读这个sql语句里面的参数有没有使用单引号过滤,或者根据我们的经验来判断。就像是HTTP头里面的HTTP_CLIENT_IP和HTTP_X_FORWARDFOR等获取到的IP地址经常没有安全过滤就直接拼接到了SQL语句中,并且由于它们是在$_SERVERE变量中不受GPC的影响,那我们就可以去查找HTTP_CLIENT_IP和HTTP_X_FORWARDFOR关键字来快速寻找漏洞。

        这种方式的优点是只需要搜索相关敏感关键字,即可以快速第挖掘想要的漏洞,具有可定向挖掘和高效、高质量的优点。

        缺点是由于没有通读代码对程序的整体框架了解不够深入,在挖掘漏洞时定位利用点会花费一点时间,另外对逻辑漏洞挖掘覆盖不到。

通读全文代码

        前面提到的根据敏感关键字来回溯传入的参数,是一种逆向追踪的思路,我们也提到了这种方式的优点与缺点,实际上在需要快速寻找漏洞的情况下用回溯参数的方式是非常有效的,当这种方式斌不适合运用在企业中做安全运营时的场景,在企业中做自身产品的代码审计时,我们需要了解整个应用的业务逻辑,才能挖掘到更多有价值的漏洞。

        通读全文代码也有一定的技巧,并不是随便找个文件逐个读完就可以了,这样你是很难真正读懂这套web程序的,也很难理解代码的业务逻辑。

方法:

        首先我们要看程序的大体代码结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,处理关注有哪些文件,还要注意文件的大小、创建时间。我们根据这些文件的命名就可以大致了解这个程序实现了哪些功能,核心文件时哪些。

下图是discus的程序主目录:


在看程序目录的时候我们要特别注意以下几个文件:

(1)函数集文件,通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。寻找这些文件一个非常好用的技巧就是打开index.php或者一些功能性文件,在头部一般都会找得到的。

(2)配置文件,通常命名中包括config关键字,配置文件包括web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件中可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是单引号还是双引号括起来,如果是双引号,则很可能会存在代码执行漏洞。

(3)安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有filter、safe、check等关键字,这类文件主要是对参数进行过滤,比较常见的是针对sql注入和XSS过滤,还有文件路径、执行的系统命令参数、其他的则相对较少见。目前大多数引用独对在程序的入口循环对所有参数使用addslshes()函数进行过滤。

(4)index文件,index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致了解整个程序的架构、运行的流程、包含到的文件,其中核心的文件又有哪些。而不同目录的index文件也有不同的实现方式,建议最好先将几个核心目录的index文件都简单的读一遍。

    上面介绍我们应该注意的部分文件,可以帮助我们更有方向的去读全部的代码,实际上在我们真正做代码审计的时候经常会遇到各种框架,这时候就会被搞得晕头转向,所以在学习代码审计的前期建议不要去读开源框架或者使用开源框架的应用,先去chinaz\admin5之类的源码下载网站读一些小程序,并且一定要多找几套程序通读全文代码,这样我们才能总结经验,等总结了一定的经验,对PHP也比较熟悉了之后再去读那些框架(thinkphp、Yii、Zend Frameword)等开源框架,才能快速的挖掘出高质量的漏洞。

    通读代码的好处显而易见,可以更好的了解程序的架构以及业务逻辑,能够挖掘到更多、更高质量的逻辑漏洞,一般老手都会比较喜欢这种方式。而缺点就是花费的时间长,如果程序比较大,读起来也比较累。

根据功能点定向审计

      在有了一定的代码审计经验之后,一定会知道哪些功能点通常会有哪些漏洞,在我们想要快速挖掘漏洞的时候就可以这样来做,首先安装好并且运行程序,到处点点,浏览一下,看一下程序有哪些功能,这些功能的程序文件分别是怎样的,是独立的模块还是以插件的形式存在,或者是写一个通用类里面,然后多处调用。在了解了这些功能的存在形式之后,可以先寻找经常会出现问题的功能点,简单黑盒测试一下,如果没有发现很普通、很常见的漏洞,再去读这个功能的代码,这样我们读起来就可以略过一些刚才黑盒过的测试点,提高审计速度。

     根据经验,下面简单的介绍几个功能点经常会出现的漏洞,如下:

(1)文件上传功能:这里说的文件上传功能在很多功能点都会出现,比如像文章的编辑、资料编辑、头像上传、附件上传,这个功能最常见的漏洞就是任意文件上传了,后端程序没有严格限制上传文件的格式、导致可以直接上传或者存在绕过的情况,而除了文件上传功能之外,还经常发生SQL注入漏洞。因为一般程序员都不会注意到对文件名进行过滤,但是有需要把文件名保存到数据库中,所以就会存在sql注入漏洞。

(2)文件管理功能。在文件管理功能中,如果程序将文件名或者文件路径直接在参数中传递,则很有可能会存在任意文件操作的漏洞,比如任意文件读取等等,利用的方式是在路径中使用../或者..\跳转目录。

(3)登录认证功能。登录认证功能不是指一个登录过程,而是整个操作过程中的认证,目前的认证方式大多是基于Cookie和Session,不少程序会把当前登录的用户账号等认证信息放到Cookie中,或许是加密方式,是为了保持用户可以长时间登录,不会一退出浏览器或者Session超时就退出账户,进行操作的时候直接从Cookie中读取出当前用户信息,这里就存在一个算法可信的问题,如果这段Cookie信息没有加salt一类的东西,就可以导致任意用户登录漏洞,只要知道用户的部分信息,即可生成认证令牌,甚至有的程序会直接把用户明文放到Cookie中,操作的时候直接取这个用户名的数据,这也是常说的越权漏洞。

(4)找回密码功能。找回密码虽然看起来不像任意文件上传这种可以危害到服务器安全的漏洞,但是如果可以重置管理员的密码,也是可以间接控制业务权限甚至拿到服务器权限的。而找回密码功能的漏洞很多利用场景,最常见的是验证码爆破,目前特别是APP应用中,请求后端验证码的时候大多是4位,并且没有限制验证码错误的次数和有效时间,于是就出现了爆破的漏洞。除此之外,还有验证码凭证的算法,这需要在代码中才能看到,所以我们做代码审计的时候可以看看这个算法是否可信。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!