前言
代码审计工具的实现都是基于代码审计经验开发出来用于优化工作效率的工具,我们要学好代码审计就必须要熟悉代码审计的思路。而且代码审计是基于PHP语言基础上学习的,学习代码审计最基本的要求就是能读懂代码。
常见的代码审计思路有以下四种:
根据敏感关键字回溯参数传递过程; 查找可控变量,正向追踪变量传递过程; 寻找敏感功能点,通读功能点代码; 直接通读全文代码。 敏感函数回溯参数过程 根据敏感函数来逆向追踪参数的传递过程,是目前使用的最多的一种方式,因为大多数漏洞是由于函数的使用不当造成的。另外非函数使用不当的漏洞,如SQL注入,等以后学习再详细介绍。这种方式的优缺点如下:
优点:只需搜索相应敏感关键字,即可快速挖掘想要的漏洞,可定向挖掘,高效、高质量; 缺点:由于没有通读代码,对程序整体架构了解不够深入,在挖掘漏洞时定位利用会花点时间,另外对逻辑漏洞挖掘覆盖不到。 espcms注入挖掘案例:
下载网址:http://down.chinaz.com/soft/27695.htm
下载espcms源程序 (ps:一些程序源代码可以在chinaz.com上面下载) 打开seay源代码审计系统,点击左上角新建项目,选择下载的espcms文件夹,点击自动审计,开始审计,得到可能存在漏洞,漏洞文件的路径,和漏洞代码列表。
我们挑选其中的一条代码
双击直接定位到这行代码,选中该变量后,可以看到变量的传递过程,在左侧点击parentid函数,在下面详细信息的地方可以看到parentid函数,在下面详细信息的地方可以看到parentid函数,在下面详细信息的地方可以看到parentid变量获得。
右键选中这行代码,定位函数主体accept,点击右键,选择定位函数
可以看到跳转到了class_function.php文件,代码如下:
可以看到这是一个获取GET、POST、COOKIE参数值得函数,我们传入的变量是parentid和R,则代表在POST、GET中都可以获取parentid参数,最后经过一个daddslashes()函数,实际上是包装的addslashes()函数,对单引号等字符进行过滤。看前面的SQL语句是这样的: sql=“select∗fromsql = “select * from sql=“select∗fromdb_table where parentid=$parentid”; 并不需要单引号来闭合,可以直接注入。
在citylist.php文件看到oncitylist()函数在important类中,选中该类名右键点击,选择全局搜索 可以看到index.php文件有实例化该类,代码如下:
$archive = indexget(‘archive’, ‘R’);
$archive = empty($archive) ? ‘adminuser’ : $archive;
$action = indexget(‘action’, ‘R’);
$action = empty($action) ? ‘login’ : $action;
$soft_MOD = array(‘admin’, ‘public’, ‘product’, ‘forum’, ‘filemanage’, ‘basebook’, ‘member’, ‘order’, ‘other’, ‘news’, ‘inc’, ‘cache’, ‘bann’, ‘logs’, ‘template’);
if (in_array($point, $soft_MOD)) {
include admin_ROOT . adminfile . “/control/$archive.php”;
$control = new important();
$action = ‘on’ . $action;
if (method_exists($control, $action)) {
$control->$action();
} else {
exit(‘错误:系统方法错误!’);
}
这里可以看到一个include文件的操作,可惜经过了addslashes()函数无法进行阶段使其包含任意文件,只能包含本地的PHP文件,往下是实例化类并且调用函数的操作,根据代码可以构造出利用EXP:
http://127.0.0.1/espcms/upload/adminsoft/index.php?archive=citylist&action=citylist&parentid=-1 union select 1,2,user(),4,5
通读全文代码 通读全文代码也有一定的技巧,否则很难读懂Web程序的,也很难理解代码的业务逻辑。首先我们要看程序的大体结构,如主目录有哪些文件,模块目录有哪些文件,插件目录有哪些文件,另外还要注意文件的大小,创建时间,就可以大概知道这个程序实现了那些功能,核心文件有哪些。
如discuz的主目录如下图所示:
在看目录结构的时候,特别注意以下几个文件:
1.函数集文件 函数集文件通常命名中包含functions或者common等关键字,这些文件里面是一些公共的函数,提供给其他文件统一调用,所以大多数文件都会在文件头部包含到其他文件。寻找这些文件的一个技巧就是打开index.php或者一些功能性文件。2.配置文件 配置文件通常命名中包含config关键字,配置文件包括Web程序运行必须的功能性配置选项以及数据库等配置信息。从这个文件可以了解程序的小部分功能,另外看这个文件的时候注意观察配置文件中参数是用单引号还是双引号,如果是双引号,则很可能会存在代码执行漏洞。3.安全过滤文件 安全过滤文件对我们做代码审计至关重要,通常命名中有filter、safe、check等关键字,这类文件主要是对参数进行过滤,比较常见的是针对SQL注入和XSS过滤&#