在笔者上篇《通读审计之天目MVC》末尾中所提到,白盒审计配合黑盒测试才可以达到最完美的效果。
那么本篇文章侧重于黑盒中所偶遇的一些隐藏度较高的漏洞进行编写,期间可能会遇到代码审计中的“回溯”。当然了,规矩不能改变,我们还会和往常一样,从了解框架运行原理到漏洞挖掘。
下载渠道:https://www.mycodes.net/41/8884.htm
0x01 MVC的了解老样子,整个故事得从index.php开始说起。
我们之前所说过,先把程序中所运行的所有常量提取出来,再继续审计。
Index.php文件的第14行,包含进来HY/HYPHP.php文件,我们打开看一下怎么玩儿的。
HY/HYPHP.php文件的第22行,memory_get_usage()函数能返回当前分配给PHP脚本的内存量,单位是字节(byte)。这里对安全沾边较少,我们继续往下看。
31 - 33行所用来记录脚本访问开始的时间,同时定义了全局变量LOAD_CLASS以及SQL_LOG
34 - 36行可以看到初始化了三个$_SERVER全局变量,而这里获取IP头也是通过REMOTE_ADDR来进行获取,无法进行XFF头伪造。
42 - 48行定义的三个变量分别为 IS_GET、IS_POST、IS_AJAX,这三个变量都是来获取到请求过来的方式是什么,是Js所发出的Ajax请求,还是GET请求,还是POST请求。
从51 - 65行都定义了一些常量,我们在小记事本中已经有了,可以省去很多时间。
在 67 - 74行中,用来判断某些常量是否为目录,不是目录则创建目录,这里我们一带而过。
76 - 86行我们一目了然,判断 常量.config.php 文件是否存在,如果不存在则创建一个这样的文件。
在93行的判断$argv变量是否存在,我们在通读过程中并没有发现$argv变量,那么目光直接转移到96行包含进来HY.php文件之后直接调用了LibHY::init() 静态方法。
我们打开HY.php文件看一下到底是怎么玩的。
在HYPHP.php文件的97行直接调用HY类的init静态方法,我们打开init静态方法看一下到底是怎么玩儿的。
在HY.php文件的第7行中,直接使用了spl_autoload_register()方法来实现自动包含类文件的操作。我们看一下该方法是怎么玩儿的。笔者读到这里,因为读完autoload静态方法后还需要回来继续往下通读,所以笔者会使用Notepad++所提供的断点功能,来记录。
autoload方法的第55-57行,用来判断LOAD_CLASS这个全局变量中是否存在该类的下标,LOAD_CLASS在我们之前进行通读时,所遇见过。如果存在类的下标则自动包含直接失效。第58-85行中,58行先将类名的最左边的””字符进行清除,在61行进行提取类名中最后一个””后的字符串,$namespace截取了namespace部分,$className则截取了类名部分。$filePath将$namespace中的””替换为了系统路径。
第66行随后$filePath直接拼接了$className.php。这个时候我们应该类文件内部是这样进行定义的: