前言 昨晚听了li9hu师傅的代码审计分享,学到了很多操作。 特地写篇文章,以师傅发的一个cms来复习一波。 当然可能复习的过程有所疏漏,希望见谅。 思路代码审计主要有两种方式: 通读全文法:通读全文代码,查找跟踪可控变量。 回溯法:定位危险函数,查找跟踪可控变量。 看师傅昨晚的实际操作过程,大概就是先审计一波入口,然后掏出审计工具先轮一波,然后再逐一的跟踪每个危险函数,查找跟踪是否存在可控的变量,然后再回溯漏洞位置,最后实现利用。 所以,下面我也以这个思路,审计一下师傅发的这个cms。 审计入口一看这个cms,脑壳就想起了某个awd平台内的一套题目,以站长工具网站改编而来的。 一套cms可以分为:单入口类和多入口类。 这套chinaz明显就是单入口类的。 在index.php文件中可以看到首先包含了公共文件和视图文件进来,然后new了一个View类的对象。 接着检测是否以get方式传入page变量,如果有则调用filter方法过滤变量中的数据。最后再调用echoContent方法加载页面。(猜猜方法命名大概就理解了) 跟进filter方法,发现了其内部调用了str_replace方法对.进行置空。从而防止通过目录跳转../方式任意读取文件。 不过这里如果是绝对路径,则可以绕过,调试如下。 跟进echoContent方法,正是对可控的$vId变量中的页面数据进行加载 跟进内部的loadFile方法,正是调用file_get_contents、fopen、fread函数进行页面加载。 页面入口分析到此结束,这个cms的入口大概就是通过传入页面page来实现页面路由。 审计工具代码审计工具,有很多,例如:seay、rips、cobra、phpstorm等等 而我只接触过seay、rips和phpstorm,phpstorm还是最近要做一个后台系统的项目才尝试接触的。 所以,在审计工具的利用上,还是以seay和rips来进行。 1、seay审计自动化审计过后,出来了17个可疑漏洞 接下来需要逐一进行验证。 action.php文件包含当post进入一个page变量时,经过filter的处理,最后利用require_once包含进来。 而filter函数已经知道可以通过绝对路径绕过,在该页面中,page在最后组合了php后缀名,刚好构造利用条件。 利用过程如下: 1.php中为phpinfo页面,可以看到已经包含进来并且执行了代码。 normaliz.php变量覆盖变量覆盖一般有两种类型:extract和$$ 在该页面内,存在$$类型的变量覆盖,同时存在preg_replace函数。 该函数的e模式下,当匹配成功后会造成任意代码执行。(修正符e可把匹配的字符串当作正则表达式执行) 注意,php版本必须在7.0前,才能使用。 故,在漏洞位置内,将$method变量覆盖为e模式,$mail_replacement变量覆盖为目标代码,$source变量构造匹配的字符串,即可完成任意代码执行。 preg_replace($method,$mail_replacement,$source); 回溯数据传递过程,跟踪$post_data变量,发现其在action.php文件中传入 故利用思路就是切换php的版本后,通过action.php的文件包含,包含进来normailz.php,然后构造变量覆盖,达到任意代码执行 转载请注明原文网址:http://www.coolofsoul.com/hjpz/19841.html |