最近两年在写代码审计的书,已经在进行收尾,其中提到我的代码审计系统才想起来还没有写一个这个软件的使用示例,今天补充一下,

用PHP程序espcms做举例,首先载入程序,然后点击自动审计,得到一部分可能存在漏洞的代码列表

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

我们挑其中的这一条

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

 
双击该项直接定位到这行代码,如下

 

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

 
在选中改变量后,在下方可以看到该变量的传递过程,并且点击下方的变量传递过程也可以直接跳转到该项代码处,可以非常直观的帮助我们看清整个变量在该文件的传递过程,另外我们可以看到$parentid变量是在
$parentid = $this->fun->accept(‘parentid’, ‘R’);
这段代码获取的,右键选中该代码定位该函数主体

 

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

 

可以看到跳转到了class_function.php文件的314行。

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

 
可以看到这是一个获取GET、POST、COOKIE参数值的函数,我们传入的变量是parentid和R,则代表在POST、GET中都可以获取parentid参数,最后经过了一个daddslashes()函数,实际上是包装的addslashes()函数,对单引号等字符进行过滤,不过注意看前面的SQL语句是这样的
$sql = “select * from $db_table where parentid=$parentid”;
 
并不需要单引号来闭合,于是可以直接注入。
在citylist.php文件看到oncitylist()函数在important类中,选中该类名右键点击“全局搜索”功能
 

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载

可以看到index.php文件有实例化该类,代码如下
 
$archive = indexget(‘archive’, ‘R’);
$archive = empty($archive) ? ‘adminuser’ : $archive;
$action = indexget(‘action’, ‘R’);
$action = empty($action) ? ‘login’ : $action;
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文件,如果你有mysql的root权限,能导出文件到tmp目录,不能导出到web目录,这种场景才用得到这个文件包含,再往下走就是实例化类并且调用函数的操作了,根据代码可以构造出利用EXP
http://127.0.0.1/espcms/adminsoft/index.php?archive=citylist&action=citylist&parentid=-1 union select 1,2,user(),4,5
 
漏洞截图
 

Seay源代码审计系统实例演示-z7y_专注于互联网安全,黑帽白帽SEO,代码审计,CMS最新0day漏洞挖掘,源码分享下载