初识代码审计

代码审计(Code Audit)是指安全代码评估者尽可能的通过阅读应用系统的源代码来发现潜在的安全漏洞及隐患的技术手段。
代码审计的技术手段,可以弥补黑盒渗透测试的未能完全覆盖的漏洞环节与安全隐患,是一种可靠性、安全性最高的修补漏洞的方法。
可以通过对常见的编程语言如ASP、ASP.NET、PHP、JAVA、C++等语言进行源代码审计,查找出代码中存在的安全问题。

在这里插入图片描述

PHP代码审计准备

代码审计环境准备

搭建php环境:
php作为一门脚本语言,要运行它必须需要一个php的运行环境。PHP作为最流行的Web编程语言,大部分中间件都会有对php的支持。这里为了方便我们进行代码审计,减少不必要的配置时间,我们选择phpstudy。phpStudy是一个PHP调试环境的程序集成包。该程序包集成最新的Apache+PHP+MySQL+phpMyAdmin+ZendOptimizer。
理由:
phpstudy支持php不同版本之间的切换,这对代码审计尤为重要。(独特)
phpstudy一键集成安装,不需要复杂的环境配置。
phpstudy默认支持多款中间件,方便我们在不同中间件下进行审计。
浏览器:
代码审计过程中,我们经常需要测试代码在浏览器返回的结果。安装多款性能强大的浏览器可以对我们代码审计起到很大的帮助。
Mozilla Firefox:开源,多插件,强引擎,多系统。
Chrome:稳定,快速,开发者调试工具。
编辑器:
俗话说的好,工欲善其事,必先利其器。成功的代码审计自然离不开编辑器的帮助,一款适合自己的编辑器可以让我们阅读代码的速度事半功倍。
例如:
在这里插入图片描述
编辑器可以给我们提供以下必不可少的优点。
语法高亮
语法折叠
代码补全
函数断点
批量注释
函数跳转
变量追踪
程序源码
就好比再好的厨师也不能不用材料做饭,代码审计的前提也是获得审计目标的源代码。因此在审计前,我们需要从想办法获得源码。
•获得源码
大多数PHP程序都是开源的、找到官网下载最新的源码包就好了。
•安装网站
在本地搭建网站,一边审计一边调试。实时跟踪各种动态变化。

代码审计工具使用

seay代码审计工具

  1. 一键化自动白盒审计:
    提供了自动审计功能,虽然不够精确,但是却能帮助我们迅速找出敏感函数与敏感参数。同时根据情形,简单的分析出可能出现的漏洞,为我们提供思路上的额帮助。
    可以看到,将我们的网站目录选入,开始扫描后。扫描出了 敏感函数extract,同时其中含有变量,这将可能导致变量覆盖漏洞。
    但是功能并不是十全十美的,他只是利用正则对网站整体进行了扫描,所以有没有漏洞必须要我们人工判别。
    在这里插入图片描述
  2. 代码调试:
    在这里插入图片描述
  3. 正则编码:正则编码可以帮助我们判别正则表达式。同时可以写出字符串。利用正则进行匹配。
  4. 自定义插件与规则。
  5. 自定义审计规则。
  6. 数据库执行监控。

代码审计流程与方法

代码审计过程中应该先对大局有所把握,了解要审计的整个网站大概框架是什么,工作流程是什么等。把握大局可以有以下几点:
网站结构:浏览源码文件夹,了解该程序的大致目录
入口文件:index.php、admin.php文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑。
配置文件:一般类似config.php等文件,保存一些数据库相关信息、程序的一些信息。先看看数据库编码,如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
过滤功能:通过详读 公共函数文件 和 安全过滤文件 等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在哪里被过滤了,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?
了解网站目录结构,重要文件目录作用
在这里插入图片描述
几种常见审计方法:
通读全文法
通读全文发作为一种最麻烦的方法也是最全面的审计方法。特别是针对大型程序,源码成千上万行,这要读到什么时候。但是该方法也是一种必要的方法。了解整个应用的业务逻辑,才能挖掘到更多更有价值的漏洞。
这种方法一般是企业对自身产品的审计,当然,对于小型应用,未尝不可以读一读。
前面的把把握大局也包含在通读全文法里面,也是通读全文的第一步。
当然通读全文也不是傻乎乎的顺着目录一个一个代码全部读一遍,而是根据网站的目录文件,对每个功能点进行完全的代码通读,这样才可以更好的理解整个Web程序,完成审计。
例如:
首先看程序的大体代码结构,比如主目录存在哪些文件,模块目录存在哪些文件。
除了关注有哪些文件,我们还要注意文件的大小,创建时间。我们根据这些文件的命名就可以大致了解程序具体功能,寻找核心文件。 在看程序目录结构的时候,我们要特别注意几个文件,分别如下:
函数集文件,通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到它们,寻找这些文件一个非常好用的技巧就是去打开index.php或者一些功能性文件,在头部一般都能找到。
配置文件,通常命名里面包括config这个关键字,配置文件包括Web程序运行必须的功能性配置选项以及数据库等配置信息,从这个文件里面可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数值是用单引号还是用的双引号包起来,如果是双引号,则很大可能会存在代码执行漏洞,例如下面kuwebs的代码,只要我们在修改配置的时候利用PHP可变变量的特性即可执行代码。
$kuWebsiteURL = “http://www.kuwebs.com”; $kuWebsiteSupportEn= “1”; 安全过滤文件,安全过滤文件对我们做代码审计至关重要,关系到我们挖掘到的可疑点能不能利用,通常命名中有filter、safe、check、clean、dirty、waf等关键字,这类文件主要是对参数进行过滤,比较常见的是针对SQL注入和XSS过滤,还有文件路径、执行的系统命令的参数,其他的则相对少见。而目前大多数应用都会在程序的入口循环对所有参数使用addslashes()函数进行过滤。
index文件,index是一个程序的入口文件,所以通常我们只要读一遍index文件就可以大致的了解整个程序的架构,运行的流程,包含到的文件,其中核心的文件又有哪些,而不同目录的index文件也有不同的实现方式,建议最好是先把几个核心目录的index文件都简单读一遍。
敏感函数参数回溯法
敏感函数参数回溯法就是根据敏感函数,逆向追踪参数传递的过程。这个方法是最高效,最常用的方法。
大多数漏洞的产生是因为函数的使用不当导致的。我们只要找到这样的一些使用不当的函数,就可以快速挖掘想要的漏洞。
这方面,Seay法师大大有一款神器 Seay源代码审计系统,主要是利用正则匹配一些高危函数、关键函数以及敏感关键字。
然后,我们就可以分析判断敏感函数的上下文,追踪参数源头。尝试控制可控的参数变量。
例如:
首先可以利用抓包软件,观察我们GET或者POST的参数名称,在php代码中进行参数名的回溯追踪。
发现了php接受参数的函数,观察函数对参数的处理流程,直到最后一步完成,完成追踪。
通常在提交请求前的变量,都是攻击者可控都是不安全的,因此我们观察是否对参数进行完整的处理。
我们也可以使用一些软件自带的变量追踪,方便我们调试,可以看到具体变量传递到函数,以及函数处理完之后的变化。
定向功能分析法
定向功能分析法主要是根据程序的业务逻辑来说审计的。 首先是用浏览器逐个访问浏览,看看这套程序有那些功能。根据相关功能,大概推测可能存在那些漏洞。 找到具体的功能模块,主要审计此模块。
常见功能漏洞:(包括但不限于)
程序初始安装
如,有些安装程序可能存在重装漏洞,网站数据库被重置。
站点信息泄漏
如:某些关键目录信息,如adnmin登陆界面,数据库管理界面,网站源码等。
文件上传漏洞
如:文件上传全套每部存在问题。
文件管理
如:服务器文件可以被远程读取,写入。
登陆认证
如:暴力破解,没有多重认证系统。
数据库备份恢复
如:利用数据库备份拿shell。
越权(横向越权,纵向越权)
如:越权执行敏感操作,如修改其他用户信息。
投票,积分,抽奖活动
如:单用户多次抽奖。
任意密码重置
如:充值他人密码。
验证码绕过
如:验证码过于简单,可以被绕过等。
审计总结
审计过程中,我们不要局限于固定的方法,适当的天马行空,找到适合自己的审计思路。
同时审计时,经常需要结合多种方法,不要局限于定性知识。
发布了119 篇原创文章 · 获赞 1566 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/weixin_45728976/article/details/105538167