对CodeIgniter源代码的安全审计 文件包含漏洞

在一个项目中,我提前拿到了网站的源代码,队里的师傅白盒审出了一个曲折的利用链,现在我再次重现并记录了这个链的挖掘过程。这条链牵涉到经典漏洞,包含:session伪造、任何文件上传、条件竞争、文件包含。每个漏洞都很经典,串在一起变成了bigboom。


前边的叙述:目标网站的使用框架结构是CodeIgniter,这篇文章旨在进行技术研究和思路共享,牵涉到目标网站的信息已经被隐藏,相关代码特征如变量、函数的命名也已被替换,但代码逻辑保存,仍然具有参考价值。找出上传点,检索一遍未发现明显的命令注入、代码注入。相反,找出上传或文件写入的漏洞,主要关注file_put_contentms和back_uploades_files等功能,在某个上传界面/uplaodController/uplaodMethod中,找出以下代码段:代码逻辑非常清晰:

从$_FILES中获取uploadesFile文件,保存上传时的文件名,移动到/tmp目录。


构建一个表格,其中imageFile参数是第一步移动的文件,然后与其他参数一起POST到另一个界面。经典的卸杀驴,删除刚移动的文件。然后即使是不稳定的文件上传点,路径也是/tmp/[上传文件名]。使用场景也是被迫的,让我们思考一下:我们需要一个文件来与上面代码中的unlink操作竞争,在文件被删除之前包含,以达到执行代码的效果。


寻找文件包含,目的是找到可以控制文件路径的包含点。这里找到了一个Meathods类别,包含一个method1方法来满足我们的需求。这部分逻辑也很清楚。is_ajax_rtequest()根据请求头HTTP_X_REQUESTED_WITH的值是否为“XMLHttpRequest”来判断是否是异步请求,否则返回json编码后的空数组。之后的漏洞使用过程中要注意这一点。


从post参数中获取要求的变量,如果没有,从get参数中获取。post()和get()两个函数的具体逻辑是根据$_POST和$_GET获取变量。(支持从post数据中获取参数的特性,可以为我们绕过waf提供更多选择)。获得相应的$class和$method后,isMethodAllowes()检查调用方法是否允许。调用框架结构定义的this->load->model方法加载相应类别。为了避免任何框架结构定义的限制,有必要看看this->load->model的逻辑。

分享: