代码审计之如何找到phpcms的代码执行漏洞
概述
PHPCMS是一款网站管理软件。该软件采用模块化开发,支持多种分类方式,使用它可方便实现个性化网站的设计、开发与维护。它支持众多的程序组合,可轻松实现网站平台迁移,并可广泛满足各种规模的网站需求,可靠性高,是一款具备文章、下载、图片、分类信息、影视、商城、采集、财务等众多功能的强大、易用、可扩展的优秀网站管理软件。
——来自百度百科
漏洞详情
最近看了下phpcms,发现一个代码执行漏洞,比较菜,大佬轻喷。简单说下我的思路。先找到漏洞函数 ---> 判断参数是否可控 ---> 定位功能模块
搜一下敏感函数。这里以“eval”为例:
大致浏览一遍,然后发现在/install_package/phpcms/libs/functions/global.func.php
这个文件的289-302行的“string2array”方法里调用了eval函数。如下:
发现string2array
方法的参数可控,看传入的参数,如果参数以“array”字符开头,就执行eval,而且是双引号包裹,根据这个语法,开发者是想把“array(1 => 2,3 => 4)”这种字符串调用eval来转成数组,或者把“{‘1’:’2’,’3’:’4’}”这种JSON格式转成数组。这里主要看第一种情况。找下哪里调用了“string2array”方法。
找到两个地方调用了“string2array”方法,看其中一个地方。在/install_package/phpcms/modules/member/member_model.php
文件的37-102行调用了“string2array”方法。
看下代码逻辑。string2array($model_import)的$model_import来自于@file_get_contents($_FILES['model_import']['tmp_name']),意思是将上传文件的文件内容赋值给$model_import,并传入“string2array”。这里没有经过任何过滤。所以这里可以利用上传文件的内容控制$model_import的值,从而执行代码。
从以上信息得出,漏洞点位于上传文件的地方。根据phpcms的路由构造访问路径:
http://127.0.0.1/phpcms/install_package/index.php?m=member&c=member_model&a=add&pc_hash=*****http://127.0.0.1/phpcms/install_package/index.php?m=content&c=sitemodel&a=import&pc_hash=*****
回到第一步构造payload要求: 文件内容以“array”字符串开头。这里可以自己构造上传包,也可以直接上传构造好的文件。
为了方便,我直接构造了1.txt,内容为“array(1);$b=phpinfo();” ,如下图:
点击“上传“,成功执行命令,另一处同理:
后记
本文主要结合实际简单讲一下代码审计的思路,供新手参考,大佬轻喷。
本文由白帽汇原创,转载请注明 来自白帽汇Nosec:https://nosec.org/home/detail/2120.html
最新评论