主页 > 网络知识 > MetInfo5.3.19代码审计思路

MetInfo5.3.19代码审计思路

最近在学习代码审计,就想着拿个CMS来练练手,然后选择了MetInfo5.3.19,来一次完整的代码审计,并把审计的思路都写下来。审计过程把可能存在漏洞但做了防护的地方也分析了,所以篇幅比较长。第一次写,可能不太好,有问题的地方还望大佬们指出。

审计过程

代码审计的大致过程就是先看看帮助文档,然后打开网站随便点点看url对应的文件目录(如果是MVC架构就要搞清楚路由方式);了解cms的传参过程和数据库操作过程;审计一些明显的交互点对应的代码(比如留言板,登录框);将Seay自动审计后的结果验证一下,虽然自动审计的误报率高,但是不容易漏,就是比较需要耐心。

准备工作

工具:phpstudy,phpstorm(安装xdebug插件),Seay源码审计系统,burpsuite,米拓cms帮助文档:https://doc.metinfo.cn/dev/basics/basics28.html

打开帮助文档看看里面的东西,比如文件结构、系统常量什么的,在里面可以注意到一个$_M,`$_M[form]`:提交的GET,POST,COOKIE表单数组。在系统中不要直接使用$_POST,$_GET,$_COOKIE,这些都是没有过滤的,`$_M[form]`中是已经安全过滤后的数组。通过这里可以知道传参都会经过过滤后保存在$_M里面

0×01 了解cms传参过程

先随便找一个有进行传参的地方,比如前台‘公司动态’的文章,通过url::8006/news/shownews.php?lang=cn&id=1,跟进对应的目录news/shownews.php

 

MetInfo5.3.19代码审计思路

 

这里没有传参的函数,但是开头就包含了include/common.inc.php,继续跟进这个文件,发现里面就有段传参的代码

foreach(array('_COOKIE', '_POST', '_GET') as $_request) { foreach($$_request as $_key => $_value) { $_key{0} != '_' && $$_key = daddslashes($_value,0,0,1); $_M['form'][$_key] = daddslashes($_value,0,0,1); } }

大概意思就是将$_GET,$_POST,$_COOKIE传入的参数进行键值分离,然后再将参数值经过daddslashes($_value,0,0,1)函数进行过滤,将过滤后的值赋值给$_M,可以确定这里就是处理传入参数的地方,然后新建一个1.php文件进行测试

在第一行下断点,通过1.php传参a=1’,然后跟进daddslashes()函数

 

MetInfo5.3.19代码审计思路

 

这里可以看到有好几个文件都有定义daddslashes()函数,这时phpstorm的强大之处就体现出来了,用它的调试功能可以直接直接跟进定义这里的daddslashes()函数的文件

跟进到include/global.fun.php,部分代码如下

//daddslashes('a'',0,0,1) function daddslashes($string, $force = 0,$metinfo,$url = 0) { global $met_sqlinsert,$id,$class1,$class2,$class3; !defined('MAGIC_QUOTES_GPC') && define('MAGIC_QUOTES_GPC', get_magic_quotes_gpc()); if(!MAGIC_QUOTES_GPC || $force) { if(is_array($string)) { foreach($string as $key => $val) { $string[$key] = daddslashes($val, $force); } //判断$string是否为数组,如果是,继续键值分离 } else { $string = addslashes($string); } //如果不是,通过addslashes()函数进行转义 } if(is_array($string)){ if($url){ $string=''; }else{ foreach($string as $key => $val) { $string[$key] = daddslashes($val, $force); } //如果$string是数组,并且$url的值为1,将$string置空,$url不为0则进行键值分离 } }else{ //如果$string不是数组,进行下面的替换(不区分大小写),从这里可以看出,sql注入就基本被过滤了 $string_old = $string; $string = str_ireplace(""","/",$string); $string = str_ireplace("'","/",$string); $string = str_ireplace("*","/",$string); $string = str_ireplace("~","/",$string); $string = str_ireplace("select", "select", $string); $string = str_ireplace("insert", "insert", $string); $string = str_ireplace("update", "update", $string); $string = str_ireplace("delete", "delete", $string); $string = str_ireplace("union", "union", $string); $string = str_ireplace("into", "in o", $string); $string = str_ireplace("load_file", "load_ ile", $string); $string = str_ireplace("outfile", "out ile", $string); $string = str_ireplace("sleep", "sleep", $string); $string_html=$string; $string = strip_tags($string); //strip_tags()剥去字符串中的 HTML、XML 以及 PHP 的标签 if($string_html!=$string){ $string=''; //如果剥去了标签,那么该if语句成立,$string就会变为空,所以这里也基本过滤了xss和写入php文件 } $string = str_replace("%", "%", $string); if(strlen($string_old)!=strlen($string)&&$met_sqlinsert){ $reurl="http://".$_SERVER["HTTP_HOST"]; echo("<script type='text/javascript'> alert('Submitted information is not legal!'); location.href='$reurl'; </script>"); die("Parameter Error!"); } $string = trim($string); } 0×02 了解数据库操作

还是看到news/shownews.php,在为$dbname赋值后就包含了/include/global/showmod.php,所以这文件里可能就有数据库操作语句

说点什么吧
  • 全部评论(0
    还没有评论,快来抢沙发吧!